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

概要

本稿は、悪意のある Cobalt Strike インフラに関する最近の調査結果を Unit 42 のリサーチャーが詳しく解説します。また、悪質な Cobalt Strike サンプルもいくつか共有します。これらのサンプルは、ある公開されたコード リポジトリーにホストされていた単一のプロファイルから生成した Malleable C2 構成プロファイルを使っていました。

Cobalt Strike は商用ソフトウェア フレームワークの 1 つです。このフレームワークを使って、セキュリティ専門家 (レッド チームのメンバーなど) はネットワーク環境に潜む攻撃者をシミュレートすることができます。ただし実世界の攻撃では脅威アクターらがクラック版の Cobalt Strike を使い続けています。Beacon と呼ばれるポスト エクスプロイト ペイロードは、Malleable C2 と呼ばれるテキストベースのプロファイルを使って、Beacon の Web トラフィック特性を変化させることで検出を逃れようとします。

Cobalt Strike は防御的サイバーセキュリティ評価に使われていますが、一方では脅威アクターの悪質な目的にも使われ続けています。Cobalt Strike は、その柔軟性と回避性により、組織にとって依然として重大なセキュリティ上の脅威となっています。

パロアルトネットワークスのお客様は、以下の方法で Cobalt Strike Beacon および Team Server C2 通信からより強力に保護されています。

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

関連する Unit 42 のトピック Cobalt Strike, Malleable C2 Profile

サーバーから Beacon、そしてプロファイルへ

Unit 42 は、インターネット上にホストされている Cobalt Strike サーバーを検出するための複数のテクニックを持っており、そのうちのいくつかは Cobalt Strike 分析に関する以前の記事にまとめられています。本稿で取り上げたトラフィック フローと検出は、弊社の高度な脅威保護ソリューション (ATP) である Advanced Threat Prevention がトリガーしたものです。

これらの Cobalt Strike サーバーを発見後、私たちはこの情報をもとに関連 Beacon ファイルを検出しました。これらのサンプルの調査により、以前 Malleable C2 プロファイルに関する別稿で解説した Malleable C2 プロファイルが明らかになりました。

私たちの調査により、これらの Malleable C2 プロファイルは、某ソフトウェア リポジトリーに公開でホストされている単一のサンプルをほとんど流用していることも明らかになりました。

最初のサンプル

最初の Beacon サンプルは ocsp.profile という名前の Malleable C2 プロファイルを流用したものでした。このプロファイルはある公開ソフトウェア リポジトリにホストされていたものです。このプロファイル自体には悪意はなく、公開リポジトリにホストされた数多あるプロファイルのひとつに過ぎませんが、攻撃者らはそうしたプロファイルを悪意のある目的でコピーし、改変します。

最初のサンプルの SHA256 ハッシュ:

  • 1980becd2152f4c29dffbb9dc113524a78f8246d3ba57384caf1738142bb3a07

この Beacon サンプルは、弊社の ATP ソリューションが検出した Cobalt Strike サーバーの 1 つからダウンロードしたものです。攻撃者は通常、Cobalt Strike サーバーから Beacon インスタンスを取得し、侵害した別のプロセス経由で Beacon をメモリーにロードします。この Beacon バイナリーには、Malleable C2 プロファイルの詳細が埋め込まれています。

ここでは、Didier Stevens 氏の Python スクリプト 1768.py を使って Malleable C2 プロファイルの詳細を抽出します。その詳細を以下の表 1 にまとめます。

プロファイル コンポーネントの説明 詳細
実行対象コマンドを取得する GET リクエスト メソッド: GET

Cobalt Strike C2 ドメイン:

  • msupdate.azurefd[.]net
  • o365updater.azureedge[.]net
  • gupdater.bbtecno[.]com
  • teamsupd.azurewebsites[.]net
  • msdn1357.centralus.cloudapp.azure[.]com
  • cupdater.bbtecno[.]com

URI:  /ocsp/

ヘッダー: User-Agent: Microsoft-CryptoAPI/7.0

コマンド実行結果を返す POST リクエスト メソッド: POST

URI: /ocsp/a/

表 1. 最初の Beacon サンプルのプロファイルから抽出したネットワーク情報

