This post is also available in: English (英語)

概要

脅威検知を回避したい脅威アクターは、主要なポストエクスプロイトツールとしてCobalt Strikeをかわらず愛用しています。このためCobalt StrikeのTeam Serverを特定する新たな技術が求められています。これに向けて、本稿ではアクティブプローブとネットワークフィンガープリント技術を活用する新技術を解説します。この技術はそれまでの受け身のトラフィック検出アプローチとは根本的に異なるものです。

敵対的フレームワークツールCobalt Strikeを取り上げたUnit 42ブログシリーズでは、HTTPトランザクションのエンコード技術や暗号化技術について解説しました。具体的には、Cobalt StrikeのBeaconコマンド&コントロール(C2)通信が、防御側の検知を回避するために使用する高度で柔軟なトラフィックプロファイルを分析しました。

Beaconインプラントは、Team Serverと呼ばれる攻撃者の管理下にあるアプリケーションと通信します。攻撃者は、Team ServerとBeaconのC2トラフィックを使うことで、簡単かつ効果的に、悪意のあるトラフィックを通常の良性トラフィックに偽装できます。これを可能にするのが、モジュラー方式で拡張可能なドメイン固有言語、Malleable C2です。

レッドチームやブルーチームのメンバー、ペンテスター、エシカルハッカー(ホワイトハッカー)など、前もって許可を受けている敵対者役のほか、脅威アクターも組み込み版やカスタマイズ版のMalleable C2プロファイルを利用できます。これらのプロファイルにより、従来型ファイアウォールの脅威対策など、旧来の防御策を継続して開発することが非常に難しくなります。

これまでのアプローチでは、Beaconバイナリが被害システムにインプラントされ、これが攻撃者の管理下にあるサーバーにPhone Home通信を行おうとしたときにのみ、Team Serverを検出することができました。本稿で紹介する新技術は、被害システムから実際にC2接続が開始される前に、野生(in-the-wild)のTeam Serverをプロアクティブに検出できます。

本稿では以下を解説します。

  • 特別に細工されたHTTPリクエストを受信した際、Team Serverはどのように振る舞うか
  • どのようなネットワークフィンガープリントをどの程度の確度で推論できるか
  • Beaconと野生で見られたTeam Serverと間の悪意あるC2通信の詳細はどのようなものか

パロアルトネットワークスのお客様は、以下の方法でCobalt Strike BeaconおよびTeam Server C2通信からの保護と緩和を受けています。

  • 脅威防御サブスクリプションを有効にした次世代ファイアウォール(NGFW)は、Cobalt StrikeによるHTTPのC2リクエストのほか、デフォルトプロファイルのBase64エンコーディング設定でマスキングされたレスポンスを識別・ブロックします(シグネチャ86445、86446)。
  • 高度な脅威防御サブスクリプションを有効にした次世代ファイアウォール(NGFW)は、カスタムプロファイルで生成されたCobalt StrikeによるHTTPのC2リクエストを識別・ブロックします。
  • WildFireCortex XDRはCobalt Strike Beaconのバイナリを識別・ブロックします。
  • Cortex XSOAR のレスポンス パックとプレイブックは緩和プロセスを自動化します。
  • Cortex XDR は関連するエクスプロイト試行を報告します。
  • Advanced URL Filtering には、悪意のある URL と IP アドレスを追加済みです。
  • 侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらのフォームからお問い合わせください(ご相談は弊社製品のお客様には限定されません)。
関連する Unit 42 のトピック Cobalt Strike, C2, Tutorials

プロービングとフィンガープリント照合技術

Cobalt Strike Team Server (別名CS Team Server)は、Beaconとそのオペレータのための集中管理用C2アプリケーションです。Team Serverには、クライアントからの接続受け付けや、Beaconインプラントへのリモート コマンド オーケストレーション、UI管理などのさまざまな機能があります。

Cobalt Strikeトラフィックに対する高度な脅威防御のインライン深層学習検出研究を行うなかで、私たちは、悪質であることが疑われるインターネット上のTeam Serverに対し、偽造C2リクエストを送信する実験を開始しました。攻撃者の管理下にあるTeam Serverからのレスポンスを分析することで、これまでは検出できなかったCobalt Strike Team Serverを、攻撃の発生前に分類できる技術を複数開発しました。

