Ransomware CryptXXX Analysis
Global Data Structure
| Named | ImageOffset | Description |
| pConfig | 0x4259A0 | 全局配置信息,窗口句柄,全局標志位,當前進程是否是Svchost本身等。 |
| szMutexCrypt | pConfig+0x100 | 全局互斥對象的名稱, |
| szModuleFullPath | pConfig+0x121 | Crypt.dll的當前完整路徑 (C:\Tmp\Crypt_Patched.dll) |
| dwOSVer | pConfig+0x26B | 操作系統的主版本號和次要版本號 |
| szModuleDirectory | pConfig+0x663 | Crypt.dll的當前所在目錄 |
| dwPlatform | pConfig+0x26C | 64 or 32 代表不同的平臺 |
| dwWebServerID | pConfig+0x26A | 0x13524C90 or 0x40BBAA5D |
| ? | pConfig+0x563 | ? |
| ? | pConfig+0x8A5 | ? |
| szWebserverIp | pConfig+0x26A | “144.76.82.19” or “93.170.187.64” |
| lpPubKeyString | 0x4272B8 .BSS | 運行時釋放到這里 |
| dwRandomSeed | 0x423008 .data | 隨機數種子,每次運行都不一樣 |
Export Function
| funcName | ImageOffset | Description |
| DllEntryPoint | 0x422028 | 這個入口會根據當前執行的進程名稱來判斷是第一次被調用(rundll32.exe),還是之后的偽裝調用(svchost.exe)。如果是第一次調用,做一些初始化的工作,將rundll.exe從系統目錄拷貝到當前module目錄中并重命名為svchost.exe,然后用偽裝的svchost加載crypt.dll并調用MS111。這回導致新進程再去load crypt.dll進而反復啟動新的進程,這是系統中出現一大堆svchost.exe的原因。
0x41FFFF位置打patch 90 81 C4 28 00 00 00讓它無法啟動好多的進程方便調試。只要不是svchost啟動的,暫時就不會干不好的事情。 |
| MS111 | 0x421E1C | 首先判斷一下是否已經在入口中執行了偽裝svchost加載模塊的流程,如果沒有創建一個新的進程調用MS112。如果執行了,先等6分鐘,然后啟動2條線程TR_ProcessWindow和TR_PerformCheck,然后進入消息循環等待進程退出的消息。 |
| MS112(Encrypt) | 0x4213C0 | 首先從全局信息中取出互斥對象的名稱,然后打開這個互斥對象。根據后面的分析這個互斥對象應該是每個Process都是唯一的,沒有確認。成功創建了Mutex后先組裝一個神秘的字符串沒有調,然后根據一個標志來決定是否創建一個Process去執行MS113. 然后檢查全局數據結構,取出一個特殊文件的路徑,判斷這個文件存在不存在。 |
| MS113(FillConfig) | 0x421384 | 這個函數只做一件主要的事情,就是去webserver上面下載一個危險的dll。
https://www.proofpoint.com/tw/threat-insight/post/cryptxxx-ransomware-learns-samba-other-new-tricks-with-version3100 |
| MS114 | 0x421E0C | Set一個全局標志后,調用MS112. MS112會根據是否設置了這個全局標志來決定是否調用MS113. |
| MS115(Deamon) | 0x421254 | 每隔200ms檢查一下系統中是否存在WerFault.exe(CrashReport),如果存在就殺掉這個進程。同時檢查當前進程的父進程是否已經退出了,如果退出了就用系統中保存的偽裝的svchost加載crypt.dll并調用MS112,然后退出。 |
?
| RSA Key |
| —–BEGIN CERTIFICATE—–
BgIAAACkAABSU0ExAAQAAAEAAQBfFTOUbZiP6u9PppNyTSXM+Y5W9pEcKe68HJYq dLYpXL+XCzXTUgsSRJ1iNmXqrhUEqz3hOi93Bw53U28gvnJTHRboA32xzli688MQ eJz7kis1d2G+o8bz+VHO/7qsX+jlBLkP86a6+MYvvhZW+Z0HcsZbMjn6/yCgbhF8 BhpvuQ== —–END CERTIFICATE— |
?
寫了個程序把image中的所有加密字符串解密出來。
| Encrypt | Decrypt |
| ?EncryptString | DecryptString |
?
這是一個html,被解密后釋放出來。是一個勒索頁面
| The blackmail html which Extracted from decrypt |
| ?blackmail |
DllEntryPoint
?DllEntryPoint
MS111?主要邏輯
MS111
TR_ProcessWindow:遍歷所有的隱藏窗口,并且不屬于系統,并查找窗口所屬的進程名,如果match到了一個特殊的進程名,就給他發一個消息讓他恢復出來。
TR_ProcessWindow
TR_PerformCheck:創建一個Process開始調用MS112
TR_PerformCheck
如果不是Svchost.exe創建新的Process開始調用MS112,進程退出。
執行的Commandline如下:
C:\Users\ADMINI~1\Desktop\_00310~1\svchost.exe C:\Users\ADMINI~1\Desktop\_00310~1\_00310000_pe.dll, MS112
MS112?主要邏輯
MS112
根據最新的分析,這個Func是用來加密用戶文件,并顯示勒索信息的。
首先從全局信息中取出互斥對象的名稱,然后打開這個互斥對象。根據后面的分析這個互斥對象應該是每個Process都是唯一的,沒有確認。成功創建了Mutex后先組裝一個神秘的字符串,根據是否已經獲得了全局數據結構來決定是否創建一個Process去執行MS113,MS113會去webserver請求全局數據結構.
然后檢查全局數據結構,取出一個特殊文件的路徑,判斷這個文件存在不存在。
如果存在,就把文件中的內容讀取到一個Buffer中,這個Buffer是有結構的,它的0x20C偏移是0x3E8這是一個Marker。
如果這個文件不存在,那么請求webserver給它發送一個這份文件內容的數據。它會初始化一個請求數據結構,其中前4個字節是請求的command,最后四個字節是marker。中間的內容根據全局數據結構填充。
請求的數據使用Https安全協議加密,它有兩個webserver(”144.76.82.19″ or “93.170.187.64”),當一個請求失敗時會嘗試第二個webserver。
首先發送校驗包,用于服務器確認通信合規。先發送4個字節包含通信包長度的頭包,然后繼續發送包含實際驗證數據的包。
TED_SendAuthenticationPackage
實際上在發送這兩個包之前還發送了一個52字節的包,
發送完驗證包后,開始接受返回數據。協議相同,先接受4個字節的包,確認要返回的實際數據的長度。然后分配一個帶結構的Buffer,用來接收返回的數據,如果返回的數據太多,就一次只接收8k的數據。接收成功后把這些數據壓縮保存到Buffer中。
接收的第一個包是返回的校驗包,與先前發送的校驗包大小一致。校驗包的前4個字節是命令,第4-8個字節大概是一個唯一碼,并把這個唯一碼寫到全局數據結構中去。然后開始接收真正的數據。并把265個字節寫到全局數據結構中。
TED_RequestForSpecialInfo
然后,接著從全局結構中取回Buffer構造一個新的數據結構,數據結構的前265字節是剛才請求回來的數據(這個數據在后面分析是一個PublicKey),接著4個字節是一個flag,最后四個字節是0x3E8。中間是0。數據結構的大小是0x210。通過從全局數據結構中取一個字符串,并使用上面的Buffer創建這個特殊文件。
SR_WriteSpecialFile
接下來開始解密很多的本地加密字符串,然后組裝在一起。后面分析到這實際上是在組裝一個勒索的html文件。用瀏覽器加載這個html。
中間會刪除一些文件,同時創建一個Process并向這個Process注入一段代碼執行寫文件的操作。
TED_CreateAWriteFileProcessThenExit
最后它會創建一個Windows窗口,這個窗口的尺寸等同于客戶的屏幕大小,并將信息(大概是勒索信息)打印到窗口上。
這部分會根據是否有全局的窗口句柄來判斷是否將信息打印到用戶屏幕上去,或者是寫入到一個Bmp文件中去。
SR_PrintScreenAndSave2File
之后會等待WM_QUIT消息,隨后釋放Mutex退出進程。這個Mutex應該是為了防止重入,進而在用戶屏幕上繪制太多的信息。
0x41A77C應該是打印在用戶屏幕上面的勒索信息,這個function涉及了大量的加密字符串的解密工作。
MS113主要邏輯
這個導出函數的主要邏輯是去Webserver上面下載數據并生成一個邪惡的dll。它首先會去嘗試連接”144.76.82.19″的443端口SSL,如果這個server訪問失敗還有一個后備server地址是 “93.170.187.64”。
連接并校驗成功后會先發送一個請求文件大小的包,根據請求到的文件大小創建一個緩沖區,并接收數據,完畢后會把這個數據寫成一個image文件存放到本地磁盤上。
TED_DownloadStillerx_dll
下面是卡巴斯基對這個dll的分析介紹
StillerX
In order to further monetize the infections, CryptXXX downloads a DLL which acts as a credential stealing module. Internally referenced as “stiller.dll”, “stillerx.dll” and “stillerzzz.dll”, this DLL works as a plugin, but can also be used as a standalone stealer. The stealer, like the ransomware, is written in Delphi, and uses the object-oriented capabilities offered by the language. Its relatively large size on disk (around 1.2mb) is due to the static linking of several third party libraries such as DCPcrypt used for retrieving and decrypting locally stored credentials.
https://www.proofpoint.com/tw/threat-insight/post/cryptxxx-ransomware-learns-samba-other-new-tricks-with-version3100
我嘗試下載這個dll但是失敗了,我不知道是不是webserver端的程序修改了還是什么其他原因。當我請求文件大小的時候webserver返回了一個比代碼中size還要大的尺寸,以至于程序總是沒有進行實際的請求工作就退出了。
我Patch了個size,提供了一個更大的size,第一次請求實際的數據時能夠得到數據,但是第二次繼續請求的時候沒有任何數據到達。因此實際獲取的數據長度與請求得到的文件長度不同,程序沒有繼續構建這個dll出來。Webserver邏輯變更也是有可能的,所以我無法釋放出這個文件加以分析。
MS115主要邏輯
這個導出函數的工作就是monitor WerFault.exe,不停的殺這個process。然后判斷它的父進程是否已經退出了,如果退出的話創建一個Process用偽裝的svchost去loadCrypt然后調用MS112。看起來是一個守護進程。
MS115_TerminateWerfault
加密用戶數據的邏輯
這個邏輯主要在MS112中,從下面這個圖可以看出來它會用隨機算法build一個隨機串出來,這個隨機串用來給文件加密,這樣它就不需要調用其它加密的API,保證了它的加密速度。Build這個隨機串在生成勒索信息和真正加密用戶文件中都有用到。當然它還會每隔8191個字節加密前64個字節用非對稱RC4加密。
加密的邏輯是先將文件讀到一個緩沖區中,然后進入一個循環中,循環每次增加8255個字節。在這個循環中拷貝緩沖區中的前64個字節到一個臨時buffer中,然后用非對稱的PublicKey進行RSA加密,然后將這個buffer拷貝到另外一個緩沖區中,由于加密后數據會變大,因此拷貝到另外的緩沖區中選擇的size的大小是128字節。接下來的8191字節采用一個數學算法,利用隨機生成的44字節的串對這部分數據進行加密,速度很快。完成后將這8191個字節拷貝到另外的緩沖區中。8191+64=8255
如果這一切完成了,它會寫個0x3E8到文件末尾。還會把使用到的隨機串用PublicKey加密了。
這塊邏輯比較復雜,如果要準確的分析還需要動態調試驗證一下,這里我還沒有去做。把代碼貼出來,大家自己感受吧。
TED_EncryptUserFile
TED_EncryptBytesByRC4每隔8255加密64字節頭,強加密
TED_EncryptBytesByAlgorithm? 剩下的8191采用隨機串用數學算法加密,速度快,沒有看到AES對稱加密算法,和AESkey。
?
Random隨機數生成一個64位的key的算法分析
這個算法的邏輯簡單說就是,用兩個Random函數生成2個隨機數,一個是0-3用于選擇使用哪一個字符數據,另一個0-44用戶定位數組中哪一個字符。這樣就組裝除了一個64位的Key字符數組。放代碼看的清楚。
TED_BuildKeyWithRandom
種子算法:
SR_System__Randomize
偽隨機算法:
SR_Random
Other
?
由于惡意軟件是delphi寫的,因此了解一下delphi使用的字符串的結構對分析代碼有些幫助。
AnsiString的內部結構
被感染后會將rundll32.exe從windows目錄中拷貝過來并改名為svchost,然后都用svchost啟動,起到偽裝迷惑的作用。
然后創建一個Process,進程的Commandline如下:
C:\Users\ADMINI~1\Desktop\_00310~1\svchost.exe C:\Users\ADMINI~1\Desktop\_00310~1\_00310000_pe.dll, MS111
?
這個過程是在Dll load的時候做的,所以它只要一load就會創建一個Process再去load自己,這樣就會存在很多個Process在系統中。為了調試方便,可以打patch,讓它不要去創建進程。
?
由于會寫一個bmp文件出來,這個bmp文件的內容也是勒索信息,被用于屏幕保護。所以需要知道bmp的結構才能分析對應的代碼。
?原文地址:?http://ec2-52-196-167-189.ap-northeast-1.compute.amazonaws.com/wordpress/index.php/2016/07/15/cryptxxx-analysis/
總結
以上是生活随笔為你收集整理的Ransomware CryptXXX Analysis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ransomware Cerber An
- 下一篇: 农民斗地主——Binder fuzz安全