LOG4J Schwachstelle
Ein Java-basiertes Projekt, das zeigt, wie die Schwachstelle CVE-2021-44228 ausgenutzt werden kann.
https://user-images.githubusercontent.com/13152452/147803050-458593e9-4b54-4e1f-ba07-802866b9b43e.mp4
Voraussetzungen
- Ein Linux-basiertes Betriebssystem: Ich habe Ubuntu Desktop 20.10 64 Bit verwendet
- OpenJDK 17.0.1: Zum Bauen des Exploit-Programms. Neuere Versionen könnten ebenfalls funktionieren.
- Oracle Java Development Kit (JDK) 1.8.0_181: Dies ist entscheidend dafür, dass der Exploit funktioniert. Es ist nicht nötig, es zu installieren, aber das Projekt benötigt es im Wurzelverzeichnis entpackt. Das JDK findet man auf der Oracle Java SE 8 Archive Downloads (JDK 8u202 und früher) Seite.
- Apache Maven 3.6.3: Zur Verwaltung von Abhängigkeiten und Erstellung von Jar-Dateien. Neuere Versionen könnten ebenfalls funktionieren.
- Docker 20.10.12: Zur Verwaltung des Containers, der den auszubeutenden Dienst enthält. Neuere Versionen könnten ebenfalls funktionieren.
- Docker-compose 1.29.2: Zur Unterstützung der Orchestrierung der Image-Erstellung sowie der Container-Erstellung, -Ausführung und -Entfernung. Neuere Versionen könnten ebenfalls funktionieren.
- GNU Make 4.3: Dieses Projekt verwendet Makefile zur Überprüfung und Erstellung erforderlicher Dateien. Neuere Versionen könnten ebenfalls funktionieren.
- OpenBSD Netcat (auch nc): Zur Herstellung der Kommunikation mit dem angegriffenen Server. Dieses Paket kann über den Paketmanager Ihrer Linux-Distribution (wie apt) installiert werden.
- (Empfohlen) IntelliJ IDEA Community Edition 2021.3.1: Wenn Sie einen Blick unter die Haube dieser Projekte werfen möchten, empfehle ich die Installation dieser IDE. Auch hier könnten neuere Versionen funktionieren.
Ausführung
- Klonen Sie dieses Repository auf Ihren lokalen Rechner.
- Laden Sie das JDK von der Oracle Java SE 8 Archive Downloads (JDK 8u202 und früher) Seite herunter und entpacken Sie es im Projekt-Wurzelverzeichnis. Belassen Sie es im Verzeichnis
jdk1.8.0_181, das bei der Extraktion erstellt wurde.
- Führen Sie
make all aus, um alle Projekte zu bauen und ein Docker-Image mit dem verwundbaren Dienst zu erstellen.
- Öffnen Sie drei Terminals und führen Sie die folgenden Befehle aus:
- Erstes Terminal:
make start-vulnerable-service, um einen Docker-Container zu starten, der den auszubeutenden Dienst ausführt. Der Dienst ist über Port 8080 der lokalen Maschine erreichbar.
- Zweites Terminal:
make start-nc, um einen TCP-Listener zu starten, der auf die Verbindung mit dem angegriffenen Server wartet.
- Drittes Terminal:
make start-exploiter, um das Programm zu starten, das uns bei der Ausnutzung der Schwachstelle hilft.
- Nach dem Starten des dritten Terminals zeigt das Exploiter-Programm eine URL zum Zugriff an. Fügen Sie diese in Ihren Browser ein, um die Ausnutzung zu starten.
- Wenn alles wie erwartet funktioniert, erhält der Browser keine Antwort und bleibt im Ladezustand hängen.
- Überprüfen Sie nun das zweite Terminal (das, in dem
make start-nc ausgeführt wurde). Möglicherweise haben Sie eine Nachricht wie Connection received on 172.24.0.2 46638 erhalten (IP-Adresse und TCP-Port können von den hier gezeigten abweichen). Dies bedeutet, dass der Exploit funktioniert hat und wir jetzt eine Shell auf dem Server/Docker-Container haben.
- Um sicherzugehen, dass alles wie erwartet verlief, versuchen Sie, den Befehl
whoami auszuführen. Sie erhalten möglicherweise root als Ausgabe.
- Versuchen Sie nun,
cat ../private-directory/my-secret-file.txt auszuführen, um zu sehen, was passiert. 🙂
- Wenn Sie mit dem Server fertig sind, drücken Sie
STRG+C, um die Verbindung zu schließen.
- Sie können auch in den anderen Terminals
STRG+C drücken, um die Prozesse zu unterbrechen.
Wie funktioniert es?
Bevor wir das beantworten, werfen wir einen Blick auf die Prozesse, die im Ablauf erstellt werden.