以下ではこの識別技術に関する知見を解説します。

HTTP/HTTPS OPTIONSのリクエストおよびレスポンスのフィンガープリントに対するアクティブプロービング

Team ServerはHTTPサーバーを実行するLinuxプログラムで、構成によりさまざまなHTTPリクエストに応答できます。HTTPのOPTIONSメソッドを指定したリクエストを受信すると、このサーバーはHTTP ステータスコード200Content-Length: 0を返します。

図1はTeam ServerへのHTTPリクエストとレスポンスを示しています。HTTPのOPTIONSメソッドに指定されたURIは無視されます(URIが何であっても同じレスポンスが返される)。

Team ServerへのHTTP OPTIONSリクエストとHTTP 200レスポンスを示した画像
図 1. HTTP OPTIONSリクエストとHTTP 200のレスポンス

HTTP/HTTPS GETのリクエストとレスポンスのフィンガープリント

Team Serverが起動すると、HTTPサーバーは特定のURIを公開します。図2はそのURIの一覧です。

プロファイルにset host_stage "false";オプションが設定されている場合、stagerstager64のURLはマスクされます。URIがスラッシュ(/)で始まっている場合、このHTTPサーバーはHTTP ステータスコード404を返します。

Team ServerからのURIの一覧を示す画像で、関連するポート番号(80)、タイプ(ビーコン)、説明が含まれています。
図 2. Team ServerからのURI一覧
Stager URIへのリクエスト

ユーザーがTeam Serverに以下のHTTPリクエストを送信すると、Team Serverは32ビットのBeaconバイナリをクライアントに返します。図3にHTTPリクエストとレスポンスを示します。URIのパスの先頭にスラッシュ(/)がないことに注目してください。

この画像は32ビットBeaconペイロードのHTTP GETリクエストとレスポンスを示しています。
図 3. 32ビットBeaconペイロードのHTTP GETリクエストとレスポンス
Stager64 URIへのリクエスト

64ビットのBeaconペイロードを受信するには、ユーザーがURI stager64へのHTTP GETリクエストを送信する必要があります。図4は64ビットのBeaconペイロードのHTTPリクエストとレスポンスを示しています。

この画像は64ビットBeaconペイロードのHTTP GETリクエストとレスポンスを示しています。
図 4. 64ビットBeaconペイロードのHTTP GETリクエストとレスポンス
Beacon.http-get URIへのリクエスト

Malleable C2プロファイルに特定のプリセットURIパスを設定すると静的データを提供できます。ユーザーがURI beacon.http-getGETリクエストを送信すると、Team Server はプロファイルに指定されているデータで応答します。具体的にはhttp-get設定のserverタグ内のoutputのセクションを送信します。

出力セクションにコマンドprint;だけが含まれている場合、Team Serverは HTTP ステータスコード200Content-Length: 0で応答します。図5にデフォルトプロファイルでのHTTPリクエストとレスポンスを示します。

この画像はデフォルトプロファイルでのHTTPリクエストとレスポンスです。
図 5. デフォルトプロファイルでのHTTPリクエストとレスポンス

Team ServerがMalleable C2のGmailプロファイルで初期化された場合、Team Serverは上記で示した静的データで応答します。このプロファイルの場合、beacon.http-getへのGETリクエストは、JavaScriptペイロードを含むレスポンスになります。

図6は、Malleable C2のGmailプロファイルで初期化されたBeaconのセッションが生成したHTTPリクエストとレスポンスです。

この画像はMalleable C2のGmailプロファイルを使ったHTTPリクエストとレスポンスです。
図 6. Malleable C2のGmailプロファイルで初期化された場合のHTTPリクエストとレスポンス
Beacon.http-post URIへのリクエスト

Team ServerのURI beacon.http-postへのGETリクエストに対する振る舞いは、URI beacon.http-getへのリクエストと同じになります。図7は、デフォルトのMalleable C2プロファイルで初期化されたTeam ServerインスタンスのHTTPリクエストとレスポンスを示したものです。

デフォルトのMalleable C2プロファイルで初期化されたTeam ServerインスタンスのHTTPリクエストとレスポンスを示す画像です。
図 7. デフォルトのMalleable C2プロファイルで初期化されたときのHTTPリクエストとレスポンス

