作者:
衛士通攻防實驗室
·
2016/05/31 10:34
0x00 背景
日前實驗室捕獲一個樣本。遠遠望去,像是搜狗輸入法,在測試機中點開一看,彈出一款遊戲的物價表,再看PE檔案屬性,還帶正常著數字簽名,一副人畜無害的樣子。經過一番認真分析後。發現遠沒有這麼簡單,這裡就分析過程記錄一下,希望其他安全工作者有些許幫助。
先介紹一下所謂白名單免殺。隨著病毒與殺軟之間的鬥爭,殺軟的手段不斷地增多、增強,由早期傳統的特徵碼匹配演算法發展到目前虛擬機器技術、實時監控技術等流行的查殺演算法。但始終存在一種最直接也最根本的免殺方式——白名單免殺。病毒就安安靜靜地躺在殺軟的白名單中,誰閒的沒事會去查水錶呢?
當了解了白名單免殺的基本含義之後,就可以針對樣本進行深入的研究,本文以下內容就是筆者拿到樣本之後,逐步分析樣本主要功能的完整過程,其分析環境如下:
- 分析環境:win 7 x86 VMware
- 分析工具:IDA、CFF、OD
0x01 樣本概述
樣本包含5個檔案:
File name |
size |
MD5 |
attribute |
nvvsvc1.exe.exe |
451.50 KB (462336 bytes) |
4D9B3A508BC2402A86E10F7907022263 |
hidden |
HWSignature.dll |
48.50 KB (49664 bytes) |
85F50E1D2DE076079D98F09416E4C710 |
hidden |
HanziSort.dat |
158.75 KB (162557 bytes) |
4FB42CBC7ADD3CF2AB3F0A99B9E7CE25 |
hidden |
圖1 |
Shortcut linked to cmd |
cmd /c nvvsvc1.exe & exit |
Shortcut |
01.jpg.jpg |
99.07 KB (101446 bytes) |
78501660AD39494A7248BA0C96989494 |
hidden |
- nvvsvc1.exe:即為搜狗輸入法的更新工具,用virusbook檢視後可判定完全沒有問題。此外,該檔案有正常的數字簽名,見下圖。
![p1](https://i.iter01.com/images/33cf964ec90b1da29d82c658478f40336b4aa2c25f54d36fb9b4237d3269aafe.jpg)
- HWSignature.dll:這個DLL原本是搜狗輸入法的硬體簽名DLL,該樣本中被劫持為惡意劫持。
- HanziSort.dat:原本為搜狗輸入法與漢字相關的資料檔案,該樣本中被替換為其他資料檔案。
- 01.jpg.jpg:一副jpg圖片,內容為《怪物獵人官方最新價格表》,後文有展示。
- 圖1:指向cmd的快捷方式,其引數為
cmd.exe /c nvvsvc1.exe & exit
其中,nvvsvc1.exe為主程式,其目的是載入HWSignature.dll,而HWSignature.dll會載入並解碼HanziSort.dat, 進一步的,HanziSort.dat會再次解碼自身並在記憶體中釋放svchost2.dll,此後手動載入svchost2.dll,該DLL為包含惡意程式的主要功能。
傳播方式:以《怪物獵人官方最新物價表》為魚餌進行釣魚,下載解壓後,其他檔案隱藏,只能看到名稱為“圖1”的檔案,點開後確實會展示圖片,但木馬也會載入。筆者建議廣大遊戲玩家,下載的攻略要先看清是什麼東西,再點開檢視內容。
0x02 主程式分析
拿到樣本之後,首先放到virusbook查了查,主程式想必沒問題,而除此之外的一個DLL就被查出有問題了。很明顯,這是一個透過DLL劫持載入自己的木馬樣本,這種透過DLL劫持的木馬,可以算是白名單免殺嗎?這個問題先放一放,後文(0x8 結語)會給出筆者的看法。
IDA分析主程式,絕大部分都是輸入法相關的操作,中規中矩。值得注意的是,此處建立了8個執行緒。
![p2](https://i.iter01.com/images/a2b8675b7e3ef30834fc90f6f400b3fc23c9c40c6c3be2ab4e98541fdf8f3574.jpg)
這其中第4個執行緒,即執行sub_427C80的執行緒會進一步呼叫sub_42F090函式,在該函式的子函式中,會載入HWSignature.dll,但此處被樣本劫持,用來執行其惡意功能。
![p3](https://i.iter01.com/images/de9f0c454c9cbae4f54012afadfd429e62749741fc5b15f0f798b649351c9bb4.jpg)
0x03 DLL分析
跟進這個DLL,進一步分析該DLL的行為。無關行為不說,該DLL會開啟HanziSort.dat檔案:
![p4](https://i.iter01.com/images/b1d94c3502876b886c69eb9c084b0cc68dedab23daeda0492500e399625cb203.jpg)
讀取其內容,並解碼:
![p5](https://i.iter01.com/images/a2226a81393bfd5a6d61cdabf11ba652ff673577f7fb63808700c746317b800f.jpg)
其解碼方式很簡單,只是把讀取到的檔案內容逐位元組的與0x56做異或運算。解碼之後,成為包含可執行指令的程式段:
![p6](https://i.iter01.com/images/016dfad6b80308494d31a1bbbabeeca9ead89d304636ccc751cfb327f9d2ef1f.jpg)
此後,程式會透過retn的方式跳到解碼的程式碼段執行。
0x04 DAT分析
在DAT解碼的程式碼中,首先會尋找解碼內容為0xDDCCBBAA的位置:
![p7](https://i.iter01.com/images/c0a16582bb498618bee545f42156225cfa6953276b3e3be0d31cf3a80c2c3db0.jpg)
透過該地址,可以輔助完成一些列的定位操作,具體內容不做介紹。進而會呼叫VirtualAlloc函式分配記憶體空間,然後透過memcpy函式將指定資料複製到申請的記憶體中:
![p8](https://i.iter01.com/images/c3b6faaad59fcb2bacee7ed8dca6998151f5acabf93346b8aa15e877f2124bec.jpg)
![p9](https://i.iter01.com/images/896aaa933447c8e7982a29426eb629b0eac347ac6e259aa58c085fc9c0fd9eb7.jpg)
而複製過去的記憶體段,會再一次進行解碼:
![p10](https://i.iter01.com/images/b3a31f2c110235689d837efc0cd88d7c7531798ef944302c48d7d63b8d9104ba.jpg)
其解碼方式同樣比較簡單,是逐位元組與0xCC進行異或運算。當完整所有解碼工作之後,可以發現解碼之後的記憶體為一個完整的PE檔案:
![p11](https://i.iter01.com/images/5d5a1baf88612edc88acab9151b49a7d35b08fc2f3480501a38a3a378f94c213.jpg)
將該PE檔案dump出來,用檢視CFF看下,可以確認是個完整的DLL:
(忽略一些細節吧。筆者懶得打碼了。)
這個DLL叫做svchost2.dll,後面的程式碼可想而知,新申請一塊記憶體
![p13](https://i.iter01.com/images/700fb96405b29e2ce58588c3a43a6e0f6cd0ab8a009844958525ac3c0adcfc91.jpg)
然後手動完成PE的載入流程:
![p14](https://i.iter01.com/images/87018f3a75606cc21df42caf255d4f5d90cc8b67863ecd48742e39617fe5a2ab.jpg)
以及根據匯入表和重定位表做一些修復工作,並載入所需的各種DLL,最後呼叫VirtualProtect更改頁保護。
![p15](https://i.iter01.com/images/0dd1e63a31172640493470e726e32fc82a5b4b287e376977e0c29567c547732b.jpg)
完成以上操作之後,呼叫DLL main函式:
![p16](https://i.iter01.com/images/f7ca0f661d55b67214250e3c9ad14614b2390b43c3ec4201bbb74cfc7c208a37.jpg)
DLL的主函式並沒有什麼需要深入分析的地方,這裡略過。DLL main返回後,會查詢DLL匯出的mystart函式:
![p17](https://i.iter01.com/images/219e53669f296ac18c09023a9db45450315960e23c76eaa1d8894bb7c3e9a51e.jpg)
最後呼叫mystart:
![p18](https://i.iter01.com/images/3de8c09e04d2e7fa5233f1c81e2d12494d25ce2deadef8f741572ce4e9263669.jpg)
0x05 mystart分析
在該函式中,首先會獲得當前僅程式的名字,並判斷名字中是否包含”1.exe”字串。
![p19](https://i.iter01.com/images/81b0e7860a83c88ee3bdb40ba593ee277b0ae3755c283d84be688dc3d4d36a81.jpg)
獲得的樣本中,當然是包含該字串的。接下來,會進行一些有意思的事。首先會呼叫WinExec執行”taskkill /f /im cmd.exe
”命令,然後建立一個互斥體。
![p20](https://i.iter01.com/images/f951b0fed6d5ba9410b2f6a4aab13e9f35673a0dd03764a64bf2af13edc3b8d9.jpg)
進一步的,該樣本會在C:\Users\zzz\AppData\Roaming建立一個資料夾,其名字隨機:
![p21](https://i.iter01.com/images/02554e51f8f677b1c23dc3759834d8e73e7c8842742e1d472173d70b7093a8aa.jpg)
在本次分析中為:C:\Users\zzz\AppData\Roaming\dptpbzwoztxwrh,並將樣本所在的資料夾中所有檔案都複製到該目錄下,包括ida生成的幾個檔案,但排除01.jpg.jpg。對於這幅圖片,該樣本會呼叫cmd執行rundll32.exe shimgvw.dll imageview_fullscreen 01.jpg.jpg,其作用就是把樣本中的01.jpg.jpg展示出來:
(01.jpg.jpg :什麼仇什麼怨?)
如此一來,受害者看到了想了解的《價格表》,也不會懷疑該檔案是木馬了。此外,複製到Roaming的主程式會重新命名為MSUpdateXXXXXXXX.exe,XXXXXXXX表示8位隨機字母。注意,IDA生成的幾個檔案也會被複制過去並重新命名。
![p23](https://i.iter01.com/images/da0afd229d40b420770805a39b0887667e82791ee819eaecee308e413cb86548.jpg)
複製完成之後,釋放互斥體,並Sleep(0x2EE0)的時間。
![p24](https://i.iter01.com/images/3f11b433d7f9294ce07f3abd3fc7e0225249fa8edddd69a289aceef7a9ff516e.jpg)
並登錄檔增加一些鍵值:
![p25](https://i.iter01.com/images/038267381a82c0320138e65772d68c93218e0b97bfd220e7fe3d3abace3dfb33.jpg)
最後,透過shellexecute執行剛剛複製到Roaming的樣本檔案。
![p26](https://i.iter01.com/images/2ddcf271ebdbf8aad86911b1d9e9a45457d41b58b68de4bd4a8909d296c48df2.jpg)
0x06 第二次執行分析
當第二次執行時,之前的行為都是類似的,只有在mystart函式中,出現了變化。由於當前程式是複製到Roaming下的映象檔案,重新命名之後不包含”1.exe”字串(參考上文)。所以會執行到另一個分支,呼叫Fi函式。
![p27](https://i.iter01.com/images/d1cd2fed0343dd1e84d91a652e9310cdb81527da748ccc0fbcf1702f88c01629.jpg)
該函式為svchost2.dll的另外一個匯出函式。該函式會隱藏自己的程式名以及其他的資訊:
![p28](https://i.iter01.com/images/880c6932809c4d01f5484249ea7eb9275b466417517436b637da05918ab80bae.jpg)
隱藏結果使自己的程式名變為csrss.exe的,如圖:
![p29](https://i.iter01.com/images/03b34a0d1fc604745f9df424305b46ae187c1e6d2f438a79f9999c9a8083ffd1.jpg)
但這種隱藏手段並不高階,隨便一個工具就能識別出來。
進而,會呼叫Fa函式,該DLL的另一個匯出函式。在該函式中出現了一些網路行為。首先,會連線139.196.184.116:34176
![p30](https://i.iter01.com/images/6d260541358d8e615660fa3db18315790125193112712e276db814ee1f8020f4.jpg)
併傳送資料:
![p31](https://i.iter01.com/images/91991ea29a2cc15a038e98899a260def5251b46393473cd50cea10a968828d69.jpg)
該資料是怎麼來的,暫時沒有必要追究。有需要時,可以進一步分析,不過,可以肯定的是,對於同一臺機器,每次傳送的資料是一樣的,應該是作為機器的ID標識。傳送之後,會接收到如下內容:
![p32](https://i.iter01.com/images/653e2b35af52cf2c0e6d6d539dedae609afd643c61bb705cbb662bb3b0192c2f.jpg)
針對返回的內容,會判斷是否含有”Set-Cookie:”字串,如果有,則取出:
![p33](https://i.iter01.com/images/ee36c286423573da96504427cdf468ce1194b008a22db19a9319927888e81ef2.jpg)
接下來,會用該Cookie作為機器的標識。
進而,會連線139.196.184.116:35131地址:
![p34](https://i.iter01.com/images/69e80741c9634d3198163a28aa146e5557aff13e583a38cd44fc3c5c4588294c.jpg)
但是該埠已經掛掉了,無法連線上。所以,筆者只好重新定向到自己的IP,並模擬其通訊。 連線上IP之後,會傳送一些隨機生成的資料:
![p35](https://i.iter01.com/images/df1a74ab8a706a75e788ac83739a9a1e21c1f7f3e06671e53604e692fa615f93.jpg)
本機的監聽結果如下:
![p36](https://i.iter01.com/images/e7d098477226358618b8b4af6515ae9d642cc960566d6080d4650339ff9f5ae5.jpg)
傳送3次隨機生成的資料之後,會建立新執行緒用於接收返回資料:
![p37](https://i.iter01.com/images/90bfa02baf442da06c279930b468bcce595174eca0170c7e0e329a39e5246aac.jpg)
該執行緒會接收來自139.196.184.116:35131回覆的資料,但是由於該埠已經掛掉了,筆者只能隨意的回覆點什麼東西,[email protected]
![p38](https://i.iter01.com/images/affd39e27607fef82b3150d446f9b352751a0e13238c12be0253ec6a538c2e55.jpg)
接收到回覆之後,會在sub_12A50F0中做解碼工作。其解碼工作首先會將受到的資料逐位元與0xE9異或。
![p39](https://i.iter01.com/images/7ec01c4e3666a8ef8b31a33a2264d8e1f499cbd60da4d00b9a0122de3c226433.jpg)
進而會對長度進行判斷,然後對幾個關鍵位置的內容進行判斷,如果出現不符合的情況就會結束該執行緒;如果全部滿足條件,則呼叫zlib 1.2.8版的庫函式解壓接收到的資料。
![p40](https://i.iter01.com/images/0eb880a4791950f3938ce4a0c7d0bbcc61cf3f946cc7ce54633938bf802b0d79.jpg)
最後根據解壓縮出來的內容選擇初始化某個物件,並呼叫該物件的成員函式,實現惡意功能。
![p41](https://i.iter01.com/images/296a01f47c30fe84768adf344ab1a3e9cae0be6eb8b0f5aff53ed6fa38c0e3f8.jpg)
執行完畢後,該執行緒會進入迴圈接收新的資料,並執行相應功能。此外,主執行緒建立了上述之後,會統計當前系統的各種資訊:
![p42](https://i.iter01.com/images/480830f146e6c558b7d6e49101276c8d73828f3f47ae8fd1ab5e8a3764396035.jpg)
其中sub_100010F0實現捕獲攝像頭資訊的相關操作。當獲取了所有的資訊之後,傳送給目標地址,目標地址同樣掛掉了。最後同樣進入傳送和接收的迴圈中。
0x07 惡意功能分析
該樣本的惡意功能比較多,現隨機展示一個透過匿名雙管道實現遠端CMD的功能。該功能由編號0x31的分支實現。
![p43](https://i.iter01.com/images/c55970c8ae3f017510ab2ffff3257e7d5041666db3542cb814931f90a670f574.jpg)
詳情參考sub_10007DC0函式,該函式首先會呼叫sub_10004C00 初始化socket,進而呼叫sub_1000F060建立管道並啟動CMD程式:
![p44](https://i.iter01.com/images/e2b8dbf79c93ad0d9edb2bb738bb3bb9113f329f540f45a503595a602782d2a2.jpg)
![p45](https://i.iter01.com/images/d37f7a863128882d39e73697b9620afa9fdb7bb30eca393c1f08568afa06b2c7.jpg)
0x08 結語
這個樣本並不複雜,但是能夠實現較為全面的木馬功能,另外透過遊戲攻略進行傳播,利用白+黑的方式過殺軟。哪怕現在HWSignature.dll會被查殺。但有白名單宿主程式的話,繞過殺軟並不困難(基本瞬間就能想到好幾種繞過檢測的方式)。因此這種模式是值得我們警惕的。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!