Cuckooの検知/回避
SandboxであるCuckooの検知について書く。
Cuckoo(カッコウ、クックー)はオンラインスキャナのVirus Total等多くの採用実績がある,OSSのSandboxである。OSSなので誰でも簡単に利用できる一方で,解析には注意が必要と考える。Sandbox上で解析対象の挙動に問題がなくても,Sandboxを検知して回避した(本来と違う挙動をとった)可能性があるからだ。これを防ぐために,言い換えるとSandboxを正しく利用するために,マルウェアの利用するSandboxの検知技術を把握しておくことが重要と考える。
ということで今回は概要の紹介を,以降で( ゆーっくり(^^;) )検証コードを試し書きしてみます。なお本記事の内容は各位の責任と判断でご利用ください。
マルウェアの備える解析検知/回避機能
イタチごっこの歴史で培ったいわばマルウェアの自己防衛機能。今回取り上げるSandboxの検知(Sandbox Evasion)を含めて主に以下の5つがある:
- Sandbox Evasion: Sandboxの検知を回避する
- Antivirus Evasion; ウイルス対策ソフトの検知を回避する
- Anti-debugging; デバッガによる動的実行の解析を回避する
- Anti-disassembly: 逆アセンブラによるリバースエンジニアリングを回避する
- Process Tricks: プロセスを改ざんしWindowsやアプリケーションの検知を回避する
これらの方法は下記のwikiにまとめられている。SandboxのCheatSheetもあるので必見。
http://unprotect.tdgt.org/index.php/Unprotect_Project
Cuckooの検知/回避
上記の参考サイト(2017.11.20閲覧)から特にSandboxの検知回避方法について抄訳とコメントをする。 解析者としてはこれらによって回避されないよう注意する。
種別 | 項目 | 説明 |
Cuckoo | Folder | ゲストでC:\Cuckoo のような特別なパスが使われることがある→このパスが存在するかを確認する |
Hooked Function | Cuckooはゲストの幾つかのAPIをHookする 例えばファイル削除のDeleteFileWなどがあり,全てのリストはドキュメント参照 →これらのAPIのHookの有無を確認する |
|
Pipe | Cuckooはホストとゲストの通信にパイプ\\\\.\\pipe\\cuckoo を使う→このファイルが存在するかを確認する |
|
Agent | Cuckooはホストとゲストの通信にPythonのAgent(agent.py)を使う →プロセスpython.exeまたはpythonw.exeを探すか,ファイルagent.pyを探す |
|
Sandbox 共通 |
OnsetDelay | 特定の時刻に実行することで,悪意のあるコードの実行を遅らせる |
Stalling code | 時間のかかる処理を入れておき,悪意のあるコードの実行を遅らせる | |
Extended sleep code | 長いsleepを入れておき,悪意のあるコードの実行を遅らせる | |
User interaction | マウスやキーボードの動作をトリガーにすることで,自動での検知を回避する 例: 複数回のクリックがあるまで待機(Trojan.APT.BaneChant) |
|
Office RecentFiles | 通常使うPCであればOfficeの履歴があるはず | |
Screen resolution | Sandboxを利用する際に画面サイズは800x600かそれ以下であることが多い | |
Installed software | 解析者であればPythonやデバッガなど解析に有用なソフトウェアがあるはず | |
Memory size | 通常のPCであればメモリは4G以上あるはず | |
Drive size | 通常のPCであればディスクサイズが80GB以上あるはず | |
Hostname | ホスト名がSandboxによくあるものかを確認する 例: Sandbox, Maltest, Malware, malsand, ClonePC |
|
USB Drive | 通常のPCであればUSBドライブが幾つかついているはず | |
Printer | 通常のPCであれば複数のプリンタに接続しているはず | |
Processor | 通常のPCで1コアのCPUを使うことはまずないが,仮想環境は初期設定で1であることが多い →プロセッサの数を確認する |
( 通常のPCとは家庭やオフィスで使われる一般的なPC(組み込み用途ではない)で,ネイティブで動いているものを指す。)
ところで,どのマルウェアが何の技術を使うかのデータベースってあるのでしょうか。どう探せばいいかも分からん(^^;)。上記のin the wildの実例を見れれば便利だと思う。気づいたら上の表に書き込んでいきます! :D
PE形式のヘッダ
最近WindowsでのInjectionを色々と試している。本記事ではその過程で学んだPEのヘッダを取り上げる。
この手のデータ構造を網羅的に学ぶのは大変。まず数が多い。また先人の知恵が詰まっているためか解説読んでも意味の分からん(^^;)メンバもある。本記事では,Injectionを学ぶのに当たり必要になった範囲や粒度でまとめる。
ここで紹介されているもの以外のメンバや詳細を知りたい場合は,Microsoftの解説を参照されたい。
PE形式の全体像とヘッダ
通称「PE Header」について補足する。PE Headerは通常上図のNT Headerを指す。しかし「PEのヘッダ」という意味で,赤枠で囲んだMS-DOS Header~Section Headersまでを指す記事等が見られるため注意が必要。本記事では,PE Headerという言葉は用いず,MS-DOS Header, NT Headerと呼び分ける。
MS-DOS Header, Stub
Windows の前身である MS-DOSとの互換性をとるためのヘッダとスタブプログラム。
スタブプログラムでは,MS-DOS でWindows 用のプログラムを実行した際の「This program cannot be run in DOS mode」の表示を行う。ここに任意のプログラムを配置することもできる。
_IMAGE_DOS_HEADER
メンバ名 | 説明 |
---|---|
e_magic | MS-DOS Headerであることを表す文字列「MZ」 |
e_flanew | NTヘッダへのオフセットサイズ(バイト) |
NT Header
Optional Header
_IMAGE_OPTIONAL_HEADER
メンバ名 | 説明 |
---|---|
AddressOfEntryPoint | エントリポイントのアドレス(RVA) エントリポイントは多くの言語で言うmain関数のこと RVA(relative virtual address)は後述のImageBaseからの相対アドレスであること |
ImageBase | イメージファイルがロードされるアドレス 既定値はDLLが0x10000000,実行ファイルは0x00400000 |
SizeOfImage | 全てのヘッダを含む実行イメージののサイズ(Section Alignment) |
SizeOfHeaders | 全てのヘッダの合計サイズ(File Alignment) 全てのヘッダとはMS-DOSとStub,NT Header,全てのSection Header |
Section Headers
このヘッダはセクションの数だけ,言い換えるとFile HeaderのNumberOfSectionsの数だけ配置される。
_IMAGE_SECTION_HEADER
メンバ名 | 説明 |
---|---|
VirtualSize | メモリ上でのセクションのサイズ |
VirtualAddress | メモリ上でのセクションのアドレス(RVA) |
SizeOfRawData | ディスク上でのセクションのサイズ(File Alignment) |
PointerToRawData | ディスク上でのセクションの位置(オフセット) |
これらのメンバを使ってローダがセクションを配置する動作を簡単に考えてみる[*1]。 ローダはFile HeaderのNumberOfSectionsの数だけセクションの情報を見る。各セクションについて,見るべき範囲はPointerToRawDataの位置からSizeOfRawData分進んだ範囲である。これを(VirtualAddress + ImageBase)の位置にコピーすれば良い。