Attacker's perspective on TeamCity
Компрометация CI/CD и ее последствия.

Вступление
В сегодняшних реалиях, когда приложения становятся все сложнее и сложнее, для их корректной работы необходимо настраивать полноценный цикл их разработки, развертывания и поддержки. Занимаются этим целые команды разработчиков и девопсеров с использованием многочисленных сервисов, позволяющих автоматизировать некоторые процессы. Об одном из таких сервисов мы сегодня и поговорим.
Коротко о TeamCity — за что отвечает и зачем нужен
TeamCity — это CI/CD-сервер: он автоматически собирает код из репозиториев, запускает тесты, собирает артефакты и, при необходимости, деплоит их на различные стенды. Из ключевых компонентов Teamcity можно выделить следующие:
- Сервер (Web UI/API) – хранит конфигурацию проектов, учетные данные, токены, историю сборок, артефакты. По умолчанию "живет" на порту 8111
- Build agents – агенты, выполняющие сборки проектов из исходников. Могут запускать произвольные команды из конфигураций билдов
- VCS Roots – конфигурация подключения к Git/SVN
- Artifacts Storage – место сохранения результатов сборок (jar, deb, бинари)
- Build Configuration / Build Steps – паравметры которые сервер передает агенту для учета при сборке.
Задача такой системы – автоматизация процесса CI/CD – Continuous Integration/Continuous Deployment. Стоит лишь запушить изменения в репозиторий, а Teamcity в автоматическом режиме раскатит обновление по всем стендам. Удобно? Удобно. Но и для атакующих такие цели представляют колоссальный интерес, ведь кто владеет CI – влияет на весь жизненный цикл ПО.
Почему TeamCity интересен атакующему
У столь повышенного интереса есть несколько причин.
- Возможность выполнения произвольного кода – build agents запускают сценарии, переданные им от сервера, то есть компрометация сервера приведет к тому, что агенты выполнят какой угодно код.
- Доступ к секретам. Параметры сборки и VCS конфигурации очень часто содержат токены / ключи / пароли в открытом виде.
- Закрепление – при желании можно настроить CI/CD для вредоносного ПО, обеспечив себе стабильный доступ в инфраструктуру на долгое время вперед.
- Доступ к инфраструктуре – агенты с некорректными правами могут иметь логическую и сетевую доступность до внутренних сервисов (базы данных, API Kubernetes и тд)
Teamcity для атакующих это не просто конвейер – это платформа, позволяющая развить сложную и чрезвычайно опасную атаку, последствия которой могут быть катастрофическими.
Типичные векторы атаки
- Фишинг / компрометация учётки администратора или разработчика — вход под привилегированной учёткой.
- Кража токенов из репозитория конфигураций (например, .teamcity/pipeline-config, secrets.xml) или из VCS Roots.
- Открытый веб-интерфейс / неверные ACL — публично доступный сервер TeamCity.
- Уязвимости в самом TeamCity – от произвольной регистрации администратора до удаленного выполнения кода.
- Компрометация build agent — получение обратного подключения от агента и дальнейший lateral movement.
- Подмена конфигураций через REST API — создать новый build step с вредоносным кодом.
Индикаторы компрометации (IoC) — что смотреть в логах и метриках
- Внезапное создание/редактирование проектов или конфигураций
- Неожиданные build-запуски в нерабочее время / с неизвестных агентов.
- Новые агенты, зарегистрированные с необычных хостов или IP.
- Необычные значения параметров сборки (длинные строки с base64, |, пайпами, обратными кавычками и т.п.).
- Исходящий трафик от агента на неизвестные домены / IP (C2).
- Артефакты, содержащие нехарактерные бинарники или файлы с timestamp/size несоответствиями.
- REST API-запросы на создание токенов/пользователей.
Кейс Metascan
Весной 2025 года сканер обнаружил на одном из серверов клиента на внешнем периметре новый недоверенный порт – 95.

После PTR разведки было получено несколько доменных имен по этому IP-адресу, два из которых привели к Teamcity.

