1
0
mirror of https://github.com/nganhkhoa/malware.git synced 2024-06-10 21:32:07 +07:00

Update analysis_processhollowing.md

This commit is contained in:
MxExTxH 2020-01-03 23:38:13 +09:00 committed by GitHub
parent 5dbe3289ef
commit 88e4404537
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -22,55 +22,79 @@
## Analysis contents ## Analysis contents
※以下,誤って解釈している部分や解析しきれず不足している部分がある可能性有(更新予定)
### File copy ### File copy
Trickbotの初期動作に関する説明 Trickbotの初期動作に関する説明
- CopyFileWによって特定のパスに自身(同一ファイル)のコピーの作成を試行する - CopyFileWによって特定のパスに自身(同一ファイル)のコピーの作成を試行する
- 特定パスにコピーが存在していなかった場合コピーを作成しShellExecuteWによってコピーされたファイルが実行される。その後自プロセスをExitProcessによって終了させる - 特定パスにコピーが存在していなかった場合コピーを作成しShellExecuteWによってコピーされたファイルが実行される。その後自プロセスをExitProcessによって終了させる
- 特定パスにコピーが既に存在していた場合CopyFileWは失敗し上記とは別の処理(Process Hollowing等)に分岐する(要するにShellExecuteWによって実行されたコピーのプロセスがこちらの分岐を通過する) - 特定パスにコピーが既に存在していた場合CopyFileWは失敗し上記とは別の処理(Process Hollowing等)に分岐する(要するにShellExecuteWによって実行されたコピーのプロセスがこちらの分岐を通過する)
![](https://github.com/mether049/malware/blob/master/Trickbot/img/shellexecute_2_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/shellexecute_2_720.png)
- CopyFileWによるコピー先はC:\ProgramData\բնութագրվում է.exeであった(ファイル名はGoole翻訳の検出結果によるとアルメニア語) - CopyFileWによるコピー先はC:\ProgramData\բնութագրվում է.exeであった(ファイル名はGoole翻訳の検出結果によるとアルメニア語)
![](https://github.com/mether049/malware/blob/master/Trickbot/img/filecopy_1_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/filecopy_1_720.png)
以降はコピーしたファイルに関するプロセスの処理の説明となる 以降はコピーしたファイルに関するプロセスの処理の説明となる
### VirtualAlloc and Data transition ### VirtualAlloc and Data transition
Process Hollowingにも利用するデータに関する説明 Process Hollowingにも利用するデータに関する説明
- コピーのプロセス実行中に5~7回VirtualAllocによる領域確保が確認された - コピーのプロセス実行中に5~7回VirtualAllocによる領域確保が確認された
![](https://github.com/mether049/malware/blob/master/Trickbot/img/virtualalloc_3_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/virtualalloc_3_720.png)
- 1回目のVirtualAllocでは0x2D000Byteの領域を確保する - 1回目のVirtualAllocでは0x2D000Byteの領域を確保する
- 0x2D000Byteは.dataのサイズと同じである - 0x2D000Byteは.dataのサイズと同じである
![](https://github.com/mether049/malware/blob/master/Trickbot/img/datasection_4_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/datasection_4_720.png)
- 確保した0x2D000Byteの領域に.dataをすべてコピーするわけではなく.dataのベースアドレス+0x7C3の位置からコピーを開始する - 確保した0x2D000Byteの領域に.dataをすべてコピーするわけではなく.dataのベースアドレス+0x7C3の位置からコピーを開始する
- +0x7C3のメモリダンプを確認するとPEファイルのようである - +0x7C3のメモリダンプを確認するとPEファイルのようである
- +7C3の位置のデータもすべてをコピーするわけではなく下図のように特定の条件にマッチした際にByteずつ書き込みを行う(詳細は述べない) - +7C3の位置のデータもすべてをコピーするわけではなく下図のように特定の条件にマッチした際にByteずつ書き込みを行う(詳細は述べない)
> 条件0x3C <= ECX <= 0x3E or EAX <= ECX > 条件0x3C <= ECX <= 0x3E or EAX <= ECX
![](https://github.com/mether049/malware/blob/master/Trickbot/img/datacopy_5_modify_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/datacopy_5_modify_720.png)
- また,.dataの+0x9C3~+0x2B5C3の位置のデータは下図のように上記とは別の処理でコピーされる - また,.dataの+0x9C3~+0x2B5C3の位置のデータは下図のように上記とは別の処理でコピーされる
![](https://github.com/mether049/malware/blob/master/Trickbot/img/datacopy2_6_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/datacopy2_6_720.png)
- コピーされたデータに対してデコードを行う - コピーされたデータに対してデコードを行う
- xorが用いられていた - xorが用いられていた
- デコードした結果からは64bitのPEファイルを示すような文字列が確認された(下図メモリダンプより) - デコードした結果からは64bitのPEファイルを示すような文字列が確認された(下図メモリダンプより)
![](https://github.com/mether049/malware/blob/master/Trickbot/img/decode_7_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/decode_7_720.png)
- 上記からさらにデコードを実施し3回目のVirtualAllocにより確保された領域(0x60000Byte)に書き込みを行う - 上記からさらにデコードを実施し3回目のVirtualAllocにより確保された領域(0x60000Byte)に書き込みを行う
- 下図のメモリダンプをファイルに保存して確認した結果64bitのPEファイルであった - 下図のメモリダンプをファイルに保存して確認した結果64bitのPEファイルであった
![](https://github.com/mether049/malware/blob/master/Trickbot/img/decode2_8_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/decode2_8_720.png)
- 5~6回目のVirtualAllocで確保した領域(ベースアドレス0x10001000)に対して,上記で確保した領域(0x60000Byte)に書き込まれたPEファイルの一部をコピーする - 5~6回目のVirtualAllocで確保した領域(ベースアドレス0x10001000)に対して,上記で確保した領域(0x60000Byte)に書き込まれたPEファイルの一部をコピーする
- 下図よりPEファイルの.text以下がコピーされている - 下図よりPEファイルの.text以下がコピーされている
![](https://github.com/mether049/malware/blob/master/Trickbot/img/copytext_9_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/copytext_9_720.png)
### Createting Process and Heaven's Gate (Process Hollowing) ### Createting Process and Heaven's Gate (Process Hollowing)
- CreateProcessWによってProcess Hollowingの対象となるプロセス(svchost.exe)を作成する - CreateProcessWによってProcess Hollowingの対象となるプロセス(svchost.exe)を作成する
- プロセスはサスペンド状態で作成される - プロセスはサスペンド状態で作成される
![](https://github.com/mether049/malware/blob/master/Trickbot/img/svchost_10_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/svchost_10_720.png)
- 以降のProcess Hollowingの処理はHeavens's Gate(64bitシステムに切り替え)を利用して行われていた - 以降のProcess Hollowingの処理はHeavens's Gate(64bitシステムに切り替え)を利用して行われていた
- ![](https://github.com/mether049/malware/blob/master/Trickbot/img/heavensgate_11_720.png)
![](https://github.com/mether049/malware/blob/master/Trickbot/img/heavensgate_11_720.png)
- ここから64bitの命令群に遷移する(32bit向けのユーザモードデバッガでの追跡が困難になる。WinDbgなどのカーネルモードデバッガなら追跡可能) - ここから64bitの命令群に遷移する(32bit向けのユーザモードデバッガでの追跡が困難になる。WinDbgなどのカーネルモードデバッガなら追跡可能)
- 遷移先は0x100100であり先ほどPEファイルの.text以下をコピーした領域である64bitPEファイルを保存してそれに対してユーザモードデバッガでデバッグすることは可能 - 遷移先は0x100100であり先ほどPEファイルの.text以下をコピーした領域である64bitPEファイルを保存してそれに対してユーザモードデバッガでデバッグすることは可能
![](https://github.com/mether049/malware/blob/master/Trickbot/img/heavensgate_16_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/heavensgate_16_720.png)
- ntdll.dllのexport table上の関数名リストからつずつ関数名字列をとりだして目的の(Process Hollowingに利用すると思われる)関数名と一致するものを探し,さらにそのアドレスを取得する?(ここは詳細に確認していない。このあたりは[こちら](https://www.cyberbit.com/blog/endpoint-security/latest-trickbot-variant-has-new-tricks-up-its-sleeve/)でも詳しく書かれている気がする) - ntdll.dllのexport table上の関数名リストからつずつ関数名字列をとりだして目的の(Process Hollowingに利用すると思われる)関数名と一致するものを探し,さらにそのアドレスを取得する?(ここは詳細に確認していない。このあたりは[こちら](https://www.cyberbit.com/blog/endpoint-security/latest-trickbot-variant-has-new-tricks-up-its-sleeve/)でも詳しく書かれている気がする)
![](https://github.com/mether049/malware/blob/master/Trickbot/img/ntdll_12_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/ntdll_12_720.png)
- 目的のAPIは関数名のCRC32値(ここも詳細に確認していない)で比較される - 目的のAPIは関数名のCRC32値(ここも詳細に確認していない)で比較される
![](https://github.com/mether049/malware/blob/master/Trickbot/img/crccalc_13_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/crccalc_13_720.png)
- 目的のAPIとCRC32の組み合わせ<br> - 目的のAPIとCRC32の組み合わせ<br>
@ -81,9 +105,12 @@ Process Hollowingにも利用するデータに関する説明
> 7a65c193 NtWriteVirtualMemory<br> > 7a65c193 NtWriteVirtualMemory<br>
> e873107e NtQueryInformationProcess<br> > e873107e NtQueryInformationProcess<br>
> 918a52f1 NtResumeThread<br> > 918a52f1 NtResumeThread<br>
![](https://github.com/mether049/malware/blob/master/Trickbot/img/crccmp_14_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/crccmp_14_720.png)
- 取得したアドレスを利用してAPIを呼び出しProcess Hollowingを終了させる - 取得したアドレスを利用してAPIを呼び出しProcess Hollowingを終了させる
- 各APIの呼び出しで処理が失敗した場合その時点でプロセスが終了する - 各APIの呼び出しで処理が失敗した場合その時点でプロセスが終了する
![](https://github.com/mether049/malware/blob/master/Trickbot/img/apicall_15_720.png) ![](https://github.com/mether049/malware/blob/master/Trickbot/img/apicall_15_720.png)
## to do.. ## to do..