Attacker's perspective on TeamCity

Компрометация CI/CD и ее последствия.

Дата выхода: Время прочтения статьи:
Attacker's perspective on TeamCity

Вступление

В сегодняшних реалиях, когда приложения становятся все сложнее и сложнее, для их корректной работы необходимо настраивать полноценный цикл их разработки, развертывания и поддержки. Занимаются этим целые команды разработчиков и девопсеров с использованием многочисленных сервисов, позволяющих автоматизировать некоторые процессы. Об одном из таких сервисов мы сегодня и поговорим.

Коротко о 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 интересен атакующему

У столь повышенного интереса есть несколько причин.

  1. Возможность выполнения произвольного кода – build agents запускают сценарии, переданные им от сервера, то есть компрометация сервера приведет к тому, что агенты выполнят какой угодно код.
  2. Доступ к секретам. Параметры сборки и VCS конфигурации очень часто содержат токены / ключи / пароли в открытом виде.
  3. Закрепление – при желании можно настроить CI/CD для вредоносного ПО, обеспечив себе стабильный доступ в инфраструктуру на долгое время вперед.
  4. Доступ к инфраструктуре – агенты с некорректными правами могут иметь логическую и сетевую доступность до внутренних сервисов (базы данных, API Kubernetes и тд)

Teamcity для атакующих это не просто конвейер – это платформа, позволяющая развить сложную и чрезвычайно опасную атаку, последствия которой могут быть катастрофическими.

Типичные векторы атаки

  1. Фишинг / компрометация учётки администратора или разработчика — вход под привилегированной учёткой.
  2. Кража токенов из репозитория конфигураций (например, .teamcity/pipeline-config, secrets.xml) или из VCS Roots.
  3. Открытый веб-интерфейс / неверные ACL — публично доступный сервер TeamCity.
  4. Уязвимости в самом TeamCity – от произвольной регистрации администратора до удаленного выполнения кода.
  5. Компрометация build agent — получение обратного подключения от агента и дальнейший lateral movement.
  6. Подмена конфигураций через REST API — создать новый build step с вредоносным кодом.

Индикаторы компрометации (IoC) — что смотреть в логах и метриках

  1. Внезапное создание/редактирование проектов или конфигураций
  2. Неожиданные build-запуски в нерабочее время / с неизвестных агентов.
  3. Новые агенты, зарегистрированные с необычных хостов или IP.
  4. Необычные значения параметров сборки (длинные строки с base64, |, пайпами, обратными кавычками и т.п.).
  5. Исходящий трафик от агента на неизвестные домены / IP (C2).
  6. Артефакты, содержащие нехарактерные бинарники или файлы с timestamp/size несоответствиями.
  7. REST API-запросы на создание токенов/пользователей.

Кейс Metascan

Весной 2025 года сканер обнаружил на одном из серверов клиента на внешнем периметре новый недоверенный порт – 95.

228a9609-d6fe-4a64-af82-c60a663214f4.png

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

5b9b4b4a-9379-4320-a247-6b18ccaababd.jpeg

Изучение первого сервиса ни к чему не привело, а вот на втором наши эксперты обнаружили открытую регистрацию без MFA, после чего, зарегистрировав пользователя с username='admin', прошли авторизацию и попали в административную панель сервиса.

Как и предполагалось, сервис поддерживал работу приложения на апекс-домене компании, в конфигураторе мы нашли учетную запись и приватный ключ для доступа к репозиторию с приложением => получили весь его исходный код.

Затем мы создали новый билд и добавили туда вредоносный build step с выполнением системной команды и последующей ее отправкой на наш рефлектор:

3f6312b7-8351-4166-b508-f5f7b195d9dc.png

Затем, после получения разрешения на эскалацию атаки, установили обратное подключение и увидели, что у пользователя, под которым мы это подключение установили, есть опасная привилегия – 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.

74895cb1-eea2-497a-9ea6-0e800fe781f1.jpeg

Получив привилегированный доступ к этой машине, мы скомпрометировали не только веб-сервер, но и весь CI/CD со всеми остальными его агентами.

Клиент оперативно среагировал и прикрыл доступ к порту в этот же день.

Практические рекомендации

  1. Обновление и патчинг — поддерживать TeamCity и все его плагины в актуальных версиях.
  2. Минимизация прав — принцип least privilege для пользователей, сервисных аккаунтов и токенов.
  3. Секреты вне TeamCity — использовать external secrets manager; не хранить ключи в VCS Roots/params.
  4. Сегментация агентов — агенты для продакшена в отдельной сети
  5. Многофакторная аутентификация (MFA) — для UI и API.
  6. Ограничение API / токенов — короткий TTL и минимальные scopes; аудит создания токенов.
  7. Лимитирование возможностей билд-скриптов — запрет на загрузку исполняемых компонентов из непроверенных источников; allowlist доменов.

Заключение

Для злоумышленника TeamCity — это золотая жила: один скомпрометированный пользователь или уязвимый агент может дать доступ к исходникам, секретам и каналу для распространения вредоносного кода через сборочную цепочку.

Защитникам важно видеть CI/CD не как «только инструмент разработчика», а как критичный компонент инфраструктуры, требующий тех же мер безопасности, что и базы данных и API-сервисы: сегментация, контроль доступа, надёжное хранение секретов, мониторинг и быстрая ротация ключей.

Metascan позволяет выявлять подозрительные открытые порты и проводить их менеджмент, а наши эксперты вручную проверяют потенциальные уязвимости.

7185ebe5-2cfd-4378-9fdc-6ec41f95c67d.png
 
 
Attacker's perspective on TeamCity | METASCAN