压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

GandCrab勒索病毒分析報告

前言

呼,歷時4天半,終于完成了對GandCrab病毒的分析,這個病毒是在52破解ScareCrowL前輩的帖子上參考借鑒而來,漫漫病毒分析之路,任重且道遠,還好,我們擁有巨人的肩膀,讓我們看的更遠更多。

首先講一下,為什么分析這個病毒,在四葉草公司實習,幾天下來,有點厭倦分析病毒這件事了,哇,想到以后還要干好多年,心態炸了。公司峰哥給我了兩個樣本,說現在流行勒索和挖礦病毒,客戶也中過,叫我去試試分析。然后就有了這篇病毒分析報告。頓時,分析出來有不一樣的收獲,這是傳統病毒不一樣的。

一月份,GandCrab勒索軟件首次亮相,這是一種著名的惡意軟件,分布在黑暗網絡上,可能源于俄羅斯,主要針對斯堪的納維亞和英語國家。……(碼字太麻煩了,這里有一份關于GandCrab簡介,了解一下:http://baijiahao.baidu.com/s?id=1599794170709869995&wfr=spider&for=pc

二:樣本信息

三:行為分析

這個樣本的主要作用就是從資源段中檢索數據,然后把其加載到內存,經過解密,然后調用解密好的shellcode。

shellcode主要是調用LoadLibrary和GetProcAddress。獲取所需要函數的地址,以便后期的生成新的病毒文件

重新開辟內存空間,解密新的PE文件,并把它映射入內存,復制文件頭和各個區表。

修復IAT,這樣就形成了新的病毒文件,命名為PE1.exe

PE1.exe采用dll反射注入技術,利用ReflectiveLoader要完成的任務是對自身的裝載(這一切都是在內存中發生)

調用dll文件的入口點

核心程序的行為

  1. 獲取系統的DNS網域,本地用戶名,鍵盤區域,CPU架構,CPU信息,磁盤驅動器
  2. 連接病毒服務器
  3. 判斷病毒進程在系統中是否互斥,如果存在多個相同病毒進程,終止進程。
  4. 檢查殺毒軟件驅動,如果沒有,則復制自身,修改注冊表自啟動
  5. 尋找并終止指定的進程,因為這些進程可能會影響到對文件的加密
  6. 利用機器數據生成加密贖金ID
  7. 啟用微軟加密服務
  8. 對磁盤文件除了必要文件必要路徑下進行加密
  9. 檢查進程安全令牌
  10. 刪除卷影副本,避免管理員利用副本進行恢復。
  11. 執行指定的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; //輸出由標準輸出 -> 輸出到管道

摘錄自https://www.52pojie.cn/forum.php?mod=viewthread&tid=712552&extra=page%3D1%26filter%3Dtypeid%26typeid%3D62

上一篇:2018國家網安周17日啟幕 密織“網絡安全網”

下一篇:如何防御Node.js中不安全的重定向

站长统计