2017年6月24日 星期六

Wannacry病毒深度技術分析(五)-加密篇

承上文的佈局篇
我們在這裡要分析Wannacry的加密部分
加密這部分仍然是由t.wnry負責的
為了能夠以最高的效率加密受害者的檔案,作者在這裡可是費煞苦心哪

目前的分析位置
Wannacry在加密時
並不是一股腦兒的把你硬碟裡所有的東西通通加密
而是有選擇性的搜尋目標
以下我們會跟著他的原始碼和Immunity的動態跟蹤
一步步分析他的加密策略

尋找目標的優先順序

t.wnry在開始加密前
會先把受害者電腦的目錄和檔案按特定順序搜尋一次
並過濾不要加密的目標
第一步:
首先搜尋的順序是受害者電腦「目前使用者」在系統上設定的桌面資料夾和文件資料夾
下圖是使用者為「RG」的例子,搜尋C:\Users\RG\Desktop


接下來搜尋的是「非目前使用者」設定的桌面和文件資料夾
例如下圖是t.wnry正在搜尋「C:\Users\Default User\Documents」的當下


靜態分析可得搜尋目錄的程式碼如下:


這些重點目錄都搜尋完之後
下個目標是受害者的硬碟
t.wnry先以taskkill指令的方式把Exchange和SQL Server相關的行程通通砍掉
以防要加密的檔案被相關行程咬住而無法加密


然後t.wnry開始列舉有所磁碟目錄,從Z到A
如果找到存在的磁碟目錄就呼叫函式EncryptDrive繼續進行,反之則繼續列舉
這種列舉電腦內所有磁碟目錄的程式碼在網路上可以找到一狗票
例如Stackoverflow上的例子,在t.wnry中的程式碼如下圖


其中第74行的網路磁碟目錄檢查
是為了防止有些受害者會投機取巧,把網路磁碟機設在一般都被軟碟占用的A槽和B槽而寫的

忽略清單

在t.wnry的列舉過程中
他會檢查目錄或檔案是否在該被忽略的名單裡
首先是「.」和「..」目錄,如下圖


然後t.wnry會進入上圖的IsIgnoreFolder函式檢查目錄名稱
這些被忽略的目錄名字可以從在反組譯時看到


從上圖可知,t.wnry在搜尋時會避開系統目錄以避免影響系統運作而打草驚蛇,也不碰系統的暫存檔目錄
不過這裡比較耐人尋味的一點是它也會避開一個名叫「This folder protects against ransomware. Modifying it will reduce protection
熟悉防勒索軟體的人應該知道這是RansomFree設下的Honeypot
要是Wannacry去加密這個目錄,將會引起RansomFree的反應
為免打草驚蛇,t.wnry在這裡迴避了他

通過上述檢查的目錄就會被加入搜尋清單
t.wnry會不斷的一層層搜尋每層目錄直到清單裡沒有目錄為止

至於忽略的檔案
t.wnry會忽略「@Please_Read_Me@.txt」、「@WanaDecryptor@.exe.lnk」和「「@WanaDecryptor@.bmp」」
防止不小心加密到這些Wannacry自己產生的檔案,如下圖


加密目標的分類

在t.wnry在列舉上述這些目錄和磁碟機時
如果搜尋到檔案,他會依照副檔名來分類目標:
加密檔案分類類型
類型
描述
是否加密
FILE_TYPE_NONE (0)
非目標檔案
FILE_TYPE_PE (1)
可執行檔或DLL檔案
FILE_TYPE_ENCRYPT_HIGH_PRIORITY (2)
優先加密的檔案類型
FILE_TYPE_ENCRYPT_LOW_PRIORITY (3)
其他要加密的檔案類型
FILE_TYPE_WNCRYT (4)
加密時的暫存檔案
FILE_TYPE_WNCYR (5)
大檔案的加密副檔名
FILE_TYPE_WNCRY (6)
加密完成的一般檔案

判斷的程式碼如下:


其中什麼文件被Wannacry視為要優先加密的檔案呢?

可以在t.wnry的.data section裡見到,如下圖


而低優先權的副檔名因為太多,在這裏就不附圖了,直接寫出來吧

".docb.docm.dot.dotm.dotx.xlsm.xlsb.xlw.xlt.xlm.xlc.xltx.xltm.pptm.pot.pps.ppsm.ppsx.ppam.potx.potm
.edb.hwp.602.sxi.sti.sldx.sldm.sldm.vdi.vmdk.vmx.gpg.aes.ARC.PAQ.bz2.tbk.bak.tar.tgz.gz.7z.rar
.zip.backup.iso.vcd.bmp.png.gif.raw.cgm.tif.tiff.nef.psd.ai.svg.djvu.m4u.m3u.mid.wma.flv.3g2.mkv
.3gp.mp4.mov.avi.asf.mpeg.vob.mpg.wmv.fla.swf.wav.mp3.sh.class.jar.java.rb.asp.php.jsp.brd.sch
.dch.dip.pl.vb.vbs.ps1.bat.cmd.js.asm.h.pas.cpp.c.cs.suo.sln.ldf.mdf.ibd.myi.myd.frm.odb.dbf
.db.mdb.accdb.sql.sqlitedb.sqlite3.asc.lay6.lay.mml.sxm.otg.odg.uop.std.sxd.otp.odp.wb2.slk.dif.stc
.sxc.ots.ods.3dm.max.3ds.uot.stw.sxw.ott.odt.pem.p12.csr.crt.key.pfx.der" 

