Зловживання GitLab CI Runners як командно-контрольної інфраструктури
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Стаття описує прототип під назвою GitRunner C2, який перетворює легітимні, цифрово підписані бінарні файли GitLab CI runner на рамкову систему командно-контроль (C2). Встановлюючи виконавців як служби Windows, зловмисник може виконувати довільні команди PowerShell і ексфільтрувати дані через вбудовану інфраструктуру GitLab. Оскільки трафік використовує вихідний HTTPS на gitlab.com, активність може змішатися зі звичайними комунікаціями розробників.
Розслідування
Дослідник продемонстрував повний ланцюг атаки, починаючи із запису через підвищену PowerShell однолінійну команду і завершуючи інтерактивним виконанням команд. Розслідування покладалося на журнали Sysmon і PowerShell Operational для фіксації створення процесів, змін реєстру та виконаних команд через Script Block Logging. Дослідження показало, що легітимна поведінка runner’а може допомогти уникнути традиційних EDR та на мережеву детекцію.
Запобігання
Захищаючі мають стежити за ново встановленими службами Windows з незвичними назвами або службами, запущеними з нестандартних шляхів файлів. Увімкнення PowerShell Script Block Logging є необхідним для видимості команд, виконаних через runner. Організації також мають обмежити осіб, які можуть встановлювати служби, та відслідковувати підозрілий вихідний HTTPS трафік до GitLab з кінцевих точок, які не використовуються для розробки.
Відповідь
Якщо ця активність виявлена, негайно ізолюйте уражену кінцеву точку, щоб зупинити подальшу командно-контрольну комунікацію. Відкличте всі Персональні Доступні Токени GitLab і токени реєстрації runner’а, пов’язані з компрометованим середовищем. Дослідники мають потім переглянути журнали PowerShell і журнали подій Windows, щоб визначити обсяг виконаних команд і будь-яку результативну ексфільтрацію даних.
"flowchart TD step_ingress["T1105 u2013 Трансфер інструментів: Завантаження легітимного gitlab-runner-windows-amd64.exe через PowerShell із S3"] step_persistence["T1543.003 u2013 Створення або зміна системного процесу: Служба Windows: Встановлення GitLab runner як рідної служби Windows для збереження"] rules_for_persistence("<b>Назва правила</b>: Підозрілий шлях до службового бінарного файлу (через систему)<br/><b>ID правила</b>: 780e6396-d9f4-42b2-8d73-89918e2dab16") step_trust_subversion["T1553.002 u2013 Підрив управління довірою: Підписання коду: Використання цифрово підписаного бінарного файлу GitLab для уникнення виявлення"] step_execution["T1059.003 u2013 Командний і скриптовий інтерпретатор: Windows Command Shell: Виконання командних корисних навантажень через змінні CI, використовуючи ejecutor shell"] step_c2["T1071 u2013 Протокол прикладного рівня: Використання HTTPS (порт 443) для інфраструктури GitLab як ретранслятора C2"] step_exfiltration["T1567.001 u2013 Витік через веб-сервіс: Витік в репозиторій коду: Переміщення файлів через артефакти GitLab і реєстр загального пакету"] step_ingress –>|призводить до| step_persistence step_persistence –>|дозволяє| step_trust_subversion step_persistence -.->|виявлено через| rules_for_persistence step_trust_subversion –>|потім| step_execution step_execution –>|використовує| step_c2 step_c2 –>|призводить до| step_exfiltration "
Потік атаки
Виявлення
Можливість виконання через приховані командні лінії PowerShell (через cmdline)
Прогляд
Можливе виконання GitRunner C2 (через powershell)
Прогляд
Можливе створення запланованого завдання (через powershell)
Прогляд
Можливе створення запланованого завдання з використанням Powershell (через powershell)
Прогляд
Операції із зображеннями служб від рідкісного процесу (через registry_event)
Прогляд
Підозрілий шлях до службового бінарного файлу (через систему)
Прогляд
Логування блокування скриптів PowerShell, яке вказує на можливе зловживання GitLab Runner [Windows PowerShell]
Прогляд
Ухилення від виявлення службою PowerShell GitLab Runner [Windows Sysmon]
Прогляд
Виконання симуляції
Попередня умова: Повинна бути пройдена телеметрія та перевірка бази.
Обґрунтування: У цьому розділі детально описується точне виконання техніки противника (TTP), розробленої для спрацьовування правила виявлення. Команди та наратив МАЮТЬ безпосередньо відображати ідентифіковані тактики, методи та процедури і бути спрямованими на створення точної телеметрії, яку очікує логіка виявлення. Абстрактні або непов’язані приклади призведуть до помилкової діагностики.
-
Атакований наратив і команди: Противник отримав початковий доступ і має намір встановити стійкий канал командного і контрольного управління (C2). Замість використання відомого шкідливого ПЗ, вони завантажують легітимний
gitlab-runner-windows-amd64.exe, щоб змішатися з активністю DevOps. Вони використовують PowerShell, щоб скинути файл у тимчасову директорію, а потім зареєструвати його як службу Windows з назвою “gitlab-runner”. Цей метод спрямований на експлуатацію довіреного характеру інструментів CI/CD для обходу традиційної перевірки безпеки. -
Скрипт регресійного тесту:
# Симуляція встановлення GitLab Runner для перевірки виявлення $ErrorActionPreference = "Stop" # 1. Визначте шляхи та імена, щоб точно відповідати логіці виявлення $TargetDir = "C:WindowsTemp" $BinaryName = "gitlab-runner-windows-amd64.exe" $BinaryPath = Join-Path $TargetDir $BinaryName $ServiceName = "gitlab-runner" Write-Host "[+] Початок симуляції: Встановлення $BinaryName" # 2. Симуляція створення файлу (ідентифікатор події Sysmon ID 11) # У реальній атаці це було б веб-завантаженням. Тут ми створюємо підробний файл із специфічною назвою. New-Item -Path $BinaryPath -ItemType File -Force | Out-Null Write-Host "[+] Створено файл: $BinaryPath (спрацьовує Event ID 11)" # 3. Симуляція встановлення реєстру служби (ідентифікатор події Sysmon ID 13) # Створення шляху до служби в реєстрі для виклику виявлення ImagePath. $RegPath = "HKLM:SYSTEMCurrentControlSetServices$ServiceName" New-Item -Path $RegPath -Force | Out-Null Set-ItemProperty -Path $RegPath -Name "ImagePath" -Value $BinaryPath Write-Host "[+] Створено ключ реєстру та ImagePath: $RegPath (спрацьовує Event ID 13)" Write-Host "[+] Симуляція завершена. Перевірте SIEM на наявність сповіщень." -
Команди очищення:
# Очистіть артефакти симуляції $TargetDir = "C:WindowsTemp" $BinaryName = "gitlab-runner-windows-amd64.exe" $BinaryPath = Join-Path $TargetDir $BinaryName $ServiceName = "gitlab-runner" Remove-Item -Path $BinaryPath -Force -ErrorAction SilentlyContinue Remove-Item -Path "HKLM:SYSTEMCurrentControlSetServices$ServiceName" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "[+] Очищення завершено."