13 KiB
Identification of Hollowed out processes
- Process Hollowingされたプロセスの識別方法を示す
Sample/Environment
- Sample
sha256 | 05A14271A14004BF89D8B4DBED8E876A0A182BD98864BEDC86D824647D9D5810 |
---|---|
filetype | PE(exe,32bit) |
sandbox | ANYRUN HYBRID ANALYSIS |
family | Trickbot |
- Environment
vm | VirtualBox5.2, Guest Addtions Installed |
---|---|
os | Windows10 Home 64bit, FLARE VM Installed |
Tools | PowerShell,Hollows Hunter,Loki,EQL,Sysmon,Strings2,Volatility |
First
- Process Hollowingを行うマルウェア(今回はTrickbot)を実行する
- 検体にもよるがProcess Hollowingが完了するまでに時間を要するケースがあるので注意
以下Case1-4で各種Toolを用いて,Process Hollowingされたプロセスの識別を行う
Case1: Hollows Hunter
Hollows Hunterは,全プロセスもしくは特定の名称のプロセスのメモリをスキャンし,Process HollowingやInjectionを検出・ダンプすることが可能。PE-Sieveと同じ開発者(@hasherezade)によって作成されたツールであり,PE-Sieveのdllが内部で用いられている。
- Hollows Hunterをこちらからダウンロードする
- 管理者権限でPowerShellを実行
- 使用方法は
/help
で以下のように確認することができる(~の部分は省略)。
PS> \hollows_hunter.exe /help
Optional:
---scan options---
/pname <process_name>
: Scan only processes with given names (separated by ';').
Example: iexplore.exe;firefox.exe
/hooks : Detect hooks and in-memory patches.
/shellc : Detect shellcode implants. (By default it detects PE only).
~
~
---output options---
/ofilter <*ofilter_id>
: Filter the dumped output.
*ofilter_id:
0 - no filter: dump everything (default)
1 - don't dump the modified PEs, but save the report
2 - don't dump any files
/dir <output_dir>
: Set a root directory for the output (default: current directory).
/uniqd : Make a unique, timestamped directory for the output of each scan.
(Prevents overwriting results from previous scans)
/minidmp: Make a minidump of each detected process.
/suspend: Suspend processes detected as suspicious
/kill : Kill processes detected as suspicious
/quiet : Display only the summary and minimalistic info.
/log : Append each scan summary to the log.
/json : Display JSON report as the summary.
~
今回利用するオプションは
/hooks
...フックとメモリ内パッチを検出(直訳)
/shellc
...シェルコードインプラントの検出(直訳)
/quiet
...出力を最小限にする
/ofilter 2
...検出したProcessのdump fileを作成しない。(defaultだと作成される)
PS> .\hollows_hunter.exe /hooks /shellc /quiet /ofilter 2
- 結果は以下のようになり,PID:11228のsvchost.exeがProcess HollowingされたProcessと識別された
Case2: Loki
一般的には,以下の機能をもったなIoCスキャナーである。PE-Sieveも利用しているためProcess Hollwingの検出も可能と思われる
Detection is based on four detection methods:
- File Name IOC : Regex match on full file path/name
- Yara Rule Check : Yara signature match on file data and process memory
- Hash check : Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files
- C2 Back Connect Check: Compares process connection endpoints with C2 IOCs (new since version v.10)
Additional Checks:
- Regin filesystem check (via --reginfs)
- Process anomaly check (based on Sysforensics)
- SWF decompressed scan (new since version v0.8)
- SAM dump check
- DoublePulsar check - tries to detect DoublePulsar backdoor on port 445/tcp and 3389/tcp
- PE-Sieve process check
- Lokiをこちらからダウンロードする
- 以下のオプションで実行する(時間を要するので不要な機能は用いないようにする)
PS> .\loki.exe --nofilescan --nolevcheck --noindicator --onlyrelevant --nolisten
- 結果は以下のようになり,2つのプロセスが検出されたが,Hollows Hunterと同様にPID:11228のsvchost.exeを検出している
Case3: EQL(Event Query Language)
EQLはWindowsイベントログ(Sysmonログ等)の検索・解析を可能にするクエリ言語。EQLを用いたスレットハンティングについてはこちらが参考になる
Sysmon.exe -AcceptEula -i -h * -n -l
- Sysmonログはjson形式に変換する必要がある。以下のコマンドは直近5000件のSysmonログをjson形式に変換しmy-sysmon-data.jsonというファイルに出力している
PS> Get-LatestLogs | ConvertTo-Json | Out-File -Encoding ASCII -FilePath my-sysmon-data.json
- クエリの内容を指定する。以下のクエリは,プロセスの親子関係を確認し,不自然なプロセスを検索している。例えば,svchost.exeの親プロセスがservices.exeではないかつ親プロセスのパスが*\system32\svchost.exeではないかつ子プロセスのパスが*\syswow64\svchost.exeではない場合は不自然とみなされる。Process Hollowingもこのプロセスの親子関係の不自然さから検出できるケースがある。
ref:Unusual Child Process
PS> $eql="
process where subtype.create and
(
(process_name == 'smss.exe' and not parent_process_name in ('System', 'smss.exe')) or
(process_name == 'csrss.exe' and not parent_process_name in ('smss.exe', 'svchost.exe')) or
(process_name == 'wininit.exe' and parent_process_name != 'smss.exe') or
(process_name == 'winlogon.exe' and parent_process_name != 'smss.exe') or
(process_name == 'lsass.exe' and parent_process_name != 'wininit.exe') or
(process_name == 'LogonUI.exe' and not parent_process_name in ('winlogon.exe', 'wininit.exe')) or
(process_name == 'services.exe' and parent_process_name != 'wininit.exe') or
(process_name == 'svchost.exe' and parent_process_name != 'services.exe' and
not (parent_process_path == '*\\system32\\svchost.exe' and process_path == '*\\syswow64\\svchost.exe')
) or
(process_name == 'spoolsv.exe' and parent_process_name != 'services.exe') or
(process_name == 'taskhost.exe' and not parent_process_name in ('services.exe', 'svchost.exe')) or
(process_name == 'taskhostw.exe' and not parent_process_name in ('services.exe', 'svchost.exe')) or
(process_name == 'userinit.exe' and not parent_process_name in ('dwm.exe', 'winlogon.exe'))
)"
- json形式のSysmonログファイルに対して,4.で指定したEQLで検索を行う
PS> eqllib query -f my-sysmon-data.json --source "Microsoft Sysmon" $eql | ConvertFrom-Json
- 結果は以下のようになり,2つのプロセスが検出された。ともに親プロセスはservices.exeではなくProcess Hollowingされた可能性が高い
- それぞれのプロセスIDに対する以下のEQLを実行する
eqllib query -f my-sysmon-data.json --source "Microsoft Sysmon" "process where pid=7356"
eqllib query -f my-sysmon-data.json --source "Microsoft Sysmon" "process where pid=11228"
PID:7356はすでにTerminateされており,現在はPID:11228のプロセスが動いていることが確認された
Extracting IoC from Process Memory with strings2
ここでは,上述したToolで識別したProcess HollwingされたProcessからstrings2を用いてIoCを取得する手法を示す。
strings2は特定プロセスにおいてメモリに展開された文字列の抽出が可能なツールである
- strings2をこちらからダウンロードする
- 正規表現を用いてIP:Port,URLを検索する
- IP:Port
PS> ./strings2.exe -pid 11228 | select-string -Pattern '^[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\:[\d]{0,4}$' | sort | gu
- URL
PS> ./strings2.exe -pid 11228 | select-string -Pattern '^http(s)?://([a-zA-Z_0-9-]+.)+[a-zA-Z_0-9-]+(/[a-zA-Z_0-9- ./?%&=]*)?' | sort | gu
Case4: Volatility
Volatilityはメモリフォレンジックツールである。また,Pluginが豊富である。メモリダンプが必要。今回はVirtual Boxからメモリダンプを取得することを想定。
- VBoxManageを利用してホストOSからゲストOSを起動する
PS> .\VBoxManage.exe list vms # Virtual Boxで作成済みのゲストの名前とuuidの一覧を取得
PS> .\VBoxManage.exe startvm "guest name or uuid" #起動
- VboxManageでメモリダンプ(VirtualBox ELF64 core dump)を取得する
PS> .\VBoxManage.exe debugvm "guest name or uuid" dumpvmcore --filename output.dmp
- 最新のVolatilityをこちらからダウンロードする
- 考え方はEQLのときと同じで,プロセスツリーから親子関係が不自然なプロセスを確認する(今回は,Trickbotなのでsvchost.exeでgrepしている)
python vol.py --profile=[profile] -f ../output.dmp pstree | grep svchost.exe
PID:11228のプロセスのみ他のsvchost.exeと明らかに階層が異なり,親プロセスのIDも異なることを確認
- PID:11228とそれ以外のsvchost.exeの親プロセスを確認
python vol.py --profile=[profile] -f ../output.dmp pslist -p 604
PID:604はservices.exeであり,svchost.exeと自然な親子関係となっている
python vol.py --profile=[profile] -f ../output.dmp pslist -p 11020
PID:11020の親プロセスはメモリ上に存在せず確認できなかった。おそらく,Process Hollowingした後にTerminateされた
以上を踏まえると,PID:11228のsvchost.exeが不自然でありProcess Hollowingされたプロセスであると予想される
ref: What Malware Authors Don't Want You To Know Evasive Hollow Process Injection
※Volatilityは,上述したようにPluginが豊富であり,HollowFindやMalConfScanを用いれば,おそらくProcess Hollowingの検出は容易である