決定加密方式

找出要加密的目標後,Wannacry會呼叫自己的函式EncryptDispatcher
用幾種不同的方式來處理檔案,如下圖


我們可以把其中Switch case的Enum整理成下表

Wannacry的檔案處理
處理編號
行為
ENCRYPT_OP_NONE (0)
不處理
ENCRYPT_OP_NO_ACTION (1)
不處理
ENCRYPT_OP_DELETE_FILE (2)
刪除檔案
ENCRYPT_OP_WRITE_SRC (3)
採用覆寫檔案的方式加密
ENCRYPT_OP_NORMAL (4)
一般的加密方式

我們會再後面進一步分析主要的兩種加密方式

加密優先權

除了副檔名分類外

t.wnry會依照目前的優先權等級來決定這檔案要用什麼樣的加密方式
優先權等級從1開始到4,每個優先權對待檔案的加密方式都略有微妙的差異
判斷的函式是上圖中的GetEncryptType
因為判斷的程式碼很長且有點複雜,在此就不列出了
我們可以把程式碼內的判斷列表如下
加密優先權列表
優先權
數字
高優先權
小檔案
高優先權
普通檔案
高優先權
大檔案
低優先權
小檔案
低優先權
普通檔案
低優先權
大檔案
1
暫不處理
一般加密
覆寫加密預處理
暫不處理
2
暫不處理
覆寫加密
暫不處理
一般加密
覆寫加密預處理
3
一般加密
一般加密
覆寫加密
4
加密剩餘在列表中的所有檔案

對於大小檔案,在t.wnry的定義是這樣的:
小於0x400 == 1kb的是小檔案
大於0xC8000000 == 200Mb的是大檔案
介於這兩者之間的就是普通檔案了
判斷程式碼如下圖


t.wnry會從優先權1開始,不斷把列表的檔案拿出來檢視
需要加密的就不再放回列表,暫時不加密的就放回去
全部看完後優先權加1,然後再重複上述動作
最多4次便可把列表內的檔案全部處理完畢

t.wnry會把所有搜尋到的目標檔案放在一個鏈結串列(LinkList)結構的列表中
我們可以用動態追蹤看到檔案列表的位址
如目前這檔案的路徑位址在0x187F00
我們可以它的記憶體結構裡看到指向下一個檔案路徑的位址0x188400:


這時我們去看0x188400的記憶體位址,就會是檔案列表裡的下一個檔案:


至於有人可能會問,不是有些檔案處理方式是刪除的嗎?怎麼在列表上都沒看到?
那是因為t.wnry只有用在Wannacry自己的檔案上
如果發現這檔案是自己在加密大檔案的暫存檔 *.WNCRYT 的話,就刪除它
判斷的程式碼如下圖


Wannacry會對檔案做如此複雜的判定和分類
目的就是為了盡快能加密他認為受害者最重要的檔案
以免加密到一半被受害者發現,卻還沒加密到有價值的檔案而被中斷
也防止某些受害者故意放大檔案在電腦裡拖慢加密重要檔案的時間

Wannacry檔頭檢查

t.wnry從上述的檔案列表挑出一個檔案時
會先根據目前的加密處理方式和檔案名稱
產生一個副檔名為Wannacry相關的檔名字串出來 (並沒有真的改名)
如覆寫加密模式改成.WNCYR、一般加密模式改成.WNCRY等,如下圖
也有.WNCYR副檔名被改成.WNCRY的情況


然後t.wnry會檢查該檔案是否被加密了
如果發現已被加密過就會直接跳過換下一個檔案
檢查方式是檢查檔案的檔頭,例如開頭是不是「WANACRY!」,是的話就跳過等等
如下圖的程式碼所示:


光看程式碼可能還是有點令人費解
反正t.wnry等一下就要寫入Wannacry的Header
就在此先解釋一下Wannacry的檔頭(Header)好了


上圖是一個加密過的Wannacry檔案,照顏色方塊順序我們可以解釋如下表:

Wannacry的加密Header
偏移值(Offset)
內容
0x0000
Magic number,在此為「WANACRY!」
0x0008
加密的AES Key長度,固定為0x100
0x000C
加密的AES Key內容,每個被加密的檔案都不同
0x010C
Wannacry對這檔案的加密方式,如NORMAL(4) 或 WRITE_SRC(3)
0x0110
檔案原本的大小
0x010C
Wannacry對這檔案的加密方式,如NORMAL(4) 或 WRITE_SRC(3)
0x0118以後
被加密的檔案內容,用 AES-128 CBC 模式加密

