
Ein Skript, das nach verwundbaren Log4j-Systemen (CVE-2021-44228) sucht, indem es den Payload in gängige HTTP-Header injiziert.
Am Freitag, den 10. Dezember 2021, wurde ein neuer Proof-of-Concept 1 veröffentlicht, der eine Schwachstelle zur Remote-Code-Ausführung (RCE) in der Java-Bibliothek „log4j“ 2 betrifft. Diese Schwachstelle wurde den Entwicklern der Software nicht im Voraus offengelegt. Die Schwachstelle wird als CVE-2021-44228 3 verfolgt. Weitere Informationen zur Schwachstelle finden Sie in der Northwave Threat Response 4.
Northwave hat ein Testskript erstellt, das anfällige Systeme prüft, indem der Payload in gängige HTTP-Header und als Teil einer HTTP-GET-Anfrage injiziert wird. Anfällige Systeme werden erkannt, indem auf eingehende DNS-Anfragen gelauscht wird, die eine speziell für das Ziel erstellte UUID enthalten. Indem wir auf eingehende DNS-Anfragen lauschen, anstatt (beispielsweise) einen LDAP-Server bereitzustellen, erhöhen wir die Wahrscheinlichkeit, dass anfällige Systeme erkannt werden können, die eine Filterung des ausgehenden Datenverkehrs eingerichtet haben. In der Praxis ist ausgehendes DNS oft erlaubt. Es wird eine hohe Rate an falsch-negativen Ergebnissen erwartet; bitte lesen Sie den Haftungsausschluss.
Die folgenden HTTP-Header werden abgedeckt:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptFür jede Injektion werden die folgenden JNDI-Präfixe geprüft:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}apBeachten Sie, dass das Skript nur zwei spezifische Prüfungen durchführt: HTTP-Header und HTTP-GET-Anfrage. Dies führt zu falsch-negativen Ergebnissen in Fällen, in denen andere Header, bestimmte Eingabefelder usw. gezielt angesprochen werden müssen, um die Schwachstelle auszulösen. Dies ist sehr wahrscheinlich.
WICHTIG: Wenn der Checker „keine Schwachstelle erkannt“ zurückgibt, führen Sie die Dateisystemprüfungen durch, wie in der Northwave Threat Response 4 beschrieben. Nur den Checker auszuführen reicht nicht aus, um festzustellen, ob ein System anfällig ist oder nicht.
Zuerst benötigen wir eine Subdomain, die wir zum Empfangen eingehender DNS-Anfragen verwenden können. In diesem Fall verwenden wir die Zone log4jdnsreq.northwave.nl und stellen unser Skript auf log4jchecker.northwave.nl bereit. Konfigurieren Sie einen DNS-Eintrag wie folgt:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
Wir richten nun einen BIND-DNS-Server auf einem Debian-System mit apt install bind9 ein und fügen der Datei /etc/bind/named.conf.options Folgendes hinzu:
recursion no;
allow-transfer { none; };
Dies deaktiviert die Rekursion, da wir keinen offenen DNS-Server betreiben möchten. Konfigurieren Sie das Logging in /etc/bind/named.conf.local, indem Sie die folgende Konfiguration hinzufügen:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
Vergessen Sie nicht, BIND mit systemctl restart bind9 neu zu starten. Prüfen Sie, ob das Logging funktioniert, indem Sie eine DNS-Abfrage für xyz.log4jdnsreq.northwave.nl durchführen. Eine oder mehrere Abfragen sollten in /var/log/named/query.log erscheinen.
Es ist wichtig zu überprüfen, dass Nameserver-Abfragen tatsächlich protokolliert werden. Dieses Skript kann anfällige Websites nicht erkennen, es sei denn, Ihre Nameserver-Konfiguration protokolliert Anfragen.
Testen Sie Ihren Server, indem Sie eine Testabfrage durchführen (idealerweise von einem anderen Rechner):
dig test.log4jchecker.northwave.nl
Sie sollten keine Antwort erwarten, aber Sie sollten einen Eintrag in der Logdatei erwarten (cat /var/log/named/query.log). Dieser Eintrag könnte ähnlich aussehen wie:
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)
Fahren Sie nicht fort, es sei denn, eine Antwort ist in den Logs sichtbar. Ohne diese wird das Skript keine Schwachstellen erkennen.
Installieren Sie alle Python-Abhängigkeiten mit pip install -r requirements.txt. Bearbeiten Sie das Skript, um die folgende Zeile in die von Ihnen konfigurierte DNS-Zone zu ändern:
HOSTNAME = "log4jdnsreq.northwave.nl"
Sie können das Skript nun ausführen, indem Sie eine einzelne URL mit dem Parameter -u oder eine Liste von URLs mit dem Parameter -l angeben:
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)
Die letzte Zeile der Ausgabe zeigt, ob das System als anfällig erkannt wurde:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
Falls keine Schwachstelle erkannt wurde, führen Sie die Dateisystemprüfungen durch, wie in der Northwave Threat Response 4 beschrieben. Auch hier gilt: Nur den Checker auszuführen reicht nicht aus, um festzustellen, ob ein System anfällig ist oder nicht.
Log4jcheck ist Open-Source-Software, die unter der MIT-Lizenz lizenziert ist.