サイバーセキュリティ チュートリアル

Cobalt Strike解析&チュートリアル: Malleable C2プロファイルでCobalt Strike検出が難しくなる理由

Clock Icon 4 min read

概要

Cobalt Strikeは商用の脅威エミュレーションソフトウェアで、ネットワークに長期的にひそむアクターをエミュレートします。Beaconと呼ばれるこのアクターは外部チームサーバーと通信してコマンド&コントロール(C2)トラフィックを模倣します。汎用性が高く、レッドチームの正規ツールとしてよく利用されますが、脅威アクターの実際の攻撃でも広く使用されています。

Cobalt StrikeユーザーはBeaconのHTTPインジケータ(指標)をプロファイルで制御します。このプロファイルとして、デフォルトプロファイルとカスタマイズ可能なMalleable C2プロファイルのいずれかを選べます。

本稿ではこれらプロファイル関連の概念や定義を説明したのち、Cobalt Strikeフレームワークや実際の攻撃で使用されたデフォルトプロファイル、カスタマイズMalleable C2プロファイルの違いを探ります。そのさいは、Malleable C2プロファイルがCobalt Strikeにいかに汎用性を与えるか、なぜこの汎用性がCobalt Strikeを従来型ファイアウォール防御の設計を困難にするエミュレータとして有効なのかを実証します。

パロアルトネットワークスのお客様は、Cortex XDR、次世代ファイアウォールのWildFireおよびThreat Preventionサブスクリプションを通じて、Cobalt Strikeの悪用に対する保護を受けています。

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

Cobalt Strikeのプロファイルオプション

Cobalt Strikeツールの設定は主にプロファイルファイルを使って指定します。Cobalt Strikeはプロファイルに存在する値を使ってBeaconペイロードを生成します。ユーザーはMalleable Command and Control (C2)プロファイル言語でプロファイルの作成と値の設定を行います。

このプロファイルはBeaconがトランザクション内でデータをどのように変換・保存するかを指定します。

プロファイル内のオプションは「グローバルオプション」と「ローカルオプション」に分かれ、グローバルオプションではBeaconの全般的な設定を行い、ローカルオプションではトランザクション固有の設定を行います。あるトランザクション内のローカルオプションを変更しても他のトランザクションの出力には影響しません。

プロファイルは複数のセクションに分かれていて、C2通信のさまざまな部分の値を指定できます。プロファイルの一般的な設定は以下の通りです。

プロファイルの各セクションについて以下に説明します。

グローバルオプション

グローバルオプションはC2通信全般の設定を行います。sleeptimeやjitterなどのオプションはBeaconがチームサーバーにチェックインする頻度を定義します。以下、いくつかのグローバルオプションに値を設定した例です。

グローバルオプションの詳細はCobalt Strikeのユーザーガイドを参照してください。

ローカルオプション

一方、ローカルオプションのスコープは個々のトランザクションのみです。あるトランザクション用のオプションは他のトランザクションには影響しません。

以下はローカルオプションの例です。

これらのオプションに加え、プロファイルには、別のアクションを実行するために別のprotocol-transaction を指定できます。以下はトランザクションのサンプルとその使用方法について簡単に説明したものです。

  • http-stager: Beaconがステージングされたペイロードで、ステージャーはこのファイルをダウンロードしてメモリにインジェクト(注入)します。トランザクションに設定した値はBeaconダウンロード用のHTTP通信をカスタマイズします。
  • dns-beacon: Cobalt Strikeバージョン4.3以降ではDNSオプションはdns-beaconトランザクションの一部になっています。このトランザクションはDNS C2通信を変更します。dns-beaconの全オプションの詳細はこちらのCobalt Strikeのユーザーガイドを参照してください。
  • http-get: http-getトランザクションはBeaconとチームサーバー間のHTTP通信をカスタマイズします。Beaconのアクティビティは侵害システムに関するメタデータを含むHTTPリクエスト送信から始まります。チームサーバーに実行すべきタスクがある場合、サーバーはHTTPレスポンスを送信します。
  • http-post: Beaconがサーバーから送られたタスクを実行すると、タスクからの出力はhttp-postトランザクションで送信されます。このトランザクションに記載した値は、タスクの出力がサーバーに送信される際のHTTP通信に影響します。
  • https-certificate: BeaconがHTTPSで通信するタスクを与えられた場合、チームサーバーは自己署名証明書を生成します。チームサーバーは、http-getトランザクション、http-postトランザクションの各値を使用して、実際のHTTPリクエストとレスポンスを作成します。このプロファイルトランザクションを使うとSSL証明書のさまざまなパラメータを指定できます。http-certificatesの全オプションの詳細はこちらのCobalt Strikeのユーザーガイドを参照してください。
