Fetch the Flag CTF 2022: Logster – Lösungsbericht
10. November 2022
0 Min. LesezeitDanke, dass Sie mit uns Fetch gespielt haben! Glückwunsch an die Tausenden Spielerinnen und Spieler, die bei Fetch the Flag CTF dabei waren. Ein großes Dankeschön auch an die Snyker, die die Challenges entwickelt, getestet und dokumentiert haben!
Wenn Sie bei Snyks Fetch the Flag 2022 dabei waren und nach der Lösung für die Challenge Logster suchen, sind Sie hier richtig. Gehen wir die Lösung gemeinsam durch!
Beginnen wir mit der Erkundungsphase
In dieser Phase identifiziert ein Angreifer ein verwundbares Ziel und untersucht, wie es sich ausnutzen lässt. In unserem Fall erhalten wir einen Link zu einer Website. Für den Einstieg genügt ein einziger Zugangspunkt.

Zuerst prüfen wir den Link und rufen http://logster.c.ctf-snyk.io/ auf. Auf dieser Website können wir eine Website scannen.

Versuchen wir es mit https://www.cnn.com/. Die Header werden angezeigt:

Aus der Challenge-Beschreibung („lookup“) und der Programmiersprache (Java) können wir schließen, dass es sich um Log4Shell handelt.
Starten wir das Tunneling!
Erstellen wir nun einen Express-Webserver, um benutzerdefinierte Header festzulegen, richten einen ngrok-Tunnel ein, um den Server lokal auszuführen, und machen ihn anschließend im Internet erreichbar. Danach scannen wir ihn und sehen uns das Ergebnis an!
Wenn Sie nicht wissen, wie Sie einen Express-Server einrichten, hilft Ihnen für diesen Schritt die offizielle Dokumentation.

Wir richten unseren Express-Server so ein, dass er auf Port 3000 läuft, und setzen mit ('PWN', 'pwn') einen benutzerdefinierten Header.
Starten wir ihn mit dem Befehl node express.js:

Richten wir außerdem mit dem Befehl ngrok http 3000 den ngrok-Tunnel ein. In der offiziellen ngrok-Dokumentation erfahren Sie, wie Sie ihn auf Ihrem Rechner einrichten.

