
Un script que comprueba sistemas vulnerables a Log4j (CVE-2021-44228) mediante la inyección del payload en cabeceras HTTP comunes.
El viernes 10 de diciembre de 2021 se publicó una nueva prueba de concepto 1 que aborda una vulnerabilidad de Ejecución Remota de Código (RCE) en la biblioteca de Java 'log4j' 2. Esta vulnerabilidad no fue divulgada de antemano a los desarrolladores del software. La vulnerabilidad se rastrea como CVE-2021-44228 3. Puede encontrar más información sobre la vulnerabilidad en la Northwave Threat Response 4.
Northwave ha creado un script de comprobación que detecta sistemas vulnerables mediante la inyección del payload en cabeceras HTTP comunes y como parte de una petición HTTP GET. Los sistemas vulnerables se detectan escuchando las peticiones DNS entrantes que contienen un UUID creado específicamente para el objetivo. Al escuchar el DNS entrante en lugar de desplegar (por ejemplo) un servidor LDAP, aumentamos la probabilidad de detectar sistemas vulnerables que tengan filtrado de tráfico saliente. En la práctica, el DNS saliente suele estar permitido. Se espera una alta tasa de falsos negativos; por favor, lea el aviso legal.
Se cubren las siguientes cabeceras HTTP:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptPara cada inyección, se comprueban los siguientes prefijos JNDI:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}apTenga en cuenta que el script solo realiza dos comprobaciones específicas: cabeceras HTTP y petición HTTP GET. Esto provocará falsos negativos en los casos en los que sea necesario atacar otras cabeceras, campos de entrada específicos, etcétera, para desencadenar la vulnerabilidad. Es muy probable que esto ocurra.
IMPORTANTE: En los casos en los que el comprobador devuelva 'no vulnerability detected', proceda con las comprobaciones del sistema de archivos como se describe en la Northwave Threat Response 4. Ejecutar únicamente este comprobador no es suficiente para determinar si un sistema es vulnerable o no.
Primero, necesitamos un subdominio que podamos usar para recibir peticiones DNS entrantes. En este caso usamos la zona log4jdnsreq.northwave.nl y desplegamos nuestro script en log4jchecker.northwave.nl. Configure una entrada DNS de la siguiente manera:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
A continuación, configuramos un servidor DNS BIND en un sistema Debian usando apt install bind9 y añadimos lo siguiente al archivo /etc/bind/named.conf.options:
recursion no;
allow-transfer { none; };
Esto desactiva la recursión, ya que no queremos ejecutar un servidor DNS abierto. Configure el registro en /etc/bind/named.conf.local añadiendo la siguiente configuración:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
No olvide reiniciar BIND usando systemctl restart bind9. Compruebe si el registro funciona realizando una consulta DNS para xyz.log4jdnsreq.northwave.nl. Una o más consultas deberían aparecer en /var/log/named/query.log.
Es importante verificar que las búsquedas del servidor de nombres se registran realmente. Este script no puede detectar sitios vulnerables a menos que la configuración de su servidor de nombres registre las peticiones
Pruebe su servidor realizando una búsqueda de prueba (idealmente desde una máquina diferente):
dig test.log4jchecker.northwave.nl
No debe esperar una respuesta, pero sí debe esperar una entrada en el archivo de registro (cat /var/log/named/query.log). Esta entrada podría tener un aspecto similar a:
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
No continúe a menos que aparezca una respuesta en los registros. Sin ella, el script no detectará vulnerabilidades.
Instale las dependencias de Python usando pip install -r requirements.txt. Edite el script para cambiar la siguiente línea por la zona DNS que haya configurado:
HOSTNAME = "log4jdnsreq.northwave.nl"
Ahora puede ejecutar el script proporcionando una sola URL mediante el parámetro -u o una lista de URLs mediante el parámetro -l:
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST A text file with a list of URLs to check (one url per line)
-u URL, --url URL URL to check (for example: http://yoururl.com)
-w WAIT, --wait WAIT Number of seconds to wait before checking DNS logs (default: 15)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
La última línea de la salida muestra si se ha detectado que el sistema es vulnerable:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
En caso de que no se detecte ninguna vulnerabilidad, continúe con las comprobaciones del sistema de archivos como se describe en la Northwave Threat Response 4. De nuevo, ejecutar únicamente este comprobador no es suficiente para determinar si un sistema es vulnerable o no.
Log4jcheck es un software de código abierto licenciado bajo la licencia MIT.