他のカスタマイズされたプロファイルが指定されていない場合、Cobalt Strikeのデフォルトプロファイルがロードされます。
図 1. Cobalt Strikeのデフォルトプロファイル

Cobalt Strikeのデフォルトプロファイル

他にカスタムプロファイルが指定されていなければデフォルトプロファイルがロードされます。上の図1はデフォルトプロファイルの設定内容を示したもの、下の図2はCobalt StrikeチームサーバーでWebドライブバイダウンロードオプションを使用した場合のデフォルトプロファイルからのトラフィックをキャプチャしたものです。

デフォルトプロファイルからのトラフィックキャプチャ例。Cobalt StrikeのチームサーバーでWebドライブバイダウンロードオプションが使用されている
図 2. デフォルトプロファイルからのトラフィックキャプチャ例

図2からはGETやPOSTのリクエストとレスポンスからなるHTTPトランザクションが複数存在していることがわかります。

  • GETリクエストを見てみると、ほとんどのリクエストURIが非常に短く、決まったパターンがあります。URIは図1のデフォルトプロファイルのset uriで指定したURIリストからランダムに選ばれます(全リストは以下の表1を参照してください)。悪意のある攻撃者はhttp-getセクション内のset uriオプションをカスタマイズしたプロファイルを使えばURIを簡単に任意の文字列に変更できます。このことは、パターンベースシグネチャがデフォルトプロファイルを使うCobalt Strikeトラフィックはうまく捕捉できるものの、カスタムプロファイルを使ったバリエーションはうまく捕捉できない理由も説明しています。
  • POSTリクエストを見てみると、URIに決まったパターン(/submit.php?id=)があります。ID値はランダムに生成されます。HTTP GETリクエスト同様、悪意のある攻撃者はhttp-postセクション内のset uriオプションをカスタマイズしたプロファイルを使えばURIを簡単に任意の文字列に変更できます。
インデックス URI インデックス URI インデックス URI
1 /ca 8 /fwlink 15 /push
2 /dpixel 9 /cm 16 /ptj
3 /__utm.gif 10 /cx 17 /j.ad
4 /pixel.gif 11 /pixel 18 /ga.js
5 /g.pixel 12 /match 19 /en_US/all.js
6 /dot.gif 13 /visit.js 20 /activity
7 /updates.rss 14 /load 21 /IE9CompatViewList.xml

表 1. Cobalt StrikeのデフォルトプロファイルのURI候補

Cobalt Strikeのカスタムプロファイル

Malleable C2プロファイルは公開されていて、GitHubの公式プロファイル例などからダウンロードできます。これらのプロファイルをチームサーバーで読み込み、C2通信用のBeaconダウンロードとして使用することができます。

例として、etumbotのプロファイルを以下に順を追って詳しく見ていきます。

1. グローバルオプション

  • sleeptime: Beaconコールバックのスリープ時間。ここでは5,000ミリ秒(5秒)
  • jitter: ジッターは0(%)に設定されている。この例では値が0なのでBeaconは5秒ごとにコールバックする
  • maxdns: DNS経由でデータをアップロードする場合のホスト名の最大長を255に設定
  • useragent: HTTP C2リクエストのUser-Agentを「Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)」に設定
公開されているMalleable C2プロファイルを利用できる。この図はEtumbotプロファイルのグローバルオプション内容
図 3. Etumbotプロファイルのグローバルオプション

2. BeaconがチェックインしてチームサーバーからHTTP GETリクエストでタスクを取得

グローバルオプションの下にはHTTPリクエストとレスポンスに関する以下のオプション設定があります。以下の図4と図5はその設定例で、ここにはクライアントとサーバーの両方のURI、ヘッダ、メタデータ情報が含まれています。

この図は、Malleable C2プロファイルのサンプルにおけるHTTPリクエストURI、HTTPリクエストヘッダ、メタデータエンコードアルゴリズム、URIに添付されたメタデータ、HTTPレスポンスヘッダ、レスポンスのボディとして暗号化・エンコードされたタスクデータを赤の矩形でハイライト表示している
図 4. EtumbotプロファイルのHTTP GETリクエストオプション
この図は、Malleable C2プロファイルサンプルのHTTP URIパス、Netbiosでエンコードされたメタデータ、HTTP UA、HTTPレスポンスヘッダを赤の矩形でハイライト表示している
図5 ライブトラフィック内のHTTP GETリクエスト