以下の図 1 は、Didier Stevens 氏の Python スクリプトで最初の Beacon サンプルを分析した結果の一部を示したものです。このセクションには、サンプルの Malleable C2 プロファイル構成に関連する情報が含まれています。http_get_header のセクションに記載されている通り、被害者のメタデータには小文字の NetBIOS エンコードが使われ、リクエスト URI にアペンドされます。この構成では Accept: */* も HTTP GET リクエスト ヘッダーに追加しています。

画像 1 は Python スクリプトのスクリーンショットです。赤い矢印はヘッダー セクションを指しています。
図 1. 最初の Beacon サンプルのスクリプトに Didier Stevens 氏の 1768.py スクリプトを実行したさいの出力内容

図 2 は、この Beacon インスタンスと Cobalt Strike サーバー間の HTTP C2 トラフィックの TCP ストリームを示したものです。このトラフィックからは、Malleable C2 プロファイルが指定していた通り、GET リクエスト内に小文字の NetBIOS エンコードが確認できます。

画像 2 は、Wireshark TCP ストリームのスクリーンショットで、コマンド & コントロールのトラフィックを示しています。このトラフィックには GET リクエスト、Host (これについては割愛してあります)、Connection、User-Agent 情報が含まれています。
図 2. 最初の Cobalt Strike Beacon サンプルが生成した HTTP C2 トラフィックを TCP ストリームとして確認したところ

このプロファイル構成は、誰でもアクセス可能な公開ソフトウェア リポジトリー上にある ocsp.profile という名前のプロファイルをもとにしているようです。この攻撃者は単に、両方の HTTP リクエスト メソッドについて /oscp//ocsp/ に置換し、User-Agent 文字列の Microsoft-CryptoAPI/6.1Microsoft-CryptoAPI/7.0 に変更していました。図 3 は、元の Malleable C2 プロファイルからこの Beacon サンプルで変更された値を示しています。このサンプルで使用されたプロファイルの残りの部分は、もとになった ocsp.profile の内容と一致しています。

画像 3 は、ユーザー rsmudge の Malleable C2 プロファイルの GitHub ページのスクリーンショットです。
図 3. オリジナルの ocsp.profile に最初の Beacon のサンプルで更新されていた値を表示したところ

2 番目のサンプル

2 番目の Beacon サンプルの Malleable C2 プロファイルは、最初のサンプルと同じocsp.profileから借用されたものでした。

2 番目のサンプルの SHA256 ハッシュ:

  • b587e215ce8c0b3a1525f136fe38bfdc0232300e1a4f7e651e5dc6e86313e941

最初のサンプルと同じく、これもある Cobalt Strike サーバーがホストしていたステージング済みバイナリーです。この Beacon サンプルも、弊社の ATP プラットフォームが検出してダウンロードしたものです。同様の分析手順に従い、1768.py で Malleable C2 プロファイル情報を抽出し、その結果を既知のリポジトリーのプロファイルと比較しました。表 2 は、このプロファイルから抽出したネットワーク情報を示しています。

プロファイル コンポーネントの説明 詳細
C2:

実行対象コマンドを取得する GET リクエスト

メソッド: GET

Cobalt Strike C2 ドメイン:  

  • msupdate.brazilsouth.cloudapp.azure[.]com
  • msdn1357.centralus.cloudapp.azure[.]com
  • update37.eastus.cloudapp.azure[.]com
  • update.westus.cloudapp.azure[.]com
  • 146.235.52[.]69
  • 159.112.177[.]137

URI: /download/

Header: User-Agent: Microsoft-CryptoAPI/8.1

C2: 

コマンド実行結果を返す POST リクエスト

メソッド: POST

URI: /pkg/a/

表 2. 2 番目の Beacon サンプルのプロファイルから抽出したネットワーク情報

この Beacon のサンプルでは攻撃者が URI パスを更新していて、オリジナルの ocsp.profile の HTTP GET リクエストの値は /oscp/ から /download/ に置換されていました。このほか、HTTP POST リクエストの元の値も /oscp/a/ から /pkg/a/ に置き換わっていました。最後に、攻撃者は User-Agent の値を Microsoft-CryptoAPI/6.1 から Microsoft-CryptoAPI/8.1 に更新していました。

図 4 は、2 番目の Beacon インスタンスと Cobalt Strike サーバー間の HTTP C2 トラフィックの TCP ストリームを示したものです。

画像 4 は、Wireshark TCP ストリーム ウィンドウのスクリーンショットです。ホスト名は伏せてありまます。GET リクエスト、Host (これについては割愛してあります)、Connection、User-Agent 情報が含まれています。
図 4. 2 番目の Cobalt Strike Beacon サンプルが生成した HTTP C2 トラフィックを TCP ストリームとして確認したところ

3 番目のサンプル

3 番目の Beacon サンプルの Malleable C2 プロファイルは、1 番目と 2 番目のサンプルと同じocsp.profileから借用されたものでした。

3 番目のサンプルの SHA256 ハッシュ:

  • 38eeb82dbb5285ff6a2122a065cd1f820438b88a02057f4e31a1e1e5339feb2b

この 3 番目の Cobalt Strike サンプルは、同じ ocsp.profile を Malleable C2 プロファイルに使うステージレスの 64 ビット Windows 実行可能ファイルですが、ちょっと工夫してあります。C2 サーバーのドメインのサブドメイン先頭部分には、有名な多国籍テクノロジー企業の FQDN と一致する文字列が含まれています。

Cobalt Strike C2 サーバーの FQDN は www.consumershop.lenovo.com.cn.d4e97cc6.cdnhwcggk22[.]com で、この親ドメインは実際には cdnhwcggk22[.]com です。

図 5 はこの 3 番目のサンプルが生成した HTTP C2 トラフィックの例です。ここのトラフィックは、C2 ドメインの DNS クエリーがサーバーの IP アドレスに解決された後に開始されるものです。

Wireshark でフィルタリングされた感染トラフィックのスクリーンショット。
図 5. 3 番目の Cobalt Strike サンプルが生成した C2 トラフィック (Wireshark でフィルタリングしたもの)

公開済み Malleable C2 プロファイルからの借用

Cobalt Strike のアクティビティ検出において、HTTP リクエスト ヘッダーのパターンをベースにネットワーク トラフィック パターンを作って検出していたのでは高い効果は望めません。パターンのバリエーションがあまりに膨大で、検出がうまくいかないからです。正規表現パターンなどのいくつかの回避策を使えば一時的にはこの回避問題を緩和できます。ただし、攻撃者がちょっと Malleable C2 プロファイルをいじるだけで、従来のネットワーク セキュリティ ソリューションに彼らが一歩先んじるような検出の軍拡競争に陥ってしまいます。こうした状況でのコスト増は攻撃側より防御側に大きく傾きます。

しかも彼らは Malleable C2 プロファイルをゼロから作成する必要がありません。公開されているサンプルをさっとコピーしてニーズに合わせて値をいじくってやればよいのです。私たちの調査からは、攻撃者らが公開プロファイルをほんの少し変更して Cobalt Strike アクティビティに使うことで、検出逃れを図っていることが示されました。

結論

サイバーセキュリティ情勢は常に進化しており、攻撃者らは新たな手法を執拗に追い求めています。そうしたなかには、公開された Malleable C2 プロファイルの活用も含まれています。この戦略により、攻撃者は柔軟に Cobalt Strike C2 通信を開始し、プロファイルを頻繁に変更して検出を回避し、悪意のあるアクティビティを継続できるようになります。このような戦術は、サイバー脅威の動的性質と、適応性・先進性を備えた防御メカニズムのたえざる必要性とを物語っています。

ATP のような機械学習ベースのソリューションは、Cobalt Strike のような回避性の高い攻撃や C2 を防ぐために利用できる最良の防御対策です。ヒューリスティック検出では、Malleable C2 フレームワークがたやすく提供する膨大な数の組み合わせをカバーできません。

ネットワーク セキュリティの誤検知によるコストは防御側に大きく不利に働き、セキュリティ運用上の脆弱性となりますし、そこを攻撃者らは自らに資するよう突いてきます。

ATP のような機械学習ネットワーク セキュリティ プラットフォームを採用することで、このような種類の脅威に対抗する検出機能が提供されます。

これらの脅威に対応しつづけるべく、自社の持てる技術を進歩させていく取り組みは、サイバーセキュリティの卓越性とデジタル コミュニティの安全に対する弊社の専心を改めて確認するものといえます。

パロアルトネットワークスの保護と緩和策

パロアルトネットワークスのお客様は、以下の製品を通じて、Cobalt Strike の脅威からさらに強力に保護されています。

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

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

パロアルトネットワークスは、これらの調査結果を Cyber Threat Alliance (CTA: サイバー脅威アライアンス) のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使って、お客さまに保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害できます。詳細は Cyber Threat Alliance にてご確認ください。

IoC (侵害指標)

Cobalt Strike サンプルの SHA256 ハッシュ:

  • 1980becd2152f4c29dffbb9dc113524a78f8246d3ba57384caf1738142bb3a07
  • B587e215ce8c0b3a1525f136fe38bfdc0232300e1a4f7e651e5dc6e86313e941
  • 38eeb82dbb5285ff6a2122a065cd1f820438b88a02057f4e31a1e1e5339feb2b

Cobalt Strike C2 に使用されるドメインと IP アドレス:

  • msupdate.azurefd[.]net
  • o365updater.azureedge[.]net
  • gupdater.bbtecno[.]com
  • teamsupd.azurewebsites[.]net
  • msdn1357.centralus.cloudapp.azure[.]com
  • cupdater.bbtecno[.]com
  • msupdate.brazilsouth.cloudapp.azure[.]com
  • msdn1357.centralus.cloudapp.azure[.]com
  • update37.eastus.cloudapp.azure[.]com
  • update.westus.cloudapp.azure[.]com
  • www.consumershop.lenovo.com.cn.d4e97cc6.cdnhwcggk22[.]com
  • 146.235.52[.]69
  • 159.112.177[.]137

追加リソース

Enlarged Image