Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
DNS-Anfrage bei Deserialisierung
Die Klasse java.net.URL
implementiert Serializable
, das bedeutet, dass diese Klasse serialisiert werden kann.
Diese Klasse hat ein merkwürdiges Verhalten. Aus der Dokumentation: "Zwei Hosts gelten als äquivalent, wenn beide Hostnamen in dieselben IP-Adressen aufgelöst werden können".
Dann wird jedes Mal, wenn ein URL-Objekt eine der Funktionen equals
oder hashCode
aufruft, eine DNS-Anfrage zur IP-Adresse gesendet.
Das Aufrufen der Funktion hashCode
von einem URL-Objekt ist ziemlich einfach, es reicht aus, dieses Objekt in eine HashMap
einzufügen, die deserialisiert wird. Dies liegt daran, dass am Ende der Funktion readObject
von HashMap
dieser Code ausgeführt wird:
Es wird ausgeführt putVal
mit jedem Wert innerhalb des HashMaps
. Aber noch wichtiger ist der Aufruf von hash
mit jedem Wert. Dies ist der Code der hash
-Funktion:
Wie Sie beobachten können, wird beim Deserialisieren einer HashMap
die Funktion hash
mit jedem Objekt ausgeführt und während der Ausführung von hash
wird .hashCode()
des Objekts ausgeführt. Daher wird, wenn Sie eine HashMap
deserialisieren, die ein URL-Objekt enthält, das URL-Objekt .hashCode()
ausführen.
Nun werfen wir einen Blick auf den Code von URLObject.hashCode()
:
Wie Sie sehen können, wenn ein URLObject
.hashCode()
ausführt, wird es als hashCode(this)
bezeichnet. Eine Fortsetzung zeigt den Code dieser Funktion:
Du kannst sehen, dass eine getHostAddress
-Anfrage an die Domain gestellt wird, um eine DNS-Abfrage zu starten.
Daher kann diese Klasse missbraucht werden, um eine DNS-Abfrage zu starten, um zu demonstrieren, dass Deserialisierung möglich ist, oder sogar um Informationen auszuschleusen (du kannst als Subdomain die Ausgabe einer Befehlsausführung anhängen).
URLDNS Payload Code Beispiel
Du kannst den URLDNS Payload-Code von ysoserial hier finden. Allerdings habe ich zur Vereinfachung des Verständnisses, wie man es codiert, meinen eigenen PoC erstellt (basierend auf dem von ysoserial):
Weitere Informationen
In der ursprünglichen Idee wurde das Commons Collections-Payload geändert, um eine DNS-Abfrage durchzuführen. Dies war weniger zuverlässig als die vorgeschlagene Methode, aber hier ist der Beitrag: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
Sie können GadgetProbe aus dem Burp Suite App Store (Extender) herunterladen.
GadgetProbe wird versuchen herauszufinden, ob bestimmte Java-Klassen auf dem Java-Server existieren, damit Sie wissen, ob er anfällig für bekannte Exploits ist.
Wie funktioniert es
GadgetProbe wird dasselbe DNS-Payload des vorherigen Abschnitts verwenden, aber bevor die DNS-Abfrage ausgeführt wird, wird versucht, eine beliebige Klasse zu deserialisieren. Wenn die beliebige Klasse existiert, wird die DNS-Abfrage gesendet und GadgetProbe wird feststellen, dass diese Klasse existiert. Wenn die DNS-Anfrage nie gesendet wird, bedeutet dies, dass die beliebige Klasse nicht erfolgreich deserialisiert wurde, sodass sie entweder nicht vorhanden ist oder nicht serialisierbar/exploitierbar ist.
Im Github gibt es GadgetProbe-Wortlisten mit Java-Klassen, die getestet werden sollen.
Weitere Informationen
Java Deserialisierungs-Scanner
Dieser Scanner kann aus dem Burp App Store (Extender) heruntergeladen werden. Die Erweiterung verfügt über passive und aktive Fähigkeiten.
Passiv
Standardmäßig überprüft er passiv alle gesendeten Anfragen und Antworten auf das Vorhandensein von Java-serialisierten Magic Bytes und gibt eine Warnung aus, wenn welche gefunden werden:
Aktiv
Manuelle Tests
Sie können eine Anfrage auswählen, mit der rechten Maustaste darauf klicken und Anfrage an DS - Manuelle Tests senden
.
Dann können Sie im Deserialisierungs-Scanner-Tab --> Manueller Test-Tab den Einfügepunkt auswählen. Und den Test starten (Wählen Sie den entsprechenden Angriff je nach verwendeter Codierung).
Auch wenn dies als "Manueller Test" bezeichnet wird, ist es ziemlich automatisiert. Es wird automatisch überprüfen, ob die Deserialisierung anfällig für irgendein ysoserial-Payload ist, indem die auf dem Webserver vorhandenen Bibliotheken überprüft werden, und die anfälligen Bibliotheken hervorheben. Um nach anfälligen Bibliotheken zu suchen, können Sie wählen, Javas Sleeps zu starten, Sleeps über CPU-Verbrauch oder die Verwendung von DNS, wie zuvor erwähnt.
Ausnutzen
Sobald Sie eine anfällige Bibliothek identifiziert haben, können Sie die Anfrage an den Ausnutzen-Tab senden. In diesem Tab müssen Sie erneut den Einfügepunkt auswählen, die anfällige Bibliothek angeben, für die Sie ein Payload erstellen möchten, und den Befehl. Drücken Sie dann einfach den entsprechenden Angriffs-Button.
Java Deserialisierungs-DNS-Exfil-Informationen
Lassen Sie Ihr Payload etwas Ähnliches ausführen wie:
Weitere Informationen
Last updated