Kopieren Sie den Weiterleitungslink, fügen Sie ihn auf der Website ein und starten Sie den Scan. In der ngrok-Konsole (http://localhost:4040/) sehen wir, dass der Header den Inhalt aus unserer Datei express.js wiedergibt.

Versuchen wir, einen Header mit einer Log4Shell-artigen Payload festzulegen. Öffnen wir wieder unsere Datei express.js und ändern den Header in ('${java:version}', 'pwn'):

Starten Sie den Server neu und führen Sie einen weiteren Scan der Website durch. Wir erhalten einen 500 Internal Server Error. In den Protokollen sehen wir, dass der Headername ein gültiges HTTP-Token sein muss.

Express erlaubt keine ungültigen Header – $ und {} sind keine zulässigen Zeichen. Daher müssen wir diese Einschränkung umgehen. Dazu erstellen wir einen Socket-Server, der bei jeder eingehenden Verbindung eine benutzerdefinierte Antwort zurückgibt.
Der Socket-Server sieht so aus: Er lauscht am Socket und sendet bei jeder Verbindung die Antwort zurück – in diesem Fall einschließlich der Java-Version. Wir versuchen, diesen benutzerdefinierten Header einzuschleusen und prüfen, ob er ausgewertet wird.

Starten wir den Server mit dem Befehl node index.js und ändern den ngrok-Tunnel mit dem Befehl ngrok tcp 3000 in einen TCP-Tunnel. Um die TCP-Tunnelfunktion nutzen zu können, müssen Sie ein Konto bei ngrok erstellen.

Kopieren Sie den Forwarding-Link ohne TCP und fügen Sie ihn auf der Website ein. Setzen Sie am Anfang https:// ein und scannen Sie den Link. Wir sehen, dass der benutzerdefinierte Header ausgewertet wurde. Dabei wurde ein Lookup ausgeführt und die Java-Version zurückgegeben. Der Lookup funktioniert also.

Nun müssen wir einen Log4Shell-Exploit einrichten.
Was ist Log4Shell?
CVE-2021-44228, auch bekannt als Log4Shell, ist eine nicht authentifizierte Remote-Code-Execution-Schwachstelle (RCE), die fast alle Versionen von Apache Log4j 2 betrifft. Am 9. Dezember 2021 verbreitete sich die Nachricht über diese Zero-Day-Schwachstelle in Infosec-Communitys – zusammen mit einem öffentlich verfügbaren Proof of Concept (POC).
Wenn Sie mehr über die Log4Shell-Schwachstelle erfahren möchten, sehen Sie sich unsere kostenlose Lektion auf Snyk Learn an.
Der POC
Für die nächsten Schritte verwenden wir diesen öffentlich verfügbaren POC. Dieses Repository enthält alles, was wir für den Angriff benötigen.
Klonen Sie das Projekt mit Git und wechseln Sie zur Klasse Evil.java. Wir müssen sie anpassen, um die eigentliche Payload für diese Challenge zu erstellen. Wir möchten alle Dateien im Stammverzeichnis auflisten. Dazu erstellen wir ein File-Objekt, rufen eine Dateiliste ab und geben alle Dateinamen aus.

Erstellen wir unser Docker-Image mit folgendem Befehl:
Starten wir den ngrok-TCP-Server mit folgendem Befehl:

Und den ngrok-HTTP-Server mit dem Befehl: ngrok http 8888

Wir müssen den Docker-Container mit folgendem Befehl remote ausführen:

Zuerst müssen wir jedoch den LDAP-Server auf den richtigen Forwarding-Link verweisen lassen. Kopieren Sie den Link des HTTP-Servers, der auf Port 8888 läuft, und fügen Sie ihn ein.
Außerdem benötigen wir die Adresse des TCP-Servers auf Port 9999 in der Socket-Datei index.js. Hier senden wir einen Header mit einer echten Log4Shell-Payload. Wir stellen die zuvor angepasste Evil-Klasse bereit.

Starten wir den Socket-Server mit dem Befehl neu: node index.js
Führen wir diesen Befehl noch einmal aus:

Auf Ihrem Terminal sollte dieselbe Ausgabe erscheinen:

Wenn Sie zur Website zurückkehren, sollten Sie die Dateiliste des Stammverzeichnisses sehen. Und dort ist die Flag!

Wir müssen die Payload ein letztes Mal anpassen, um die Flag anzuzeigen. Kehren wir zur Evil-Klasse zurück. Mit diesem Codeausschnitt können wir die Flag auslesen und den Dateiinhalt ausgeben.

Damit die Änderungen übernommen werden, müssen wir den Docker-Container erneut ausführen. Bei einem weiteren Scan wird der Inhalt der Flag-Datei angezeigt!

Logster – Zusammenfassung
Die Einfachheit dieses Exploits und die weite Verbreitung der Bibliothek haben Sicherheitsexperten seit Bekanntwerden der Schwachstelle in Alarmbereitschaft versetzt. Zunächst wurde empfohlen, auf Version 2.16 zu aktualisieren. Leider wurde dann in dieser Version ein Denial-of-Service-Exploit entdeckt. Empfohlen wird daher ein Upgrade auf Version 2.17.
Ausführliche Empfehlungen zur Behebung finden Sie in unserem Log4Shell-Leitfaden zur Behebung. Dieser wird fortlaufend aktualisiert, sobald neue Informationen verfügbar sind.
Ich hoffe, Ihnen haben Logster und die anderen Challenges beim CTF Spaß gemacht :) Möchten Sie erfahren, wie wir alle anderen Flags gefunden haben? Auf unserer Seite mit den Fetch the Flag-Lösungen erfahren Sie, wie wir dabei vorgegangen sind.
