
Comprueba una lista de URLs contra la vulnerabilidad Log4j CVE-2021-44228
Comprueba de forma multihilo una lista de URLs con peticiones POST y GET en combinación con parámetros.
Muy inspirado en la versión de NortwaveSecurity.
La lista de URLs a comprobar debe tener el siguiente formato (csv):
description,URL,method,parameters
production,example.com/login,POST,"username,password"
staging,example.com/search,GET,"q"
development,example.com/,GETNP,""
Posteriormente, esto ejecutará una petición POST en example.com/login en la que se enviará el siguiente cuerpo sin procesar:
username={jndi:ldap...}&password={jndi:ldap...}
De forma similar, ejecutará la siguiente petición GET: example.com/search?q={jndi:ldap...}.
Alternativamente, puedes especificar GETNP (GET No Parameters, GET sin parámetros) para hacer el GET de la URL con el payload añadido: example.com/new/{jndi:ldap...}.
Además, el payload también se inserta en las cabeceras User-Agent, Referer, X-Forwarded-For, Authentication para aumentar las posibilidades de acierto.
Si quieres comprobar URLs para GET, POST o GETNP, duplica la entrada en el CSV.
Para configurarlo sin ninguna configuración previa, puedes usar https://canarytokens.org/generate y crear un Log4Shell CanaryToken:

Alternativamente, puedes configurar tu propio servidor DNS.
Instala las dependencias usando pip install-r requirements.txt. Edita el script para cambiar la siguiente línea a tu canary token preferido:
usage: log4jcheck.py [-h] -f FILE -u URL [-w WAIT] [-t TIMEOUT] [-p PREFIX] [-q THREADS] [-d DONE]
optional arguments:
-h, --help show this help message and exit
-f FILE, --file FILE The CSV filename containing the URLs
-u URL, --url URL DNS subdomain URL on which th callback is performed
-w WAIT, --wait WAIT Number of seconds to wait before next request (default: 1)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
-p PREFIX, --prefix PREFIX
Type of prefix, see prefixes_injects for options. (default: 0, options 0-3)
-q THREADS, --threads THREADS
Number of threads to distribute the work
-d DONE, --done DONE File where we can keep track of items that are done
Genera la carpeta: /run/logs para enviar los registros a ella. Aquí puedes seguir el progreso, no se enviará nada a stdout.
Ahora el script se puede ejecutar, apuntando el script al CSV creado anteriormente con las URLs a comprobar.
python3 .\log4jcheck.py --file .\urls-example.csv --threads 2 --url "L4J.ujz5sgvgo7xuvn03ft9qrws5w.canarytokens.com/a" -w 0 -t 1
Comprueba si el token se ha activado después de que el script haya terminado. Podrás correlacionar qué aplicación lo activó basándote en el UUID4 generado en combinación con el parámetro inyectado, p. ej.: 40852c3b-2d6b-4bd5-a91f-4416aa730619-username.
Probado contra log4shell-vulnerable-app. Modifica el MainControll.java de la siguiente manera:
package fr.christophetd.log4shell.vulnerableapp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@RestController
public class MainController {
private static final Logger logger = LogManager.getLogger("HelloWorld");
@GetMapping("/")
public String index(@RequestHeader("X-Api-Version") String apiVersion) {
logger.info("Received a request for API version " + apiVersion);
return "Hello, world!";
}
@GetMapping("/test")
public String testGet(@RequestParam String test) {
logger.info("Received a request for test " + test);
return "Test world!";
}
@PostMapping("/test")
public String test(@RequestBody String test) {
logger.info("Received a request for test " + test);
return "Test world!";
}
}
Compila y ejecuta:
gradle bootJar --no-daemon
java -jar .\build\libs\log4shell-vulnerable-app-0.0.1-SNAPSHOT.jar
Ejecuta el log4jcheck con el siguiente archivo urls.csv:
description,URL,method,parameters
test,http://localhost:8080/test,POST,"test"
test,http://localhost:8080/test,GET,"test"
La siguiente información debería aparecer en el registro del canary token:

Se cubren las siguientes cabeceras HTTP:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptPara cada inyección, son posibles los siguientes prefijos JNDI:
jndi:dnsjndi:${lower:l}${lower:d}apjndi:rmijndi:ldapTen en cuenta que el script solo realiza comprobaciones en el: User Agent y en cualquier parámetro que especifiques en la petición POST o GET. Esto provocará falsos negativos en casos en los que sea necesario apuntar a otras cabeceras, campos de entrada omitidos, etcétera, para activar la vulnerabilidad. Siéntete libre de añadir comprobaciones adicionales al script.
Log4jcheck es software de código abierto licenciado bajo la licencia MIT.