Docker-Container
Dieser Docker-Container stellt einen einfachen HTTP-Dienst bereit, der GET-Anfragen auf dem Pfad /log mit einem input-Parameter empfängt. Sobald er sie erhält, protokolliert er die Eingabe auf der Konsole.
https://user-images.githubusercontent.com/13152452/147826880-8ee10391-bcb7-46d3-8d69-2f7ddb4a7b37.mp4
Um die Schwachstelle auszunutzen, sind einige spezifische Konfigurationen erforderlich:
- Die Java-Runtime-Umgebung (JRE), die zum Ausführen des Dienstes verwendet wird, ist Version
1.8.0_181. Dies ist notwendig, um das Laden einer Java-Klasse von einem externen Dienst zu ermöglichen.
- Die Java-Projektabhängigkeiten müssen stark modifiziert werden, um das standardmäßige
spring-boot-starter-logging:2.6.1 durch spring-boot-starter-log4j2:2.6.1 zu ersetzen. Letzteres bringt log4j-core:2.14.1 in das Projekt, eine Version, die für CVE-2021-44228 anfällig ist.

- Die Dienst-Jar-Datei wurde mit dem Java-Compiler in Version
1.8.0_181 erstellt.
Netcat (nc) Programm
Hier gibt es keine großen Erklärungen oder Anpassungen. Dies ist ein einfaches Programm zum Lesen und Schreiben von Daten über die TCP- und UDP-Protokolle. Wir werden es verwenden, um auf eingehende TCP-Verbindungen auf Port 9001 zu lauschen (etwas anderes wird diese Verbindung für uns auf der Serverseite öffnen. 😉).
Sobald die Verbindung hergestellt ist, werden alle eingehenden Daten auf der Konsole ausgegeben. Auch alle geschriebenen Eingaben werden über diese Verbindung gesendet.
Exploiter
Hier beginnt der Spaß!
Dieses Programm kapselt mehrere Schritte, die zur Ausnutzung der Schwachstelle erforderlich sind. Lassen Sie es uns aufschlüsseln:
Ausführungsargumente
Um dieses Programm auszuführen, müssen wir drei Parameter angeben:
- HTTP-Server und Netcat IP-Adresse/Host: Um die Schwachstelle auszunutzen, benötigen wir die IP-Adresse des HTTP-Servers relativ zum verwundbaren Dienst, damit unsere LDAP-Antwort ihn umleiten kann, um die kompilierte Java-Klasse darüber herunterzuladen. Sie wird auch von der Java-Klasse selbst verwendet, um eine TCP-Verbindung mit Netcat zu öffnen (oben erklärt).
- HTTP-Server-Port: Der Port, an dem der für das Senden der kompilierten Java-Klasse zuständige HTTP-Server Verbindungen akzeptiert. Er wird auch mit der LDAP-Antwort gesendet, um den Port mitzuteilen, von dem die kompilierte Java-Klasse heruntergeladen wird.
- Netcat-Port: Der Port, an dem Netcat auf Verbindungen lauscht. Er wird von der kompilierten Java-Klasse verwendet, um eine TCP-Verbindung mit Netcat zu öffnen.
Exploit Java-Klasse
Sobald das Programm startet, schreibt es einen Java-Code basierend auf einer Vorlage. Diese Vorlage erfordert zwei Argumente: die Netcat-IP-Adresse und den Port.