企業資安防禦的關鍵點:暗網情資>>>立即了解>>>
技術分析

蠕蟲惡意程式 Win32.Parite 深度分析與掃描程式

2023.02.14GSS & IR Team
Share:
TeamT5 資安事件應變團隊(Incident Response Team) 在某次事件調查中,發現受害主機中的執行檔遭受一款名為 Win32.Parite 的蠕蟲惡意程式感染。 受到感染的主機,會散播至其他執行檔並等待攻擊者連線;若連線成功後,攻擊者可在受感染的主機上執行各種通訊和數據收集行為,影響甚深。
我們於本文詳細分析該惡意程式,也開發掃描程式與說明解毒方式,協助企業提升資安防禦能量。 我們並呼籲尚在使用 WinXP/2003/7 等32位元作業系統的組織、企業,建議可以使用掃瞄程式來掃內網系統。

惡意程式 Win32.Parite 基本資訊

how-to-detect-and-recover-from-virus-win32-parite_pic1.png 圖片來源: VirusTotal

惡意程式分析

Win32.Parite - Shellcode

TeamT5 取得惡意檔案,可以使用 Stud_PE 觀察,可以看到節區(Sections)裡面多了一個名稱為.heb節區,並且程式進入點(Entry Point)被指向該節區。Win32.Parite病毒的特徵,就是會將自己插入在最後一個節區,該節區名稱是隨機的字母組合。
how-to-detect-and-recover-from-virus-win32-parite_pic2.png

進入點是一段小小的解碼程式(Decoder),暫存器中的edx為xor解碼的運算數值,而esi為編碼資料的位址,edi為編碼資料的大小。解碼時,運算一次為4 bytes,全部處裡的範圍是0x43502E+4~0x43502E+0x59C,因為使用[push/pop] dword ptr [esi+edi]的手法,所以這裡的xor的目標位址才會是[esp]。
how-to-detect-and-recover-from-virus-win32-parite_pic3.png

在理解了上述的組語後,可以使用010 Editor來做XOR的運算。解開後可以發現是一段shellcode的程式碼。 how-to-detect-and-recover-from-virus-win32-parite_pic4.png
how-to-detect-and-recover-from-virus-win32-parite_pic5.png

有趣的是此蠕蟲惡意程式也有變形的功能,觀察三個被感染的檔案,從中發現到shellcode的指令都不一樣,但目的都是相同的,都是要取得解碼的運算數值、編碼資料的位址與編碼資料的大小。 how-to-detect-and-recover-from-virus-win32-parite_pic6.png

解碼後,繼續分析shellcode程式碼,解開後的第一個組語的指令是一個call,下面緊接著是一個Parite自訂義的結構,裡面比較有趣的是原程式的進入點(OEP)是被編碼保護起來的。 how-to-detect-and-recover-from-virus-win32-parite_pic7.png

Shellcode的主程式的功能僅有幾項:
  • GetDeclareAPI:取得要時用的API位址存於Stack
  • RegQuery_PINF:查詢PINF機碼是否存在,內容存放病毒主體路徑
  • Call_DLL_Initiate:呼叫主程式DLL中的Initiate,裡面包含解開EXE原始進入點
  • Drop_DLL_File:如果PINF不存在時,會丟出病毒主體(DLL)及建立PINF登入檔機碼數值
how-to-detect-and-recover-from-virus-win32-parite_pic8.png

Shellcode透過GetDeclareAPI(sub_435254)取得一些必要的Windows API後,接著透過RegQuery_PINF(sub_435360)查詢位於HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer的PINF鍵值。
how-to-detect-and-recover-from-virus-win32-parite_pic9.png

在被感染的機器中可以看到PINF的數值內容是\x09\x00,這地方的9為病毒版本,以\x00分隔,後再接DLL路徑。
how-to-detect-and-recover-from-virus-win32-parite_pic10.png

若該鍵值存在並且前2 bytes的數值大於等於9,shellcode會透過Call_DLL_Initate(sub_4353C8)載入病毒主體的DLL模組,並使用GetProcAddress取得Initiate函數位址,傳入000435032的組態位址後並且跳入執行。
how-to-detect-and-recover-from-virus-win32-parite_pic11.png
若該鍵值不存在,shellcode則會透過Drop_DLL_File(sub_435400)將位在後方的病毒主體(DLL)解碼後丟出來,接著執行Call_DLL_Initate(sub_4353C8)載入病毒主體的DLL模組。 how-to-detect-and-recover-from-virus-win32-parite_pic12.png

而DLL的偏移位址(Offset)及檔案大小(Size),還有編碼的XOR key,都可以在組態中看到。 how-to-detect-and-recover-from-virus-win32-parite_pic13.png

在Drop_DLL_File(sub_435400)函數裡面會呼叫Decoder_Content(sub_4355A0)函數,其內容是使用xor dword進行編解碼。 how-to-detect-and-recover-from-virus-win32-parite_pic14.png

Win32.Parite - 病毒主體

解碼出來的DLL使用UPX加殼,病毒主體模組本身是使用Delphi所撰寫,所導出的Initiate函數第23行有一個解碼原始進入點(OEP)的函數。 how-to-detect-and-recover-from-virus-win32-parite_pic15.png

Decode_OEP(sub_4022BC)函數中的程式碼,主要是取得組態區塊中的43504D、43506E的二個陣列位址,經由sub_40232C函數進行運算,產生出16 bytes的數值,拆成4組DWORD值,與被編碼的OEP進行四次的XOR運算,最後的結果為原始OEP,有了OEP就能順利的修復被感染的PE執行檔。
how-to-detect-and-recover-from-virus-win32-parite_pic16.png

