
Demostración práctica de la vulnerabilidad Log4Shell (CVE-2021-44228)
Este repositorio es exclusivamente para fines educativos y de demostración en el contexto de un trabajo de seminario relacionado con la seguridad. No utilice este código en entornos de producción ni contra sistemas sin permiso explícito. La configuración tiene como objetivo fomentar la conciencia de seguridad y mostrar cómo pueden surgir vulnerabilidades complejas cuando se combinan características aparentemente inofensivas como el registro, la resolución de nombres y la carga dinámica de clases.
El objetivo de este trabajo de seminario es proporcionar una comprensión profunda de la vulnerabilidad Log4Shell (CVE-2021-44228), que se hizo conocida en diciembre de 2021 y fue clasificada como una de las vulnerabilidades de seguridad más críticas de los últimos años. En el trabajo se explican tanto los fundamentos teóricos como se muestra una demostración práctica de la vulnerabilidad.
Para la ilustración práctica de la vulnerabilidad Log4Shell, se ha creado en este repositorio un entorno aislado y contenerizado que reproduce el flujo completo del ataque de manera reproducible. La demostración se basa en tres componentes centrales:
User-Agent de la solicitud HTTP, que los atacantes pueden manipular para explotar la vulnerabilidad.Exploit.class). Al igual que el servidor LDAP, este servidor está bajo el control del atacante.Nota: Se puede encontrar información más detallada sobre la configuración y la ejecución de la demostración en las secciones 4. Estructura del proyecto y configuración y 5. Demo del proyecto.
Log4Shell es el nombre de una vulnerabilidad de seguridad crítica en la biblioteca Java Log4j con la designación CVE-2021-44228. Permite a un atacante ejecutar código arbitrario en un servidor remoto (Remote Code Execution, RCE) con un esfuerzo mínimo.
La vulnerabilidad afecta a Log4j en las versiones 2.0 a 2.14.1 y es tan grave que muchas autoridades de seguridad, incluyendo la BSI (Oficina Federal de Seguridad de la Información de Alemania), la han clasificado con el nivel de riesgo más alto.
Log4Shell es especialmente peligrosa porque...
La causa real radica en una funcionalidad de Log4j que permite cargar contenido dinámico en mensajes de registro a través de las llamadas búsquedas (lookups). En combinación con JNDI (Java Naming and Directory Interface) y el protocolo LDAP (Lightweight Directory Access Protocol), esto permite cargar y ejecutar clases Java maliciosas remotas.
El descubrimiento y la publicación de la vulnerabilidad desencadenaron una ola de seguridad a nivel mundial. Muchos sistemas tuvieron que ser parcheados o desconectados de inmediato. Posteriormente, se dieron a conocer otras vulnerabilidades relacionadas (por ejemplo, CVE-2021-45046), lo que demuestra la profundidad y peligrosidad del problema.
A continuación, se explican en detalle las tecnologías involucradas y su interacción para desarrollar una comprensión más profunda de la vulnerabilidad.
Log4j es una biblioteca creada por Apache para el registro de eventos en aplicaciones Java. El registro (logging) es una herramienta central en el desarrollo de software para monitorear sistemas o analizar errores. Log4j es uno de los frameworks de registro más conocidos y utilizados en el ecosistema Java y se emplea tanto en aplicaciones pequeñas como en grandes sistemas empresariales.
Mientras un programa se ejecuta, ocurren eventos como:
Estos eventos se pueden documentar con logs, generalmente como salida de texto en la consola, en archivos o a través de protocolos de red hacia servidores de registro centralizados. Mediante un registro adecuado, se puede rastrear qué hizo una aplicación y cuándo.
Log4j proporciona una infraestructura flexible y altamente configurable para la generación y procesamiento de mensajes de registro. Entre las funciones centrales se incluyen:
DEBUG, INFO, WARN, ERROR) que permiten controlar el nivel de detalle del registro.Otras características relevantes para este trabajo de seminario se tratan en secciones posteriores, especialmente la funcionalidad de marcadores de posición y la funcionalidad de búsqueda (lookup).
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
public class Example { private static final Logger logger = LogManager.getLogger();