Изучение первого сервиса ни к чему не привело, а вот на втором наши эксперты обнаружили открытую регистрацию без MFA, после чего, зарегистрировав пользователя с username='admin', прошли авторизацию и попали в административную панель сервиса.
Как и предполагалось, сервис поддерживал работу приложения на апекс-домене компании, в конфигураторе мы нашли учетную запись и приватный ключ для доступа к репозиторию с приложением => получили весь его исходный код.
Затем мы создали новый билд и добавили туда вредоносный build step с выполнением системной команды и последующей ее отправкой на наш рефлектор:

Затем, после получения разрешения на эскалацию атаки, установили обратное подключение и увидели, что у пользователя, под которым мы это подключение установили, есть опасная привилегия – SeImpersonatePrivilege:
whoami /priv PRIVILEGES INFORMATION ---------------------- Privilege Name Description State =============================== ========================================= ======== SeIncreaseQuotaPrivilege Adjust memory quotas for a process Disabled SeSecurityPrivilege Manage auditing and security log Disabled SeTakeOwnershipPrivilege Take ownership of files or other objects Disabled SeLoadDriverPrivilege Load and unload device drivers Disabled SeSystemProfilePrivilege Profile system performance Disabled SeSystemtimePrivilege Change the system time Disabled SeProfileSingleProcessPrivilege Profile single process Disabled SeIncreaseBasePriorityPrivilege Increase scheduling priority Disabled SeCreatePagefilePrivilege Create a pagefile Disabled SeBackupPrivilege Back up files and directories Disabled SeRestorePrivilege Restore files and directories Disabled SeShutdownPrivilege Shut down the system Disabled SeDebugPrivilege Debug programs Enabled SeSystemEnvironmentPrivilege Modify firmware environment values Disabled SeChangeNotifyPrivilege Bypass traverse checking Enabled SeRemoteShutdownPrivilege Force shutdown from a remote system Disabled SeUndockPrivilege Remove computer from docking station Disabled SeManageVolumePrivilege Perform volume maintenance tasks Disabled SeImpersonatePrivilege Impersonate a client after authentication Enabled SeCreateGlobalPrivilege Create global objects Enabled SeIncreaseWorkingSetPrivilege Increase a process working set Disabled SeTimeZonePrivilege Change the time zone Disabled SeCreateSymbolicLinkPrivilege Create symbolic links Disabled
Не долго думая, мы повысили привилегии на машине до NT AUTHORITY/SYSTEM, получили полный доступ к хостовой машине сервиса и каково было наше удивление, когда оказалось, что весь деплой выполнялся на той же самой машине, где был расположен сам Teamcity.

Получив привилегированный доступ к этой машине, мы скомпрометировали не только веб-сервер, но и весь CI/CD со всеми остальными его агентами.
Клиент оперативно среагировал и прикрыл доступ к порту в этот же день.
Практические рекомендации
- Обновление и патчинг — поддерживать TeamCity и все его плагины в актуальных версиях.
- Минимизация прав — принцип least privilege для пользователей, сервисных аккаунтов и токенов.
- Секреты вне TeamCity — использовать external secrets manager; не хранить ключи в VCS Roots/params.
- Сегментация агентов — агенты для продакшена в отдельной сети
- Многофакторная аутентификация (MFA) — для UI и API.
- Ограничение API / токенов — короткий TTL и минимальные scopes; аудит создания токенов.
- Лимитирование возможностей билд-скриптов — запрет на загрузку исполняемых компонентов из непроверенных источников; allowlist доменов.
Заключение
Для злоумышленника TeamCity — это золотая жила: один скомпрометированный пользователь или уязвимый агент может дать доступ к исходникам, секретам и каналу для распространения вредоносного кода через сборочную цепочку.
Защитникам важно видеть CI/CD не как «только инструмент разработчика», а как критичный компонент инфраструктуры, требующий тех же мер безопасности, что и базы данных и API-сервисы: сегментация, контроль доступа, надёжное хранение секретов, мониторинг и быстрая ротация ключей.
Metascan позволяет выявлять подозрительные открытые порты и проводить их менеджмент, а наши эксперты вручную проверяют потенциальные уязвимости.
