Process Injectionを解析する
Posted on
今回の解析対象について
通称PLEADと呼ばれるマルウェアを対象とします。
- RAT (Remote Access Trojan)
- TrendMicroのレポート上ではBKDR_PLEAD.ZTDK-Bと表記
- SHA256: c303bab9e2655739ee85adf92cc9e9c9b1e4371dddeb9270cbbb81f34f4f96b9
JPCERTのブログにも解析記事があります。
https://blogs.jpcert.or.jp/ja/2018/05/linopid.html
対象検体によるProcess Injectionの流れ
以下の流れで解析を行っていきます。
CreateProcessA();
で64bitのiexplore.exeを起動VirtualAllocEx();
でiexplore.exe内にShellcodeのメモリを確保WriteProcessMemory();
でVirtualAllocExで確保したメモリにShellcodeを書き込みCreateRemoteThread();
でShellcodeを新しいThreadとしてiexplore.exeに実行させる
余談:Process InjectionとProcess Hollowingの違い
ATT&Kの情報を読んでもほとんど同じことを行っているように思えるのですが、どうやらProcess Hollowingの場合にはターゲットプロセスのメモリをアンマップした領域に悪性のコードを書き込むことを指しているようです。
https://attack.mitre.org/techniques/enterprise/ 参照
解析方法(Code injection動作の解析)
ここでは、Process Injection部分の解析の流れを上で紹介した検体をもとに説明します。
まずマルウェアがCreateProcessA();
で自分の子プロセスを新しく作成します。
引数lpCommandLine
としてebx
の値が使われているため、このebxの指すアドレスに実行されるプロセスが書かれています。
ebx
を見てみると32bitのiexplore.exeを実行しようとしていることが分かります。
(実は今回の解析時にこのiexplore.exeのパスの”Program Files”を”Program Files (x86)“に手動で書き換えてしまいました。理由は、32bit(WOW64)から64bitプロセスに対してCreateRemoteThread();
を実行するとERROR_ACCESS_DENIED(5)で失敗するからです。この詳細はまた別の記事にて紹介します。)
CreateProcessA();
は引数として渡したlpProcessInformation
のメンバからhProcess
を取り出し、iexplore.exeに対してVirtualAllocEx();
を呼び出します。
これは不正なコードをInjectionするメモリ領域を確保する為です。
VirtualAlloc();
で確保したメモリにWriteProcessMemoryA();
にて不正なコードを書き込み(Injection)します。
CreateRemoteThread();
にて、不正なコードをInjectionしたメモリのアドレスをlpStartAddress
に入れてiexplore.exeのスレッドとして実行します。
ここまでで、Process Injectionの流れは終了です。この後、iexplore.exeが不正な挙動を実行していくこととなります。
解析方法(Code injectionされたプロセスの解析)
今回の例では、Code injectionされたiexplore.exeの解析を進める方法を示します。
上述のCreateRemoteThread();
実行の直前から開始します。 デバッガを新しく開き、CreateProcessA();
で作られたiexplore.exeのプロセスにAttachします。私の場合は今まで通りIDA Proで行います。
Shift+F7でSegmentsを開き、不正コードがInjectionされたセグメント(実行フラグXが付いているはずです)を右クリックしBreak on accessを選択します。そうすると、選択セグメント全体にハードウェアブレイクポイントが張られます。
ハードウェアブレイクポイントが張られていることを確認し、F9でContinueしておきます。
ここで初めて、Code injectionする側のCreateRemoteThread();
をステップ実行します。
すると、iexplore.exeがブレイクポイントで止まっているので動的解析を始めることが出来ます。