【2018-11-20】勒索病毒GrandCrab-v5.04完整分析

原程序分析

樣本下載鏈接

基本文件信息
ExeInfo 查看文件信息,PE32位且有殼

clipboard.png

Ollydbg 入口點代碼如下

clipboard.png

脫殼後
單步跟到OEP,dump內存修復IAT,成功脫殼後用 Die 查看編譯語言爲 Delphi7

clipboard.png

IDA 和 OD 的入口代碼

clipboard.png

clipboard.png

反沙箱手段

  • 消息循環

複雜的消息循環,使用了定時器消息,以及自定義 SendMsg,發送大量消息,使程序的運行時間延長

clipboard.png

  • 設備上下文

長時間消息循環到達核心代碼區,裏面又有許多的動態解密函數以及大量的GetDCGetStockObject,既消耗了一定的時間又消耗了大量的內存資源

clipboard.png

clipboard.png

  • Sleep

最關鍵的手段還是一個 Sleep(),Sleep了4分鐘

clipboard.png

釋放文件

  • Call下斷

程序的很多代碼都是動態解密的,不用跟具體的解密過程,直接在 call 跳轉時下斷即可。如圖在釋放文件的關鍵call下斷,注意先 Patch 掉之前的 Sleep

clipboard.png

  • OD粗略分析

F7 跟過去分析,發現先是獲取了一些 API,然後創建一個進程,再是寫入數據到子進程

clipboard.png

clipboard.png

  • IDA詳細分析

使用ODScript的dma指令dump這段內存,然後IDA打開靜態分析!先是GetProcAddress獲取多個 API 的地址,然後CreateProcess創建自身路徑所在的一個進程,傳入CREATE_SUSPENDED使其掛起,利用ZwUnmapViewOfSection卸載原來所有區段以及RtlZeroMemory將內存區域置0,VirtualAllocEx配合WriteProcessMemory寫入新的數據,利用SetThreadContextResumeThread修改程序的入口點,且恢復掛起進程運行

clipboard.png

clipboard.png

clipboard.png

Tips:dma指令很簡單的: "dma start,size,path"

提取病毒體
WriteProcessMemory下斷,發現寫入的是一個完整的 PE 文件

clipboard.png

利用 dma 指令提取了總共9段數據,然後新建 PE 文件,手動對齊文件偏移,更改節區的正確偏移量以及節區的可執行屬性,最後提取出了病毒體!P.S.之後我用PCHunter提取出整段內存然後再去對齊偏移也是可以的

clipboard.png

第一部分總結
原程序首先是加了殼,然後擁有大量的混淆手段,如圖用ProcessMonitor檢測到只會讀取某些註冊表的值並沒有寫註冊表,更沒有其它危險的操作,因此能過很多的殺軟!又使用了Sleep等延時手段過掉很大一部分的沙箱分析,再者程序執行核心病毒的手段也很隱蔽,利用傀儡進程寫入新的PE文件並更改入口點執行,讓核心惡意代碼很難被殺軟檢測到

clipboard.png

病毒體分析

基本文件信息
PE32位程序,總共8個節區,有個自寫的殼

clipboard.png

脫殼文件信息
這殼好脫,簡單的異或加密殼,3個jmp eax下斷即可到 OEP,然後dump以及修復IAT,找到的 OEP 如下

clipboard.png

clipboard.png

腳本去花
脫了殼之後拖入 IDA 發現 F5 失效,因爲代碼的每個jnz和jz之後有一段垃圾指令,干擾了 IDA 等反彙編工具的彙編,寫了個IDAPython去除花指令之後就能夠反編譯了,代碼如下

def patch_junkcode(addr):
    data = list(get_bytes(addr,4))
    if(ord(data[0]) == 0x75 and ord(data[1]) == 0x5 and ord(data[2]) == 0x74 and ord(data[3]) == 0x3):
            for i in range(4,10):
                patch_byte(addr+i,0x90)
base = 0x401000
len = 0x414C00 - base
for i in range(len):
    patch_junkcode(base+i)
print 'Finished!'

病毒執行流程

  • 關閉指定進程

遍歷系統進程,關閉"msftesql.exe","sqlagent.exe","sqlbrowser.exe"等多個特定進程

clipboard.png

clipboard.png

clipboard.png

  • 打開互斥體

打開一個互斥體,同步與父進程的內存數據操作

clipboard.png

clipboard.png

  • 要求操作系統Win7以上

使用VerifyVersionInfoW函數判斷操作系統大於Win7,否則退出程序

clipboard.png

  • 要求用戶權限Low以上

使用GetSidSubAuthority函數判斷當前用戶的權限在Low以上

clipboard.png

  • Win7以及Win8提權

先是創建位圖寫入數據,其實數據是之後的shellcode,這麼做是爲了隱蔽這段 shellcode

clipboard.png

