前言
呼,歷時(shí)4天半,終于完成了對(duì)GandCrab病毒的分析,這個(gè)病毒是在52破解ScareCrowL前輩的帖子上參考借鑒而來,漫漫病毒分析之路,任重且道遠(yuǎn),還好,我們擁有巨人的肩膀,讓我們看的更遠(yuǎn)更多。
首先講一下,為什么分析這個(gè)病毒,在四葉草公司實(shí)習(xí),幾天下來,有點(diǎn)厭倦分析病毒這件事了,哇,想到以后還要干好多年,心態(tài)炸了。公司峰哥給我了兩個(gè)樣本,說現(xiàn)在流行勒索和挖礦病毒,客戶也中過,叫我去試試分析。然后就有了這篇病毒分析報(bào)告。頓時(shí),分析出來有不一樣的收獲,這是傳統(tǒng)病毒不一樣的。
一月份,GandCrab勒索軟件首次亮相,這是一種著名的惡意軟件,分布在黑暗網(wǎng)絡(luò)上,可能源于俄羅斯,主要針對(duì)斯堪的納維亞和英語國家。……(碼字太麻煩了,這里有一份關(guān)于GandCrab簡(jiǎn)介,了解一下:http://baijiahao.baidu.com/s?id=1599794170709869995&wfr=spider&for=pc)
二:樣本信息
三:行為分析
這個(gè)樣本的主要作用就是從資源段中檢索數(shù)據(jù),然后把其加載到內(nèi)存,經(jīng)過解密,然后調(diào)用解密好的shellcode。
shellcode主要是調(diào)用LoadLibrary和GetProcAddress。獲取所需要函數(shù)的地址,以便后期的生成新的病毒文件
重新開辟內(nèi)存空間,解密新的PE文件,并把它映射入內(nèi)存,復(fù)制文件頭和各個(gè)區(qū)表。
修復(fù)IAT,這樣就形成了新的病毒文件,命名為PE1.exe
PE1.exe采用dll反射注入技術(shù),利用ReflectiveLoader要完成的任務(wù)是對(duì)自身的裝載(這一切都是在內(nèi)存中發(fā)生)
調(diào)用dll文件的入口點(diǎn)
核心程序的行為
四:樣本分析
通讀代碼,發(fā)現(xiàn)EnumResourceNamesA API函數(shù),函數(shù)目的是枚舉指定的二進(jìn)制資源,我們可以猜測(cè)程序功能是,枚舉資源文件,然后映射如內(nèi)存,經(jīng)過解密,形成shellcode,然后執(zhí)行shellcode。
修改內(nèi)存保護(hù)設(shè)置,映射文件到內(nèi)存,然后解密shellcode并且執(zhí)行shellcode。
這是第一層保護(hù)
利用PEB,獲取Kernel32.dll的基地址。
獲取LoadLibrary和GetProcAddress的地址,以便在函數(shù)中調(diào)用其他函數(shù)。這個(gè)是使用shellcode最先做的兩件事情。
再次申請(qǐng)空間,加載解密后續(xù)的病毒代碼,首先加載文件頭,然后遍歷節(jié)區(qū),
修改IAT
觀察tmain函數(shù),發(fā)現(xiàn)函數(shù)流程就是經(jīng)過三個(gè)驗(yàn)證,最后執(zhí)行sub_11A8.而這個(gè)函數(shù)是反射式dll注入的主要的函數(shù)。
調(diào)用了函數(shù)sub_獲取的機(jī)器信息和dll導(dǎo)出函數(shù)ReflectiveLoader
修改內(nèi)存保護(hù)設(shè)置
調(diào)用函數(shù)ReflectiveLoader,反射式dll注入自身[這是病毒保護(hù)自我的重點(diǎn),了解反射式dll注入的流程]
1.需要獲取被加載到內(nèi)存dll的基地址,連自己在內(nèi)存的哪里都不知道,還玩的屁啊
2.利用模塊和函數(shù)的Hash來獲取主要函數(shù)的地址。
3.分配內(nèi)存區(qū)域,存放dll代碼(之前應(yīng)該已經(jīng)注入好了)
4.修復(fù),獲取IAT
5.修復(fù)重定位表
6.得到OEP,跳轉(zhuǎn)到dll文件的OEP地址。
病毒發(fā)作的前期:
病毒發(fā)作的中期:
病毒發(fā)作的晚期:
模塊1:收集機(jī)器信息,鏈接url讀取文件,生成互斥體
調(diào)用GetInforAndOpenUrl(10007580)獲取系統(tǒng)信息,檢測(cè)進(jìn)程中是否存在指定給的殺毒軟件,然后連接指定的url讀取文件
檢查是否有卡巴斯基和諾頓等殺軟的驅(qū)動(dòng),先檢查是否存在卡巴斯基的驅(qū)動(dòng),如果存在,XXX,如果不存在,在檢查其他殺軟的驅(qū)動(dòng),如果都不存在,那就將自身復(fù)制,同時(shí)寫入注冊(cè)表自啟動(dòng)項(xiàng)。
將病毒釋放到系統(tǒng)目錄下。
將釋放的文件寫入注冊(cè)表Runonce中,以實(shí)現(xiàn)病毒的自啟。
由于在進(jìn)程文件加密的時(shí)候,不允許進(jìn)程占用,所以需要終止某些特定的進(jìn)程。
模塊4:利用機(jī)器數(shù)據(jù)生成RansomID
產(chǎn)生了支付贖金的贖金ID,這個(gè)是由的pc_group和機(jī)器識(shí)別碼生成的,
同時(shí)為了受害者方便交付贖金,提供了安裝洋蔥瀏覽器的教程,臥槽真的貼心。
利用CryptAcquireContextW創(chuàng)建CSP密碼容器句柄
利用 CryptGenKey產(chǎn)生隨機(jī)秘鑰
生成密鑰有兩種方式,CryptGenKey(生成隨機(jī)密鑰)和CryptImportKey(導(dǎo)入密鑰),病毒使用了CryptGenKey方式。另:Microsoft Base Cryptographic Provider v1.0:密鑰長(zhǎng)度為512位。Microsoft Enhanced Cryptographic Provider v1.0:密鑰長(zhǎng)度為1024位
加密
銷毀容器
產(chǎn)生特征的編碼字符
將RSA生成的秘鑰和公鑰利用CryptBinaryToStringA函數(shù)Base64加密,以便后期網(wǎng)路傳輸。
檢索系統(tǒng)信息,然后再進(jìn)行Base64編碼。
將獲取的機(jī)器信息的Base64編碼連接到秘鑰的后面
讀取之前釋放到Hacky目錄下的病毒,可以是利用后續(xù)的函數(shù)進(jìn)行父子進(jìn)程共享該段數(shù)據(jù)。
建立管道通信,解析域名,判斷網(wǎng)絡(luò)連接是否正常
首先將三個(gè)域名傳入。
創(chuàng)建管道連接,管道的作用是實(shí)現(xiàn)進(jìn)程之間的消息交互
利用管道的通信機(jī)制,創(chuàng)建一個(gè)子進(jìn)程,命令行參數(shù)是nslookup %s ns1.virmach.ru,目的是解析之前穿入的三個(gè)域名。讀取文件,判斷是否聯(lián)網(wǎng),如果沒有聯(lián)網(wǎng),readfile的buf存在error信息,程序進(jìn)程死循環(huán)
管道輸入的一般新步驟:
修補(bǔ)可執(zhí)行文件,我們將一些關(guān)鍵A24FF4等跳轉(zhuǎn)jmp或者nop掉即可實(shí)現(xiàn)。
病毒首先需要獲取機(jī)器的磁盤驅(qū)動(dòng)器。除了CD-ROM其他的驅(qū)動(dòng)器都被感染,對(duì)于搜索到的每個(gè)驅(qū)動(dòng)器,釋放一個(gè)線程,進(jìn)行加密。加快加密的速度。
病毒不會(huì)感染特殊目錄和特殊格式的文件
然后在驅(qū)動(dòng)器中遍歷,如果是文檔則遞歸調(diào)用原函數(shù),負(fù)責(zé)調(diào)用加密函數(shù)。
管道通信
檢測(cè)進(jìn)程的安全令牌
利用shellExecute函數(shù)執(zhí)行cmd,參數(shù)是/c vssadmin delete shadows /all /quiet,刪除卷影副本,目的是不讓管理員恢復(fù)數(shù)據(jù)。
五:技術(shù)總結(jié)
GandCrab病毒主要采用到的技術(shù)有,shellcode藏匿,利用shellcode的短小的特點(diǎn),觸發(fā)shellcode到內(nèi)存,減少了被殺毒軟件查殺的風(fēng)險(xiǎn)。經(jīng)過第一層加密后,病毒釋放了一個(gè)惡意代碼文件(PE1.exe),該文件采用的是反射式dll注入技術(shù),該技術(shù)不想傳統(tǒng)的dll注入需要在文件系統(tǒng)中產(chǎn)生文件,所要執(zhí)行的dll全在內(nèi)存中,這是第二層保護(hù)手段。經(jīng)過兩次dump后,可以得到本次病毒的主體文件,建立了管道,實(shí)現(xiàn)子進(jìn)程和父進(jìn)程之間的通信。
需要細(xì)細(xì)的看,參考自:https://zhuanlan.zhihu.com/p/28788521
傳統(tǒng)的dll注入,是在文件系統(tǒng)中存放一個(gè)dll模塊,然后進(jìn)程利用LoadLibrary和CreateRemoteThread這兩個(gè)API函數(shù)裝載模塊到內(nèi)存空間,實(shí)現(xiàn)注入。而殺軟在布置Hook的時(shí)候,重點(diǎn)鉤取的就是這兩種API函數(shù)。
反射式dll注入不需要dll文件落地,減少被查殺的風(fēng)險(xiǎn)。首先將需要注入的dll寫入進(jìn)程內(nèi)存,然后為該dll添加一個(gè)導(dǎo)出函數(shù),利用這個(gè)導(dǎo)出函數(shù)讓其自動(dòng)的裝載dll。
主要有兩個(gè)方向的問題:第一個(gè)如何將dll寫入內(nèi)存(注射器的實(shí)現(xiàn)),第二個(gè)如果調(diào)用自身(ReflectiveLoader的實(shí)現(xiàn))
參考自:http://www.freebuf.com/articles/system/151161.html
ReflectiveLoader的實(shí)現(xiàn)
管道是一種用于在進(jìn)程間共享數(shù)據(jù)的機(jī)制,其實(shí)質(zhì)是一段共享內(nèi)存,病毒利用了管道進(jìn)行父子進(jìn)程的通信,這樣子進(jìn)程就可以直接影響父進(jìn)程內(nèi)存。為實(shí)現(xiàn)父子進(jìn)程間通信,需要對(duì)子進(jìn)程的管道進(jìn)行重定向:創(chuàng)建子進(jìn)程函數(shù) CreateProcess中有一個(gè)參數(shù)STARUIINFO,默認(rèn)情況下子進(jìn)程的輸入輸出管道是標(biāo)準(zhǔn)輸入輸出流,可以通過下面的方法實(shí)現(xiàn)管道重定向:
STARTUPINFO si; si.hStdInput = hPipeInputRead; //輸入由標(biāo)準(zhǔn)輸入 -> 從管道中讀取 si.hStdOutput = hPipeOutputWrite; //輸出由標(biāo)準(zhǔn)輸出 -> 輸出到管道