3. Beaconがタスクの実行結果をHTTP POSTリクエストでチームサーバーに送信

以下の図6からはHTTPレスポンスに関するオプション設定、図7からはPOST C2のトラフィックがどのように見えるかがわかります。

Malleable C2プロファイルのサンプルにおけるHTTPリクエストURI、HTTPリクエストヘッダ、URIに付与されたHTTPリクエストのセッションID、コマンド実行結果用のHTTPリクエストペイロード、HTTPレスポンスヘッダ、HTTPレスポンスボディを赤の矩形でハイライト表示している
図 6. EtumbotプロファイルのHTTP POSTリクエストオプション
Malleable C2プロファイルのサンプルにおけるHTTP URIパス、NetbiosでエンコードされたセッションID、HTTP URIパスのpostfix、HTTPリクエストヘッダ、HTTPリクエストUA、Base64でエンコードされたタスク実行結果、HTTPレスポンスヘッダを赤の矩形でハイライトしている
図7 ライブトラフィック内のHTTP POSTリクエストオプション

実際の攻撃事例

以下のセクションでは、Cobalt Strikeのペイロードが実際の攻撃で利用された個別の事例を2つ紹介します。1つはデフォルトオプション(プロファイルなし)を使った事例、もう1つはカスタムプロファイルを使った事例です。本稿執筆時点ではいずれのサンプルもVirusTotalではトリガーされておらず、パロアルトネットワークスでは静的解析と動的解析によりこれらのサンプルを特定しています。

デフォルトプロファイルを使った事例

SHA256 ハッシュ: 6a6e5d2faeded086c3a97e14994d663e2ff768cb3ad1f5a1aa2a2b5fd344dde2

Cobalt Strike HTTP GET Beaconダウンロードリクエスト(デフォルトプロファイル)
図 8. Cobalt Strike HTTP GET Beacon ダウンロードリクエスト
Cobalt Strike HTTP GET Beaconハートビートリクエスト(デフォルトプロファイル)
図9. Cobalt Strike HTTP GETハートビートリクエスト
Cobalt Strike HTTP POSTコールバックリクエスト(デフォルトプロファイル)
図10 Cobalt Strike HTTP POSTコールバックリクエスト

図9と図10からわかるとおり、このGETリクエストとPOSTリクエストはデフォルトプロファイルが指定する設定オプションに従ったものです。GETリクエストのURIは/load(図9)で、これはGETリクエストのデフォルトオプションの1つです。またPOSTリクエストのURIは/submit.php(図10)で、これはPOSTリクエストのデフォルトオプションです。すべてのCobalt StrikeトラフィックがこれらデフォルトのURIを使っていれば、Cobalt Strikeトラフィックの識別用シグネチャを書くのはずっと容易だったでしょう。しかし、これらのシグネチャは、次のセクションで示すように、カスタムプロファイルからのトラフィックは識別できません。

カスタムプロファイルを使った事例

SHA256 ハッシュ: fcdc426289dab0e5a73cd6fbac928ad48a8ff9b67e1d37df2794af6e7fa559e9

Cobalt Strike HTTP GET Beaconダウンロードリクエスト(カスタマイズされたMalleable C2プロファイル)
図 11. Cobalt Strike HTTP GET Beacon ダウンロードリクエスト
Cobalt Strike HTTP GETハートビートリクエスト(カスタマイズされたMalleable C2プロファイル)
図12 Cobalt Strike HTTP GETハートビートリクエスト
Cobalt Strike HTTP POSTコールバックリクエスト(カスタマイズされたMalleable C2プロファイル)
図13 Cobalt Strike HTTP POSTコールバックリクエスト

図12と図13からわかるとおり、このGETリクエストとPOSTリクエストのURIは、デフォルトプロファイルのものから変更されています。これらのURIは、いずれも先頭に/MicrosoftUpdateを付けてMicrosoftサーバーに対する正規Windowsアップデート用HTTPリクエストに見せかけていますが、実際にはC2サーバーからのリクエストとレスポンスのトラフィックです。このように、カスタマイズされたプロファイルからのCobalt Strikeトラフィックはかなり柔軟で検出困難な場合があります。

Cobalt Strike Beaconの設定

