This post is also available in: English (英語)
概要
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のカスタムプロファイル
実際の攻撃事例
デフォルトプロファイルを使った事例
カスタムプロファイルを使った事例
Cobalt Strike Beaconの設定
結論
IoC
追加リソース
Cobalt Strikeのプロファイルオプション
Cobalt Strikeツールの設定は主にプロファイルファイルを使って指定します。Cobalt Strikeはプロファイルに存在する値を使ってBeaconペイロードを生成します。ユーザーはMalleable Command and Control (C2)プロファイル言語でプロファイルの作成と値の設定を行います。
このプロファイルはBeaconがトランザクション内でデータをどのように変換・保存するかを指定します。
プロファイル内のオプションは「グローバルオプション」と「ローカルオプション」に分かれ、グローバルオプションではBeaconの全般的な設定を行い、ローカルオプションではトランザクション固有の設定を行います。あるトランザクション内のローカルオプションを変更しても他のトランザクションの出力には影響しません。
プロファイルは複数のセクションに分かれていて、C2通信のさまざまな部分の値を指定できます。プロファイルの一般的な設定例は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# これはコメントです set global_option "value"; protocol-transaction { set local_option "value"; client { # クライアントのインジケータのカスタマイズ } server { # サーバーのインジケータのカスタマイズ } } |
プロファイルの各セクションについて以下に説明します。
グローバルオプション
グローバルオプションはC2通信全般の設定を行います。sleeptimeやjitterなどのオプションはBeaconがチームサーバーにチェックインする頻度を定義します。以下、いくつかのグローバルオプションに値を設定した例です。
1 2 3 4 5 |
set sample_name "Profile Name"; set sleeptime "30000"; set jitter "20"; set useragent "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"; set host_stage "false"; |
グローバルオプションの詳細はCobalt Strikeのユーザーガイドを参照してください。
ローカルオプション
一方、ローカルオプションのスコープは個々のトランザクションのみです。あるトランザクション用のオプションは他のトランザクションには影響しません。
以下はローカルオプションの例です。
1 2 3 4 |
set uri "URI_For HTTP transaction"; set verb "POST"; set uri_x86 "StagetURI_for_x86"; set uri_x64 "StagetURI_for_x64"; |
これらのオプションに加え、プロファイルには、別のアクションを実行するために別の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はデフォルトプロファイルの設定内容を示したもの、下の図2はCobalt StrikeチームサーバーでWebドライブバイダウンロードオプションを使用した場合のデフォルトプロファイルからのトラフィックをキャプチャしたものです。
図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)」に設定
2. BeaconがチェックインしてチームサーバーからHTTP GETリクエストでタスクを取得
グローバルオプションの下にはHTTPリクエストとレスポンスに関する以下のオプション設定があります。以下の図4と図5はその設定例で、ここにはクライアントとサーバーの両方のURI、ヘッダ、メタデータ情報が含まれています。
3. Beaconがタスクの実行結果をHTTP POSTリクエストでチームサーバーに送信
以下の図6からはHTTPレスポンスに関するオプション設定、図7からはPOST C2のトラフィックがどのように見えるかがわかります。
実際の攻撃事例
以下のセクションでは、Cobalt Strikeのペイロードが実際の攻撃で利用された個別の事例を2つ紹介します。1つはデフォルトオプション(プロファイルなし)を使った事例、もう1つはカスタムプロファイルを使った事例です。本稿執筆時点ではいずれのサンプルもVirusTotalではトリガーされておらず、パロアルトネットワークスでは静的解析と動的解析によりこれらのサンプルを特定しています。
デフォルトプロファイルを使った事例
SHA256 ハッシュ: 6a6e5d2faeded086c3a97e14994d663e2ff768cb3ad1f5a1aa2a2b5fd344dde2
図9と図10からわかるとおり、このGETリクエストとPOSTリクエストはデフォルトプロファイルが指定する設定オプションに従ったものです。GETリクエストのURIは/load(図9)で、これはGETリクエストのデフォルトオプションの1つです。またPOSTリクエストのURIは/submit.php(図10)で、これはPOSTリクエストのデフォルトオプションです。すべてのCobalt StrikeトラフィックがこれらデフォルトのURIを使っていれば、Cobalt Strikeトラフィックの識別用シグネチャを書くのはずっと容易だったでしょう。しかし、これらのシグネチャは、次のセクションで示すように、カスタムプロファイルからのトラフィックは識別できません。
カスタムプロファイルを使った事例
SHA256 ハッシュ: fcdc426289dab0e5a73cd6fbac928ad48a8ff9b67e1d37df2794af6e7fa559e9
図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氏は複数の解析ツールの開発などで知られるセキュリティリサーチャーです。
図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] 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] |
0x000a post-uri 0x0003 0x0040 '/MicrosoftUpdate/GetUpdate/KB' 0x000b Malleable_C2_Instructions 0x0003 0x0100 Transform Input: [7:Input,4] 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] |
表 2. デフォルトプロファイルとカスタムプロファイルの設定メタデータ比較
結論
Cobalt Strikeは侵害後のアクターをエミュレートする強力なツールです。前述のMalleable C2プロファイルはセキュリティ検出をかいくぐれるよう、巧妙に設計されています。セキュリティアプライアンス単体ではCobalt Strikeの攻撃を防げないので、ファイアウォール、サンドボックス、エンドポイント、さらにこれらすべての要素を統合してくれるソフトウェアのセキュリティソリューションを組み合わせて使うことが必要になります。
パロアルトネットワークスのお客様は、次の方法でこの種の攻撃から保護されています。
- 脅威防御シグネチャ86445と86446を含む次世代ファイアウォール(NGFW)は、デフォルトプロファイルのHTTP C2リクエストを識別します。
- NGFW用セキュリティサブスクリプションWildFireはCobalt Strike Beaconを識別・ブロックします。
- 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