Cobalt Strike Beaconを検知するVolatility Plugin(2018-07-31)
JPCERT/CCでは、2017年7月頃から国内の組織に対して、Cobalt Strikeを悪用した攻撃が行われていることを確認しています。Cobalt Strikeは、標的型攻撃を模倣することができる商用製品[1]であり、インシデント対応演習などで利用されますが、攻撃者に悪用されるケースもあります。Cobalt Strikeを悪用する攻撃グループや、Cobalt Strikeの詳細については、株式会社ラック[2]やFireEye[3]、Cybereason[4]が公開している情報に詳しく記載されていますので、そちらをご覧ください。
Cobalt Strikeは、ダウンローダーとなるWord文書などを用いて、本体となるペイロード(Cobalt Strike Beacon)をダウンロードさせることで、メモリ上で実行されます。 Cobalt Strike Beaconはディスク上には保存されないため、ファイルの存在を持って感染の有無を確認することができません。そのため、メモリダンプを取得して調査するか、プロキシなどのネットワーク機器のログから調査する必要があります。
今回は、Cobalt Strike Beaconをメモリ上から検知するためのツールについて紹介します。
なお、ツールはGitHub上で公開していますので、以下のWebページからダウンロードしてご利用ください。
JPCERTCC/aa-tools · GitHub
https://github.com/JPCERTCC/aa-tools/blob/master/cobaltstrikescan.py
ツールの詳細
このツールは、メモリフォレンジックツールであるThe Volatility Framework(以下Volatilityと略す)のPluginです。cobaltstrikescan.pyは、以下の機能を持っています。
- cobaltstrikescan: メモリイメージからCobalt Strike Beaconを検知する
- cobaltstrikeconfig: メモリイメージからCobalt Strike Beaconを検知し、設定情報を抽出する
実行する際は、cobaltstrikescan.pyをVolatility内の”contrib/plugins/malware”フォルダに保存し、以下のように実行します。
$python vol.py [cobaltstrikescan|cobaltstrikeconfig] –f <memory.image> ––profile=<profile>
図 1はcobaltstrikescanの実行結果の例です。マルウエアのインジェクト先プロセス名(Name)やプロセスID(PID)が表示されています。
図 2はcobaltstrikeconfigの実行結果の例です。Cobalt Strike Beaconの設定情報の詳細については、Appendix Aをご覧ください。
おわりに
Cobalt Strikeはこれまでに国内の組織に対して悪用されており、今後もこのCobalt Strikeを悪用した攻撃が行われる可能性があるため注意が必要です。
インシデントレスポンスグループ 遠藤 拓也
参考情報
[1] Strategic Cyber LLC:COBALT STRIKE ADVANCED THREAT TACTICS FOR PANETRATION TESTERS
https://www.cobaltstrike.com/
[2]株式会社ラック:APT攻撃者グループ menuPass(APT10) による新たな攻撃を確認
https://www.lac.co.jp/lacwatch/people/20180521_001638.html
[3] FireEye:Privileges and Credentials: Phished at the Request of Counsel
https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html
[4] Cybereason:Operation Cobalt Kitty: A large-scale APT in Asia carried out by the OceanLotus Group
https://www.cybereason.com/blog/operation-cobalt-kitty-apt
Appendix A 設定情報
表 A: 設定情報の形式
オフセット | 長さ(byte) | 説明 |
0x00 | 2 | index 詳細は表Bを参照 |
0x02 | 2 |
dataの長さを指定する値 |
0x04 | 2 | dataの長さ |
0x06 | 0x04で指定の値 | data |
表 B: 設定情報の一覧
index | 説明(byte) | 備考 |
0x01 | BeaconType | 0=HTTP, 1=Hybrid HTTP and DNS, 8=HTTPS |
0x02 | ポート番号 | |
0x03 | ポーリング時間 | |
0x04 | 不明 | |
0x05 | Jitter | ポーリング時間の揺らぎの割合(0-99%) |
0x06 | Maxdns | DNS利用時のホスト名の最大長(0-255) |
0x07 | 不明 | |
0x08 | 通信先 | |
0x09 | ユーザーエージェント | |
0x0a | HTTP_Header2通信時のパス | |
0x0b | 不明 | |
0x0c | HTTP_Header1 | |
0x0d | HTTP_Header2 | |
0x0e | インジェクションプロセス | |
0x0f | パイプ名 | |
0x10 | Year | Year, Month, Dayで設定した日付以降は動作しない |
0x11 | Month | |
0x12 | Day | |
0x13 | DNS_idle | |
0x14 | DNS_Sleep | |
0x1a | HTTP_Method1 | |
0x1b | HTTP_Method2 | |
0x1c | 不明 | |
0x1d | 任意のシェルコードをインジェクションするプロセス(32bit) | |
0x1e | 任意のシェルコードをインジェクションするプロセス(64bit) | |
0x1f | 不明 | |
0x20 | プロキシサーバー名 | |
0x21 | プロキシユーザー名 | |
0x22 | プロキシパスワード | |
0x23 | AccessType | 1=プロキシサーバーを利用しない 2=レジストリ内のIEの設定を使用 4=プロキシサーバー経由で接続 |
0x24 | create_remote_thread | 他のプロセスでスレッド作成を許可するかどうかのフラグ |
0x25 | 未使用 |