GandCrab勒索病毒分析報告
前言
呼,歷時4天半,終於完成了對GandCrab病毒的分析,這個病毒是在52破解ScareCrowL前輩的帖子上參考借鑑而來,漫漫病毒分析之路,任重且道遠,還好,我們擁有巨人的肩膀,讓我們看的更遠更多。
首先講一下,為什麼分析這個病毒,在四葉草公司實習,幾天下來,有點厭倦分析病毒這件事了,哇,想到以後還要幹好多年,心態炸了。公司峰哥給我了兩個樣本,說現在流行勒索和挖礦病毒,客戶也中過,叫我去試試分析。然後就有了這篇病毒分析報告。頓時,分析出來有不一樣的收穫,這是傳統病毒不一樣的。
一月份,GandCrab勒索軟體首次亮相,這是一種著名的惡意軟體,分佈在黑暗網路上,可能源於俄羅斯,主要針對斯堪的納維亞和英語國家。……(碼字太麻煩了,這裡有一份關於GandCrab簡介,瞭解一下: http://baijiahao.baidu.com/s?id=1599794170709869995&wfr=spider&for=pc )
二:樣本資訊
- 樣本名稱:hmieuy.exe
- 樣本md5:f42774332fb637650ff0e524ce1b1685
- 是否加殼:無殼
- 編譯語言:Microsoft Visual C++ v.10 – 2010 ( E8 )
- 樣本來源: https://www.52pojie.cn/forum.php?mod=viewthread&tid=712552&extra=page%3D1%26filter%3Dtypeid%26typeid%3D62
三:行為分析
這個樣本的主要作用就是從資源段中檢索資料,然後把其載入到記憶體,經過解密,然後呼叫解密好的shellcode。
shellcode主要是呼叫LoadLibrary和GetProcAddress。獲取所需要函式的地址,以便後期的生成新的病毒檔案
重新開闢記憶體空間,解密新的PE檔案,並把它對映入記憶體,複製檔案頭和各個區表。
修復IAT,這樣就形成了新的病毒檔案,命名為PE1.exe
PE1.exe採用dll反射注入技術,利用ReflectiveLoader要完成的任務是對自身的裝載(這一切都是在記憶體中發生)
呼叫dll檔案的入口點
核心程式的行為
- 獲取系統的DNS網域,本地使用者名稱,鍵盤區域,CPU架構,CPU資訊,磁碟驅動器
- 連線病毒伺服器
- 判斷病毒程序在系統中是否互斥,如果存在多個相同病毒程序,終止程序。
- 檢查防毒軟體驅動,如果沒有,則複製自身,修改登錄檔自啟動
- 尋找並終止指定的程序,因為這些程序可能會影響到對檔案的加密
- 利用機器資料生成加密贖金ID
- 啟用微軟加密服務
- 對磁碟檔案除了必要檔案必要路徑下進行加密
- 檢查程序安全令牌
- 刪除卷影副本,避免管理員利用副本進行恢復。
- 執行指定的shell操作。
四:樣本分析
原始樣本(hmieuy.exe)
通讀程式碼,發現EnumResourceNamesA API函式,函式目的是列舉指定的二進位制資源,我們可以猜測程式功能是,列舉資原始檔,然後對映如記憶體,經過解密,形成shellcode,然後執行shellcode。
修改記憶體保護設定,對映檔案到記憶體,然後解密shellcode並且執行shellcode。
這是第一層保護
shellcode(記憶體中dump而來)
利用PEB,獲取Kernel32.dll的基地址。
獲取LoadLibrary和GetProcAddress的地址,以便在函式中呼叫其他函式。這個是使用shellcode最先做的兩件事情。
再次申請空間,載入解密後續的病毒程式碼,首先載入檔案頭,然後遍歷節區,
修改IAT
PE1.exe(記憶體中dump而來)
觀察tmain函式,發現函式流程就是經過三個驗證,最後執行sub_11A8.而這個函式是反射式dll注入的主要的函式。
呼叫了函式sub_獲取的機器資訊和dll匯出函式ReflectiveLoader
修改記憶體保護設定
呼叫函式ReflectiveLoader,反射式dll注入自身[這是病毒保護自我的重點,瞭解反射式dll注入的流程]
1.需要獲取被載入到記憶體dll的基地址,連自己在記憶體的哪裡都不知道,還玩的屁啊
2.利用模組和函式的Hash來獲取主要函式的地址。
3.分配記憶體區域,存放dll程式碼(之前應該已經注入好了)
4.修復,獲取IAT
5.修復重定位表
6.得到OEP,跳轉到dll檔案的OEP地址。
PE2.dll (記憶體中dump而來)
整體分析
病毒發作的前期:
病毒發作的中期:
病毒發作的晚期:
模組1:收集機器資訊,連結url讀取檔案,生成互斥體
呼叫GetInforAndOpenUrl(10007580)獲取系統資訊,檢測程序中是否存在指定給的防毒軟體,然後連線指定的url讀取檔案
- 系統的DNS網域,
- 本地使用者名稱,
- 鍵盤區域,但是病毒並不感染俄羅斯使用者
- CPU架構,
- CPU資訊,
- 磁碟驅動器
- 檢測程序中是否存在指定給的防毒軟體
- 連線到指定的URL,並且讀取檔案
- 開啟Http請求,讀取網路檔案至緩衝區
- 以自身的硬體資訊,生成ranson-id,並由此建立互斥體。
模組2:檢測殺軟碟機動
檢查是否有卡巴斯基和諾頓等殺軟的驅動,先檢查是否存在卡巴斯基的驅動,如果存在,XXX,如果不存在,在檢查其他殺軟的驅動,如果都不存在,那就將自身複製,同時寫入登錄檔自啟動項。
將病毒釋放到系統目錄下。
將釋放的檔案寫入登錄檔Runonce中,以實現病毒的自啟。
模組3:關閉相關程序
由於在程序檔案加密的時候,不允許程序佔用,所以需要終止某些特定的程序。
模組4:利用機器資料生成RansomID
產生了支付贖金的贖金ID,這個是由的pc_group和機器識別碼生成的,
同時為了受害者方便交付贖金,提供了安裝洋蔥瀏覽器的教程,臥槽真的貼心。
模組5:啟用微軟的CSP加密服務
利用CryptAcquireContextW建立CSP密碼容器控制代碼
利用 CryptGenKey產生隨機祕鑰
生成金鑰有兩種方式,CryptGenKey(生成隨機金鑰)和CryptImportKey(匯入金鑰),病毒使用了CryptGenKey方式。另:Microsoft Base Cryptographic Provider v1.0:金鑰長度為512位。Microsoft Enhanced Cryptographic Provider v1.0:金鑰長度為1024位
加密
銷燬容器
模組6:傳送Base加密後的公祕鑰
產生特徵的編碼字元
將RSA生成的祕鑰和公鑰利用CryptBinaryToStringA函式Base64加密,以便後期網路傳輸。
檢索系統資訊,然後再進行Base64編碼。
將獲取的機器資訊的Base64編碼連線到祕鑰的後面
讀取之前釋放到Hacky目錄下的病毒,可以是利用後續的函式進行父子程序共享該段資料。
建立管道通訊,解析域名,判斷網路連線是否正常
模組7:建立管道通訊
首先將三個域名傳入。
- malwarehunterteam.bit
- politiaromana.bit
- gdcb.bit
建立管道連線,管道的作用是實現程序之間的訊息互動
利用管道的通訊機制,建立一個子程序,命令列引數是nslookup %s ns1.virmach.ru,目的是解析之前穿入的三個域名。讀取檔案,判斷是否聯網,如果沒有聯網,readfile的buf存在error資訊,程式程序死迴圈
管道輸入的一般新步驟:
修補可執行檔案,我們將一些關鍵A24FF4等跳轉jmp或者nop掉即可實現。
模組8:檔案加密部分
病毒首先需要獲取機器的磁碟驅動器。除了CD-ROM其他的驅動器都被感染,對於搜尋到的每個驅動器,釋放一個執行緒,進行加密。加快加密的速度。
病毒不會感染特殊目錄和特殊格式的檔案
然後在驅動器中遍歷,如果是文件則遞迴呼叫原函式,負責呼叫加密函式。
管道通訊
模組9:安全令牌檢測
檢測程序的安全令牌
模組10:刪除卷影副本
利用shellExecute函式執行cmd,引數是/c vssadmin delete shadows /all /quiet,刪除卷影副本,目的是不讓管理員恢復資料。
五:技術總結
GandCrab病毒主要採用到的技術有,shellcode藏匿,利用shellcode的短小的特點,觸發shellcode到記憶體,減少了被防毒軟體查殺的風險。經過第一層加密後,病毒釋放了一個惡意程式碼檔案(PE1.exe),該檔案採用的是反射式dll注入技術,該技術不想傳統的dll注入需要在檔案系統中產生檔案,所要執行的dll全在記憶體中,這是第二層保護手段。經過兩次dump後,可以得到本次病毒的主體檔案,建立了管道,實現子程序和父程序之間的通訊。
shellcode
需要細細的看,參考自: https://zhuanlan.zhihu.com/p/28788521
反射式dll注入
傳統的dll注入,是在檔案系統中存放一個dll模組,然後程序利用LoadLibrary和CreateRemoteThread這兩個API函式裝載模組到記憶體空間,實現注入。而殺軟在佈置Hook的時候,重點鉤取的就是這兩種API函式。
反射式dll注入不需要dll檔案落地,減少被查殺的風險。首先將需要注入的dll寫入程序記憶體,然後為該dll新增一個匯出函式,利用這個匯出函式讓其自動的裝載dll。
主要有兩個方向的問題:第一個如何將dll寫入記憶體(注射器的實現),第二個如果呼叫自身(ReflectiveLoader的實現)
參考自: http://www.freebuf.com/articles/system/151161.html
注射器的實現
- 1.將待注入DLL讀入自身記憶體(利用解密磁碟上加密的檔案、網路傳輸等方式避免檔案落地)
- 2.利用VirtualAlloc和WriteProcessMemory在目標程序中寫入待注入的DLL檔案
- 3.利用CreateRemoteThread等函式啟動位於目標程序中的ReflectiveLoader
ReflectiveLoader的實現
- 1.定位DLL檔案在記憶體中的基址
- 2.獲取所需的系統API
- 3.分配一片用來裝載DLL的空間
- 4.複製PE檔案頭和各個節
- 5.處理DLL的引入表,修復重定位表
- 6.呼叫DLL入口點
管道通訊
管道是一種用於在程序間共享資料的機制,其實質是一段共享記憶體,病毒利用了管道進行父子程序的通訊,這樣子程序就可以直接影響父程序記憶體。為實現父子程序間通訊,需要對子程序的管道進行重定向:建立子程序函式 CreateProcess中有一個引數STARUIINFO,預設情況下子程序的輸入輸出管道是標準輸入輸出流,可以通過下面的方法實現管道重定向:
STARTUPINFO si; si.hStdInput= hPipeInputRead;//輸入由標準輸入 -> 從管道中讀取 si.hStdOutput= hPipeOutputWrite; //輸出由標準輸出 -> 輸出到管道