獲取 shellcode,調用ZWQueryIntervalProfile提升當前用戶權限爲系統權限,提權原理相關鏈接

clipboard.png

  • Win10提權

判斷操作系統爲Win10,利用不久前Task Scheduler的一個0day提權,先是獲取StartXpsprintJob的地址,提權原理相關鏈接

clipboard.png

之後鏈接到printconfig.dll來觸發漏洞,然後提升爲系統權限

clipboard.png

  • 創建進程運行自身

判斷操作系統大於 Win7 以及用於權限大於 Low 之後,獲取自身完整路徑,使用GetShortPathNameW來避免Unicode路徑的影響,之後利用wmic傳入路徑再次啓動自身

clipboard.png

  • 檢查區域

通過鍵盤佈局檢查區域,某些區域不會執行之後的代碼,直接會刪掉自己然後退出

clipboard.png

通過默認的語言判斷區域

clipboard.png

  • 創建互斥體

一堆花裏胡哨的操作,就爲了創建一個互斥體!好像作者在嘲諷 ahnlab,這個不太瞭解

clipboard.png

  • 解密必要數據

解密了一些數據,之後初始化 Key 的時候用到了

clipboard.png

  • 查詢系統信息

通過註冊表檢查了當前用戶組,所在地區,操作系統,系統版本號,CPU信息,以及磁盤類型和磁盤容量,最重要的是查找了一些常見的殺毒進程,但僅僅是查找

clipboard.png

clipboard.png

clipboard.png

clipboard.png

clipboard.png

clipboard.png

clipboard.png

  • 生成隨機字符

使用CryptGenRandom生成隨機數,運算後得到幾個寬字符,取六個之後轉換爲大寫,拼接到文件名。P.S.文件名就是指導你付款的那個文件的名稱,諸如:TZYLVF-DECRYPT.txt

clipboard.png

  • 生成公私鑰對

使用CryptGenKey生成RSA的公私鑰對,之後用CryptExportKey導出到內存中

clipboard.png

  • 公私鑰對寫入註冊表

創建HKEY_LOCAL_MACHINE\\SOFTWARE\\keys_data\\data再創建publicprivate,將之前的公鑰和公私鑰對分別寫入這兩個子鍵中

clipboard.png

  • 解密說明信息

解密出之後要寫入XXXXXX-DECRYPT.txt中的字符串,相當於給用戶的說明書

clipboard.png

clipboard.png

  • 開啓線程準備加密文件

第一個線程會遍歷局域網共享文件

clipboard.png

第二個線程會遍歷本地有效磁盤以及移動存儲設備

clipboard.png

  • 採用的遍歷方法

遍歷局域網與遍歷本地採用的方法都是相同的,先判斷磁盤的有效性,有效則進行下一步遍歷!下一步則必須先滿足不是.以及..,然後獲取當前目錄的屬性,是文件夾的話則遞歸遍歷,SQL目錄會進行單獨處理,直到遍歷到文件則利用之前的 RSA 公鑰加密

clipboard.png

  • 創建說明文件

之前的說明書內容一直在內存中,尚未寫入到文件。在每個目錄遍歷開始時就在當前目錄建立一個文件,文件名就是之前的隨機字符,然後將內存中的說明書寫入文件!除此之外還會建立一個.lock文件用於記錄加密時的時間

clipboard.png

clipboard.png

  • 加密白名單

加密的白名單主要有三個,一是特定目錄下的文件不加密,諸如:Program Files,Windows,Boot等系統目錄

clipboard.png

第二個就是特定的後綴不加密,動態才能看得到

clipboard.png

第三個就是特定的文件不加密

clipboard.png

  • 執行加密

當遍歷到非白名單文件時,便開始加密文件

clipboard.png

  • 刪除卷影拷貝

加密完成後,刪除Shadow Copy,防止普通用戶恢復刪除的未加密原文件

clipboard.png

  • 設置桌面背景

先創建位圖再寫入顏色數據,之後新建文件寫到文件中,文件在Temp目錄下,最後使用SystemParametersInfoW設置該圖片爲桌面背景

clipboard.png

clipboard.png

  • 發送POST請求

創建一個線程,先是解密出網址信息

clipboard.png

然後隨機選取字符串拼接網址

clipboard.png

我測試時拼接的字符串是http://www.2mmotorsport.biz/includes/pics/zurukafu.jpg,最後向這個網址發送一個POST請求

clipboard.png

  • 刪除自身

病毒加密文件完成後會調用cmd延時5s再刪除自己

clipboard.png

第二部分總結
上述的執行流程是病毒體的順序執行流程,這個勒索病毒主要是釋放時非常隱蔽不好定位,dump 出的病毒體也有花指令影響靜態分析,不過 IDAPython 能去除花指令!雖然如此這病毒的主體還是如此複雜,各種判斷使得病毒的抗干擾性異常強大,可以運行在 Windows 不同的版本以及運行在不同的國家!一個字形容:強!

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章