我們從0x0110可以算出檔案原本的大小
例如上圖0x110處起的0x141488,算成10進位是1315976 bytes
也就是大約1.2Mb的大小

加密過程

前面提到t.wnry有兩種加密方式:

ENCRYPT_OP_WRITE_SRC(3) 和 ENCRYPT_OP_NORMAL(4)
這裡先分析覆寫的加密模式ENCRYPT_OP_WRITE_SRC
因為最後都會走到一般的加密模式去

覆寫模式預處理

因為大檔案本身超過200Mb,直接重寫一個新的加密檔案有點不切實際
所以t.wnry對於大檔案都採用覆寫模式,此模式有兩個階段
先用ReadFile打開原始檔案,把前0x10000(64kb)的檔案內容搬到檔案的最後面去
然後把原本前0x10000(64kb)的內容清零
好讓Wannacry自己的檔頭能寫進去,如下圖程式碼


接著寫進Wannacry自己的檔頭
這部分跟剛才檢查檔案是否被加密過的程式碼很像,只是讀改成了寫
而且t.wnry在這產生了隨機的AES 256 bytes Key寫到了檔頭裡,如下圖
所以每個檔案的AES Key都是隨機的


寫好了後再把檔案改名成<檔名>.WNCYR,一個預處理過的大檔案就完成了
我們可以看一個220Mb的PDF被預處理後的樣子


這PDF檔案的結尾是0xDC253EF,往上算0x10000 bytes 的0xDC153EF剛好就是
原本PDF的結尾處0xDC153EF (%%EOF)
這裡能很清楚的看到原本PDF的檔頭 (%PDF) 被搬到0xDC153F0來了

大檔案被預處理後的Wannacry檔頭如下圖

我們可以看到Type的欄位被填上了3,代表這Wannacry檔案是用覆寫模式預處理過的


免費解密

在開始加密檔案前,t.wnry會對小於200Mb的檔案用隨機數做一個取餘數計算
如果餘數為0,這次的加密算法就會用t.wnry一開始Import的Private Key來加密檔案
這些被加密的檔案是可以直接解密的,也就是Wannacry的免費解密,如下圖


這個免費解密的檔案個數上限被設定為10個
作者設計免費解密的用意是向受害者證明自己真的能夠解密他的檔案
讓受害者更願意付錢解密

可以解密的檔案路徑會被寫到f.wnry裡,下圖是配合@WanaDecryptor@.exe的對照圖


正式加密


t.wnry加密的方式是先開一個新的檔案,檔名是要加密的檔案副檔名後加一個「T」
如.WNCRY變成.WNCRYT,如下圖


如果t.wnry發現要加密的檔案是個預處理過的大檔案
(從第116行的encryptOpFromFile變數可以看出來)
他就會把預期要產生的檔案大小減去0x10000 bytes 即64kb
因為這是預處理時多出來的檔案大小

同樣是針對預處理過的大檔案
t.wnry會把從檔案結尾的倒數0x10000處
讀取0x10000大小的檔案內容,加密後寫到剛才產生的加密檔案,如下圖


之後的程式執行就沒分大小檔案了
t.wnry會每次讀取原本檔案0x100000 (1Mb) 大小的內容
經過加密後循環寫到這個新檔案裡,如下圖


檔案寫完之後,t.rnwy會關閉檔案
把副檔名從.WNCRYT改回.WNCRY,一個檔案的加密就完成了
t.wnry會不斷的從檔案列表裡取出檔案加密直到列表裡沒有檔案為止

Wannacry的加密演算法

Wannacry採用的是AES CBS加密算法,他是SSL和IPSec的標準
完整的加密流程如下圖


Wannacry加密流程圖的步驟我們在前面跟蹤程式的時候都一一介紹過了
讀者可綜合上一篇的佈局篇一起閱讀就能清晰其脈絡

在這流程圖中,RSA 2048 Root Public Key是內嵌在t.wnry內的,如下圖


和tasksche.exe的RSA Key不同的地方是
這把Public Key的配對Private Key在Wannacry的作者手裡
除非拿到這把Private Key,否則我們是無法獨力將他解密的

這裏我們不會詳細分析Wannacry的AES加密程式碼
因為這部分講起來是非常艱深的數論
只貼出部分程式碼如下圖:


加密完當下的原始檔案其實還是存在於受害者的電腦裡的
這時Wannacry會怎麼處理原始檔案呢? 我們留待下一篇的勒索篇中再分析之

Wannacry分析系列文:
Wannacry病毒深度技術分析(一)-傳播篇
Wannacry病毒深度技術分析(二)-系統漏洞篇
Wannacry病毒深度技術分析(三)-漏洞利用篇
Wannacry病毒深度技術分析(四)-佈局篇
Wannacry病毒深度技術分析(五)-加密篇

Wannacry病毒深度技術分析(六)-勒索篇