接著使用SetWindowsHookExA設置全局鉤子,將DLL注入所有處理程序中。 how-to-detect-and-recover-from-virus-win32-parite_pic17.png

當被注入的處理程序為explorer.exe時,Win32.Parite則會開始執行蠕蟲的行為。
how-to-detect-and-recover-from-virus-win32-parite_pic18.png

Win32.Parite - 後門功能

在病毒主體DLL中的程式碼,可以看到一段有興趣的程式碼,Win32.Parite支援後門功能,後門利用UDP協議來發送指令,被控制端會監聽UDP 30167通訊埠等待接收指令,被控制端回報之結果會回傳到控制端的UDP 30168通訊埠,需要上傳資料時,則需要在控制端上監聽TCP 30169通訊埠,等待被控制端主動連線,此時就能上傳資料內容。
how-to-detect-and-recover-from-virus-win32-parite_pic19.png

回報主機資訊

控制端發送出e的字元到被控制端的UDP 30167通訊埠。 how-to-detect-and-recover-from-virus-win32-parite_pic20.png

被控制端會回報主機資訊到控制端的UDP 30168通訊埠。 how-to-detect-and-recover-from-virus-win32-parite_pic21.png

執行指令

控制端發送出y的字元,接著DWORD值,1是顯示在畫面中,0是隱藏在背景中執行,隨後跟著要下達的指令(可接參數),最後以\x00結尾。
how-to-detect-and-recover-from-virus-win32-parite_pic22.png

當指令成功被執行後,被控制端會回傳g字元,後面接上Done的字串。 how-to-detect-and-recover-from-virus-win32-parite_pic23.png

上傳檔案

控制端發送出z的字元,接著檔案名稱,最後以\x00結尾,該檔案會被存放在%WINDIR%資料夾下。 how-to-detect-and-recover-from-virus-win32-parite_pic24.png

控制端監聽TCP 30169通訊埠,等待被控制端連線成功後之後便可以傳送的資料內容,結束連線後,資料將被寫入到檔案裡面。 how-to-detect-and-recover-from-virus-win32-parite_pic25.png

修復被感染的檔案

被感染的檔案差異

這裡分析一下被感染後的執行檔有什麼變化:
  • Section數多1
  • 原始進入點(OEP)被指向最後一個病毒所在的Section
  • 載入記憶體的映像檔(Image)變大
  • 修改了.rdata的屬性
  • 新增了新的病毒節區
how-to-detect-and-recover-from-virus-win32-parite_pic26.png

檔案比對中,還有最後被修改的二個地方,分別為C600、E9F8。 how-to-detect-and-recover-from-virus-win32-parite_pic27.png

可以看到這二個地方,其實是Import Tables中kernel32.dll的前二個函數,感染後的檔案因為沒寫自己取API的Shellcode,因此靠著在導入表中插入LoadLibraryA,GetProcAddress來確保Shellcode中能正常使用此二個函數取得要用的API,在執行Shellcode時會將其還原。
how-to-detect-and-recover-from-virus-win32-parite_pic28.png

解毒程式

在了解被感染的檔案有什麼改變之後,我們便可以撰寫解毒程式來修復被感染的檔案。 解毒程式基本上做了以下的事情:
  1. 檢查進入點是否落在最後一個節區,且節區名稱為 .
  2. 讀取xor解碼的運算數值、編碼資料的位址與編碼資料的大小
  3. 解碼並讀取Parite的組態
  4. 解碼原始進入點(oep)
  5. NumberOfSections減1
  6. SizeOfImage減最後一個節區的虛擬大小
  7. 刪除最後一個節區頭
  8. 修改.rdata節區的屬性
  9. 修復導入表

使用方法

Usage: fix.exe <file or directory> how-to-detect-and-recover-from-virus-win32-parite_pic29.png

測試

> fix.exe setupSrv.exe
how-to-detect-and-recover-from-virus-win32-parite_pic30.png

修復好的檔案會在同樣路徑,檔案名稱以_clean結尾。 查看修復的檔案,可以看到最後一個被感染的節區與進入點(ep)都已經修正。 how-to-detect-and-recover-from-virus-win32-parite_pic31.png

檢查主機是否受害

我們了解當控制端發送出e的字元到被控制端的UDP 30167通訊埠後,被控制端會回報主機資訊到控制端的UDP 30168通訊埠。 因此我們可以利用這點開發一個掃描程式,對內網主機傳送e的字元並在發送端監聽UDP 30168通訊埠等待回傳資訊。

掃描程式

使用方法

Usage: scan.exe iplist
how-to-detect-and-recover-from-virus-win32-parite_pic32.png

測試

> scan.exe 127.0.0.1
> scan.exe 192.168.0.0/16
how-to-detect-and-recover-from-virus-win32-parite_pic33.png

掃描程式工具下載點

IoC

file namemd5compiler-stamp (UTC) type
setupSrv.exec5e7e7007b7ea6a3361fea7d4b0298592009-12-04 13:35:59 UTCEXE
cft3B18.tmpfe763c2d71419352141c77c310e600d22001-10-11 12:01:58 UTCDLL

TeamT5 杜浦數位安全團隊長期研究與解析駭客族群入侵行為,具備第一線國內外資安事件處理的豐富經驗。當資安事件發生,我們可快速完成受駭現場與歷史軌跡的綜整分析,發掘攻擊者的入侵過程與手法,提供事件處理的深入分析及建議,協助您復原與改善資安環境。
若您有資安事件處理、應變的需求,歡迎填寫諮詢表單: https://teamt5.org/tw/contact-us/

參考資料

2023.02.14GSS & IR Team
Share:

Related Post

為提供您最佳的服務體驗,本網站使用 Cookies。當您使用本網站,即表示您同意 Cookies 技術支援。更多資訊請參閱隱私權與Cookies使用政策。