図8はMalleable C2のGmailプロファイルで初期化されたTeam Serverインスタンスにbeacon.http-postGETリクエストが送信された場合のHTTPトランザクションです。

図 8. Malleable C2のGmailプロファイルで初期化された場合のHTTPリクエストとレスポンス
URIチェックサム

Team Serverは、32ビットないし64ビットのBeaconバイナリを提供する条件として、リクエストURIのカスタム1バイトチェックサムを利用します。このリクエストURIのチェックサムを計算するさいはchecksum8というJavaで実装された単純なチェックサムアルゴリズムが使われます。

32ビットのペイロードの場合、このJavaコードはURIチェックサムの結果を整数リテラル92Lと比較します。ここでのLというサフィックスは、long型の整数リテラルであることを表すJavaのシンタックスです(図9参照)。64ビットのペイロードの場合はチェックサムを93Lと比較します。

この画像はURIのチェックサムを確認するコードを表しています。32ビットのペイロードの場合、コードはURIチェックサムの結果を整数リテラル92Lと比較します。64ビットのペイロードの場合はチェックサムを93Lと比較します。
図 9. URIのチェックサムを確認するコード

ユーザーがTeam ServerにGETリクエストを送信すると、そのURIがchecksum8に渡されて、整数リテラル値92L93Lの両方と比較されます。チェックサムがいずれかの条件を満たしていれば、Team Serverは該当するBeaconバイナリのRAWバイトで応答します。

図10はchecksum8の条件を満たす値にとなるURIの例と、Beaconバイナリペイロードを含むTeam Serverの応答の詳細を示したものです。この情報はBeaconの設定スクリプトから抽出したものですが、これらの設定スクリプトからはつねにCobalt Strikeによる接続の防止に有効な脅威インテリジェンスを得られます。

この画像は、checksum8の条件を満たすURIを使った場合のHTTP GETリクエストとレスポンスと、Beaconバイナリのペイロードを含むTeam Serverのレスポンスを示しています。
図 10. checksum8の条件を満たすURIを使った場合のHTTP GETリクエストとレスポンス
ランダムなURI

ユーザーがランダムなURIパスを送信した場合、Team ServerはHTTP ステータスコード404Content-Length: 0で応答します。図11は、ユーザーがrandomURIというURIでGETリクエストを送信したときのTeam ServerからのHTTPレスポンスを示したものです。

この画像は、ランダムなURIパスに対するTeam ServerからのHTTP GETリクエストとレスポンスを示しています。
図 11. ランダムなURIパスに対するHTTP GETリクエストとレスポンス

DNSに対するアクティブプロービング

Cobalt StrikeのDNSリスナーは、BeaconインプラントがひそかにDNSプロトコルを使ってTeam Serverと通信できるようにするものです。DNSベースのBeaconは、DNSTXTAAAAAレコードをタスク監視をはじめとするさまざまな機能に使います。設定はMalleable C2プロファイルのデータチャネルモードで行います。

図12は、ドメインaaa.stage[.]xxTXTレコードを照会するBeaconから発信されたDNSリクエストを示しています。

この画像は、BeaconのDNSリクエストがドメインaaa.stage[.]xxのTXTレコードを照会しているところです。
図 12. TXTレコードを照会するBeaconのDNSリクエスト
このリクエストを受信したTeam Serverは、TXTレコードのレスポンス内にBase64でエンコードされたBeaconバイナリを含めて応答します(図13参照)。

この画像は、BeaconのDNS リスナーのレスポンスに含まれるBase64エンコードされたBeaconバイナリを示しています。
図 13. BeaconのDNS リスナーのレスポンス(Base64でエンコードされたデータ)

野生で見つかったTeam Server

発見されたフィンガープリントや兆候をもとに、オープンソースの脅威インテリジェンスフィード(ZoomEye、Shodan、Censysなど)を使って、まだ検出されていない野生の(in the wild) Cobalt Strike Team Serverを探しました。

