Netwalker malware deobfuscation - From PowerShell to EXE

最近開始上 Zero2Automated 這門課,覺得東西相當不錯,有興趣的話可以參考看看。

這篇會簡單介紹課程裡其中一個 Blog,是關於如何從 PowerShell deobfuscate 抓出原本的 malware並且繼續分析。

本魯道行不夠,先寫基本如何抓到exe檔案 😅


前言:

Malware 開發者為了避免自己辛苦寫出來的東西被輕易拿去分析,搞懂在做什麼,所以需要把sample給層層攪亂,增加分析的困難度

Sample hash: AAC57162DC1311F07A869F7163BD30E0D62DCC0E


*有好心人士提供了 sample: 

https://app.any.run/tasks/2e6da4bf-0016-4d19-b5c2-4a84aeda8d90/


開始分析吧!


1. 用Text editor 打開 sample, 可以看到用了基本的Base64 + 大小寫變換的處理

InVokE-ExPRESSIoN -COMmand $([StrinG]([SySTEM.TexT.ENcOdInG]::ASCII.GETStRiNG([SysTEM.CoNVErT]::FRomBAsE64StRiNG("ICAgICBbYllURVtdXSAgICAgICAgICRlRkdDU2pXS0tQcUxHUElZcCAgICAgICAgID0gICAgICAgDQoNCg0KDQoNCg0KQCgweDY3LDB4NjcsMHgxQywweDI1.......QoNCg0KDQoNCg0KDQo="))))


2. 要處理不難,把中間那串丟到 https://www.base64decode.org/ 就可以,會得到以下的東西

[bYTE[]] $eFGCSjWKKPqLGPIYp = @(0x67,0x67,0x1C,......x32,0x2B,0x2B,0x4a,0x4d) for ( $qTOJScZVUn = 0; $QTOjsCZvUn -lt $eFGCSjWKKPQLGpIYP.LeNgth; $qtOJscZvUN++ ) { $EFGCSjWKKPqlGpIYP[$qtOJscZVUN] = $EFGCSJWkkPqLGPIYP[$QtOJscZvUN] -BxOr 0x47 } $pDJjNSNEwQy = [SYSteM.TExt.EnCODiNg]::ASCII.GEtStRIng( $eFGCSjWKkPQlGPIYP ) $UqYpIOZoleKuXXbA = [SCRiPtblOCK]::CreAtE( $PDJjNSNEWQy ) INVoKE-CoMMaND -SCRiptBLocK $UQYPIoZOLEKuXXBA 


稍微看一下base64 decode後的結果,發現仍然是 powershell,作者相當用心.....繼續往下看並整理一下

for ( $qTOJScZVUn = 0; $QTOjsCZvUn -lt $eFGCSjWKKPQLGpIYP.LeNgth; $qtOJscZvUN++ ) { 

$EFGCSjWKKPqlGpIYP[$qtOJscZVUN] = $EFGCSJWkkPqLGPIYP[$QtOJscZvUN] -BxOr 0x47 

$pDJjNSNEwQy = [SYSteM.TExt.EnCODiNg]::ASCII.GEtStRIng( $eFGCSjWKkPQlGPIYP ) 

$UqYpIOZoleKuXXbA = [SCRiPtblOCK]::CreAtE( $PDJjNSNEWQy ) INVoKE-CoMMaND -SCRiptBLocK $UQYPIoZOLEKuXXBA 


3. 這個PowerShell還是夾帶著一大串hex string,以及 XOR key 0x47,所以接下來要想辦法把這巨大的hex string做 XOR。

方法也不難,找一台Windows VM,打開 PowerShell ISE ,修改成下面圖片,執行後就會自己做XOR,在下方輸入變數名稱,PowerShell ISE就會把最後XOR的結果印出來

記得把最後一行註釋起來,不然會執行malware並且加密所有檔案!

記得把最後一行註釋起來,不然會執行malware並且加密所有檔案!

記得把最後一行註釋起來,不然會執行malware並且加密所有檔案!


發現還是PowerShell,作者相當用心呢


4. 稍微觀察一下這個PowerShell檔案,可以看到有兩個很巨大的變數

[byte[]]   $ptFvKdtq=@(0xad,0xde,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x........

[byte[]]   $GxwyKvgEkr=@(0xad,0xde,0x90,0x00,0x03,0x00,0x00,0x00,0x04,..........


為什麼??繼續往下看可以發現是因為作者相當貼心,32bits / 64bits 都要照顧到

分析到這,既然已經開始判斷32/64位元,代表真正的執行檔也離我們不遠了!


5. 寫個小script把hex string抓出來吧!

將bytearray存成檔案 (我存成netwalker.bin) 並且用sciprt讀取,轉成hex format最後再存起來



6. 當你喜孜孜想說可以用IDA來看,但卻發現IDA說這是普通binary?????


WTF???

「黑人問號」的圖片搜尋結果


7. 用 Text Editor 打開Dump出來的檔案,發現以下畫面


發現身為一個EXE最重要的Magic Byte不對,作者心機真重.....
關於Magic Byte可參考這裡

好,直接在Text Editor中把前兩個文字刪掉,改成MZ,並且用IDA再打開一次




Yeah ~ 終於看到PE Format 啦! 防毒軟體也跟著逼逼叫呢。


簡單總結一下思路

PowerShell -> Base64 Decode -> XOR Decode -> Change Magic Byte -> Final EXE


若是想針對最後的PowerShell了解更多的話可以參考這裡大神寫的Blog

https://blog.trendmicro.com/trendlabs-security-intelligence/netwalker-fileless-ransomware-injected-via-reflective-loading/


-0xbc


留言

這個網誌中的熱門文章

惡意程式分析 - 常用工具篇

Offensive Security Certified Professional (OSCP) 滲透測試證照經驗分享

Offensive Security Certified Professional Review