
Prüft eine Liste von URLs auf die Log4j-Sicherheitslücke CVE-2021-44228
Multithreaded prüft eine Liste von URLs mit POST- und GET-Anfragen in Kombination mit Parametern.
Stark inspiriert von der NortwaveSecurity-Version.
Die Liste der zu prüfenden URLs sollte im folgenden Format (csv) vorliegen:
description,URL,method,parameters
production,example.com/login,POST,"username,password"
staging,example.com/search,GET,"q"
development,example.com/,GETNP,""
Dies wird anschließend eine POST-Anfrage an example.com/login ausführen, wobei der folgende rohe Body gesendet wird:
username={jndi:ldap...}&password={jndi:ldap...}Ebenso wird die folgende GET-Anfrage ausgeführt: example.com/search?q={jndi:ldap...}.
Alternativ kann GETNP (GET ohne Parameter) angegeben werden, um die URL mit dem angehängten Payload als GET aufzurufen: example.com/new/{jndi:ldap...}.
Zusätzlich wird der Payload auch in die Header User-Agent, Referer, X-Forwarded-For, Authentication eingefügt, um die Trefferwahrscheinlichkeit zu erhöhen.
Wenn Sie URLs sowohl für GET, POST als auch GETNP prüfen möchten, duplizieren Sie bitte den Eintrag in der CSV.
Für die Einrichtung ohne Vorkonfigurationen können Sie https://canarytokens.org/generate verwenden und ein Log4Shell-CanaryToken erstellen:

Alternativ können Sie Ihren eigenen DNS-Server einrichten.
Install dependencies by using pip install-r requirements.txt. Bearbeiten Sie das Skript, um die folgende Zeile auf Ihr bevorzugtes Canary-Token zu ändern:
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
Erstellen Sie den Ordner: /run/logs für die Log-Ausgabe. Hier können Sie den Fortschritt verfolgen, es wird nichts auf stdout ausgegeben.
Nun kann das Skript ausgeführt werden, wobei das Skript auf die zuvor erstellte CSV mit den zu prüfenden URLs verweist.
python3 .\log4jcheck.py --file .\urls-example.csv --threads 2 --url "L4J.ujz5sgvgo7xuvn03ft9qrws5w.canarytokens.com/a" -w 0 -t 1
Überprüfen Sie, ob das Token nach Abschluss des Skripts ausgelöst wurde. Sie können korrelieren, welche Anwendung ausgelöst hat, basierend auf der generierten UUID4 in Kombination mit dem injizierten Parameter, z.B.: 40852c3b-2d6b-4bd5-a91f-4416aa730619-username.
Getestet gegen log4shell-vulnerable-app. Ändern Sie MainControll.java wie folgt:
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!";
}
}
Kompilieren und ausführen:
gradle bootJar --no-daemon
java -jar .\build\libs\log4shell-vulnerable-app-0.0.1-SNAPSHOT.jar
Führen Sie log4jcheck mit der folgenden urls.csv-Datei aus:
description,URL,method,parameters
test,http://localhost:8080/test,POST,"test"
test,http://localhost:8080/test,GET,"test"
Die folgenden Informationen sollten im Canary-Token-Log erscheinen:

Die folgenden HTTP-Header werden abgedeckt:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptFür jede Injektion sind die folgenden JNDI-Präfixe möglich:
jndi:dnsjndi:${lower:l}${lower:d}apjndi:rmijndi:ldapBeachten Sie, dass das Skript nur Prüfungen durchführt für: User Agent und alle Parameter, die Sie für die POST- oder GET-Anfrage angeben. Dies kann zu falsch negativen Ergebnissen führen, wenn andere Header, übersehene Eingabefelder usw. angezielt werden müssen, um die Schwachstelle auszulösen. Sie können gerne zusätzliche Prüfungen zum Skript hinzufügen.
Log4jcheck ist quelloffene Software, lizenziert unter der MIT-Lizenz.