前述のGETリクエスト、POSTリクエストのパラメータの違いに加え、Cobalt Strike Beaconの設定はデフォルトプロファイルとカスタムプロファイルで異なります。この設定には、Malleable C2プロファイルの内容に従って、エンコーディングタイプ、ブログ投稿メカニズム、データ変換に使う命令、その他プロパティを含む有用なメタデータが含まれています。Didier Stevens氏の1768.pyスクリプトを使うと、リサーチ用にCobalt Strike Beaconの設定をデコード・抽出できます。Didier Stevens氏は複数の解析ツールの開発などで知られるセキュリティリサーチャーです。

カスタムプロファイルのBeaconの設定メタデータを抽出したスクリーンショット
図 14. カスタムプロファイルのBeaconの設定メタデータ

図14はカスタムプロファイルのBeaconの設定メタデータを抽出したものです。デフォルトプロファイルとカスタムプロファイルのBeacon設定の最も目につく違いは、命令、データ変換、使用されるHTTPパラメータの数でしょう。

以下の表は、前述の実際の攻撃事例2つ(デフォルトプロファイルを使っている事例とカスタムプロファイルを使っている事例)からの設定メタデータの違いを一覧にしたものです。

デフォルトプロファイル(Beacon /Iya9) カスタムプロファイル(Beacon /api/1)
0x000a post-uri
0x0003 0x0040 '/submit.php'
0x000b Malleable_C2_Instructions
0x0003 0x0100
  Transform Input: [7:Input,4]
   Print
0x000c http_get_header
0x0003
0x0200
  Build Metadata: [7:Metadata,3,6:Cookie]
   BASE64
   Header Cookie
0x000d http_post_header
0x0003
0x0200
  Const_header Content-Type: application/octet-stream
  Build SessionId: [7:SessionId,5:id]
   Parameter id
  Build Output: [7:Output,4]
   Print
0x000a post-uri
0x0003 0x0040 '
/MicrosoftUpdate/GetUpdate/KB'
0x000b Malleable_C2_Instructions
0x0003 0x0100
  Transform Input: [7:Input,4]
   Print
0x000c http_get_header
0x0003
0x0100
  Const_header User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0;Windows NT 5.1)
  Const_header Accept: */*, ..., ......, .
  Build Metadata: [7:Metadata,11,5:tmp]
   NETBIOS uppercase
   Parameter tmp
0x000d http_post_header
0x0003
0x0100
  Const_header Content-Type: application/octet-stream
  Const_header User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0;Windows NT 5.1)
  Build SessionId: [7:SessionId,1:/default.asp,12]
   Append /default.asp
   Uri_append
  Build Output: [7:Output,4]
   Print

表 2. デフォルトプロファイルとカスタムプロファイルの設定メタデータ比較

結論

Cobalt Strikeは侵害後のアクターをエミュレートする強力なツールです。前述のMalleable C2プロファイルはセキュリティ検出をかいくぐれるよう、巧妙に設計されています。セキュリティアプライアンス単体ではCobalt Strikeの攻撃を防げないので、ファイアウォール、サンドボックス、エンドポイント、さらにこれらすべての要素を統合してくれるソフトウェアのセキュリティソリューションを組み合わせて使うことが必要になります。

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

  1. 脅威防御シグネチャ86445と86446を含む次世代ファイアウォール(NGFW)は、デフォルトプロファイルのHTTP C2リクエストを識別します。
  2. NGFW用セキュリティサブスクリプションWildFireはCobalt Strike Beaconを識別・ブロックします。
  3. AutoFocusをお使いのお客様は次のタグを使用してこれらのアクティビティを追跡できます: CobaltStrike

IoC (侵害指標)

Cobalt Strike サンプル

  • 6a6e5d2faeded086c3a97e14994d663e2ff768cb3ad1f5a1aa2a2b5fd344dde2
  • fcdc426289dab0e5a73cd6fbac928ad48a8ff9b67e1d37df2794af6e7fa559e9

Cobalt Strike Beacon サンプル

  • /Iya9
    • 08e901d4ed0b43b46e632158f5ec5e900f16015e18995a875f62903a3c1eb1f9
  • /api/1
    • d8b385d680bcdf7646f35df612712f7a3991f50a21cac8379630d05b3d2337ae

Cobalt Strike チームサーバーのドメイン

  • www.symantecav[.]xyz

Cobalt Strike Team Server IPアドレス

  • 66.42.72[.]250
  • 146.0.77[.]110
Enlarged Image