1
0
mirror of https://github.com/nganhkhoa/malware.git synced 2024-06-10 21:32:07 +07:00
mether049-malware/detecting_ph_process.md
2020-03-01 03:58:18 +09:00

13 KiB
Raw Blame History

Identification of Hollowed out processes

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が内部で用いられている。

  1. Hollows Hunterをこちらからダウンロードする
  2. 管理者権限でPowerShellを実行
  3. 使用方法は/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
  1. 結果は以下のようになり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
  1. Lokiをこちらからダウンロードする
  2. 以下のオプションで実行する(時間を要するので不要な機能は用いないようにする)
PS> .\loki.exe --nofilescan --nolevcheck --noindicator --onlyrelevant --nolisten 
  1. 結果は以下のようになり2つのプロセスが検出されたがHollows Hunterと同様にPID:11228のsvchost.exeを検出している

Case3: EQL(Event Query Language)

EQLはWindowsイベントログ(Sysmonログ等)の検索・解析を可能にするクエリ言語。EQLを用いたスレットハンティングについてはこちらが参考になる

  1. EQLをこちらの手順でインストールする
  2. Sysmonをこちらからダウンロードし以下のようにインストールする
Sysmon.exe -AcceptEula -i -h * -n -l
  1. Sysmonログはjson形式に変換する必要がある。以下のコマンドは直近5000件のSysmonログをjson形式に変換しmy-sysmon-data.jsonというファイルに出力している
PS> Get-LatestLogs  | ConvertTo-Json | Out-File -Encoding ASCII -FilePath my-sysmon-data.json
  1. クエリの内容を指定する。以下のクエリはプロセスの親子関係を確認し不自然なプロセスを検索している。例えば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'))
)"
  1. json形式のSysmonログファイルに対して4.で指定したEQLで検索を行う
PS> eqllib query -f my-sysmon-data.json --source "Microsoft Sysmon"  $eql | ConvertFrom-Json
  1. 結果は以下のようになり2つのプロセスが検出された。ともに親プロセスはservices.exeではなくProcess Hollowingされた可能性が高い

  1. それぞれのプロセス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は特定プロセスにおいてメモリに展開された文字列の抽出が可能なツールである

  1. strings2をこちらからダウンロードする
  2. 正規表現を用いてIP:PortURLを検索する
  • 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からメモリダンプを取得することを想定。

  1. VBoxManageを利用してホストOSからゲストOSを起動する
PS> .\VBoxManage.exe list vms # Virtual Boxで作成済みのゲストの名前とuuidの一覧を取得
PS> .\VBoxManage.exe startvm "guest name or uuid" #起動
  1. VboxManageでメモリダンプ(VirtualBox ELF64 core dump)を取得する
PS> .\VBoxMnage.exe debugvm "guest name or uuid"  dumpvmcore --filename output.dmp
  1. 最新のVolatilityをこちらからダウンロードする
  2. 考え方はEQLのときと同じでプロセスツリーから親子関係が不自然なプロセスを確認する(今回はTrickbotなのでsvchost.exeでgrepしている)
python vol.py --profile=[profile] -f ../output.dmp pstree | grep svchost.exe

PID:11228のプロセスのみ他のsvchost.exeと明らかに階層が異なり親プロセスのIDも異なることを確認

  1. 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が豊富でありHollowFindMalConfScanを用いればおそらくProcess Hollowingの検出は容易である