Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Die Klasse java.net.URL
implementiert Serializable
, das bedeutet, dass diese Klasse serialisiert werden kann.
Diese Klasse hat ein eigenartiges Verhalten. Aus der Dokumentation: “Zwei Hosts werden als gleichwertig betrachtet, wenn beide Hostnamen in die gleichen IP-Adressen aufgelöst werden können.”
Jedes Mal, wenn ein URL-Objekt irgendeine der Funktionen equals
oder hashCode
aufruft, wird eine DNS-Anfrage gesendet, um die IP-Adresse zu erhalten.
Den Funktionsaufruf hashCode
von einem URL-Objekt auszuführen, ist ziemlich einfach; es reicht aus, dieses Objekt in ein HashMap
einzufügen, das deserialisiert werden soll. Dies liegt daran, dass am Ende der readObject
-Funktion von HashMap
dieser Code ausgeführt wird:
Es wird putVal
mit jedem Wert im HashMap
ausgeführt. Aber relevanter ist der Aufruf von hash
mit jedem Wert. Das ist der Code der hash
-Funktion:
Wie Sie sehen können, wird beim Deserialisieren eines HashMap
die Funktion hash
mit jedem Objekt ausgeführt und während der hash
-Ausführung wird .hashCode()
des Objekts ausgeführt. Daher, wenn Sie ein HashMap
deserialisieren, das ein URL-Objekt enthält, wird das URL-Objekt .hashCode()
ausführen.
Jetzt schauen wir uns den Code von URLObject.hashCode()
an:
Wie Sie sehen können, wenn ein URLObject
.hashCode()
ausführt, wird hashCode(this)
aufgerufen. Eine Fortsetzung sehen Sie im Code dieser Funktion:
Sie können sehen, dass ein getHostAddress
für die Domain ausgeführt wird, was eine DNS-Abfrage auslöst.
Daher kann diese Klasse missbraucht werden, um eine DNS-Abfrage zu starten, um zu demonstrieren, dass Deserialisierung möglich ist, oder sogar um Informationen zu exfiltrieren (Sie können das Ergebnis einer Befehlsausführung als Subdomain anhängen).
Sie finden den URDNS-Payload-Code von ysoserial hier. Um es jedoch einfacher zu machen, wie man es codiert, habe ich mein eigenes PoC erstellt (basierend auf dem von ysoserial):
In der ursprünglichen Idee wurde die Commons Collections-Payload geändert, um eine DNS-Abfrage durchzuführen. Dies war weniger zuverlässig als die vorgeschlagene Methode, aber dies ist der Beitrag: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
Sie können GadgetProbe aus dem Burp Suite App Store (Extender) herunterladen.
GadgetProbe wird versuchen herauszufinden, ob einige Java-Klassen existieren auf der Java-Klasse des Servers, damit Sie wissen können, ob es anfällig für einige bekannte Exploits ist.
GadgetProbe verwendet die gleiche DNS-Payload des vorherigen Abschnitts, aber bevor die DNS-Abfrage ausgeführt wird, wird es versuchen, eine beliebige Klasse zu deserialisieren. Wenn die beliebige Klasse existiert, wird die DNS-Abfrage gesendet und GadgetProbe wird notieren, dass diese Klasse existiert. Wenn die DNS-Anfrage nie gesendet wird, bedeutet dies, dass die beliebige Klasse nicht erfolgreich deserialisiert wurde, also entweder nicht vorhanden ist oder nicht serialisierbar/exploitable ist.
Im GitHub hat GadgetProbe einige Wortlisten mit Java-Klassen, die getestet werden sollen.
Dieser Scanner kann aus dem Burp App Store (Extender) heruntergeladen werden. Die Erweiterung hat passive und aktive Funktionen.
Standardmäßig prüft es passiv alle Anfragen und Antworten, die gesendet werden, um nach Java-serialisierten magischen Bytes zu suchen, und wird eine Warnung über eine Schwachstelle anzeigen, wenn eine gefunden wird:
Manuelles Testen
Sie können eine Anfrage auswählen, mit der rechten Maustaste klicken und Send request to DS - Manual Testing
.
Dann können Sie im Deserialization Scanner Tab --> Manual testing tab den Einsprungspunkt auswählen. Und den Test starten (Wählen Sie den entsprechenden Angriff je nach verwendeter Kodierung).
Auch wenn dies "Manuelles Testen" genannt wird, ist es ziemlich automatisiert. Es wird automatisch überprüfen, ob die Deserialisierung anfällig für irgendeine ysoserial-Payload ist, indem die auf dem Webserver vorhandenen Bibliotheken überprüft werden, und wird die anfälligen hervorheben. Um nach anfälligen Bibliotheken zu suchen, können Sie auswählen, Javas Sleeps, Sleeps über CPU-Verbrauch oder die Verwendung von DNS zu starten, wie zuvor erwähnt.
Exploiting
Sobald Sie eine anfällige Bibliothek identifiziert haben, können Sie die Anfrage an den Exploiting Tab senden. In diesem Tab müssen Sie den Injektionspunkt erneut auswählen, die anfällige Bibliothek angeben, für die Sie eine Payload erstellen möchten, und den Befehl. Drücken Sie dann einfach die entsprechende Angriffs-Taste.
Lassen Sie Ihre Payload etwas wie das Folgende ausführen:
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)