以下の表は、2022年9月に弊社が発見した野生のTeam Serverインスタンスに関連するIP/ポートとURIのIoC(侵害の痕跡)の詳細です。Shodanのフィードサービスを使い、潜在的Team ServerのIPアドレスを収集後、32ビットのStagerプローブを送信し、当該のデーモンが実際にIoCにあたるのかをテストしました。対象が期待されるCobalt Strikeレスポンスを返した場合は、netcatでTCP接続を張って、提供されたStagerのバイトをテスト・検証・抽出します(図14参照)。

この画像は、StagerチェックによりTeam ServerのHTTP/HTTPSのプロービングが成功したようすを示しています。
図 14. StagerのチェックでTeam ServerのHTTP/HTTPSのプロービングに成功したところ
IPアドレス:ポート ペイロードの種類 GET-URI POST-URI
43[.]129[.]7[.]189:8080 windows-beacon_http-reverse_http /updates /aircanada/dark.php
117[.]50[.]37[.]182:80 windows-beacon_http-reverse_http /api/x /api/y
42[.]192[.]206[.]174:80 windows-beacon_http-reverse_http /dpixel /submit.php
194[.]37[.]97[.]160:80 windows-beacon_http-reverse_http /cx /submit.php
92[.]222[.]172[.]39:80 windows-beacon_http-reverse_http /ptj /submit.php
79[.]141[.]169[.]220:443 windows-beacon_http-reverse_http /pixel.gif /submit.php

表 1. 野生のTeam Serverインスタンスに関連するIP/ポートとURIのIoC

結論

Cobalt Strikeは侵害後のアクターをエミュレートする強力なツールで、シグネチャベースのネットワーク検知をはじめ、従来の次世代ソリューションをたえず回避しようとしてきます。その場合でも、高度な脅威防御のインライン深層学習モデルやヒューリスティック技術があれば、Cobalt Strike BeaconやTeam ServerのC2通信に対する防御を、実際の侵害が発生する前に提供できます。

本稿で解説したプロービング技術やフィンガープリント技術は効率的で信頼性が高く、野生のCobalt Strikeのインスタンスをきわめて高い確度で特定できます。最新のネットワークセキュリティアプライアンス1台だけだと、Cobalt Strikeのような高機能ツールに包括的に対応しきれないため、ファイアウォール、サンドボックス、エンドポイントエージェント、クラウドベースの機械学習などのセキュリティソリューションを組み合わせることではじめて、高度な脅威アクターによるサイバー攻撃成功をエンドツーエンドで防ぐのに必要なデータを統合できます。

パロアルトネットワークスのお客様は、次の方法でこの種の攻撃からの保護を受けています。

侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、 こちらのフォームからご連絡いただくか、下記の電話番号までお問い合わせください(ご相談は弊社製品のお客様には限定されません)。

  • 北米フリーダイヤル: 866.486.4842 (866.4.UNIT42)
  • EMEA: +31.20.299.3130
  • APAC: +65.6983.8730
  • 日本: (+81) 50-1790-0200

IoC (侵害指標)

Cobalt Strike サンプル

  • 50ea11254f184450a7351d407fbb53c54686ce1e62e99c0a41ee7ee3e505d60c

Cobalt Strike Beacon サンプル

  • /lNj8
    • SHA256ハッシュ:
      • e712d670382ad6f837feeb5a66adb2d0f133481b5db854de0dd4636d7e906a8e

Cobalt Strike Team ServerのIPアドレス

  • 92[.]255[.]85[.]93
  • 43[.]129[.]7[.]189
  • 117[.]50[.]37[.]182
  • 42[.]192[.]206[.]174
  • 194[.]37[.]97[.]160
  • 92[.]222[.]172[.]39
  • 79[.]141[.]169[.]220

追加リソース

Cobalt Strike Training (Cobalt Strikeトレーニング)
Cobalt Strike Malleable C2 Profile (Cobalt Strike Malleable C2プロファイル)
Cobalt Strike Decryption with Known Private Key (Cobalt Strikeを既知の秘密鍵で復号する)
Cobalt Strike解析&チュートリアル: Malleable C2プロファイルでCobalt Strike検出が難しくなる理由
Cobalt Strike解析&チュートリアル: Cobalt Strikeによるメタデータのエンコードとデコード
Cobalt Strike解析&チュートリアル: Cobalt Strikeによるメタデータの暗号化と復号
Cobalt Strike Attack Detection & Defense Technology Overview

Enlarged Image