2017年7月1日 星期六

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



在加密檔案的期間,Wannacry會使用各種方式抹除原始檔案的痕跡避免被受害者恢復
同時浮上檯面勒索受害者
本篇介紹Wannacry這些防止恢復的手法

目前的分析位置

t.wnry在此的分析已經是最後一部份
另外這裡的Wannacry分析因為是多個執行緒平行處理
所以時序上會比較亂,請讀者仔細看好了


刪除原始資料


從加密篇t.wnry對於加密的操作來看,Wannacry並沒有直接對檔案做加密動作
那他是怎麼處理原始檔案呢?
這得要從佈局篇的時序談起
其實早在佈局篇一口氣啟動五個執行緒時
刪除原始檔案的執行緒也隨之啟動了
他埋在EnumAllDrive的執行緒和其後的StartEncryption函式內,如下圖


不過EnumAllDrive那邊的刪除檔案動作只有在發現新磁碟機時才開始執行
所以還是以StartEncryption函式內的為主要執行者

InitDeleteFileThread函式主要的內容就是開一個新的執行緒啟動刪除函式StartAddress,如下圖


刪除原始檔案的基本理念為
「把已經做好加密檔案的原始檔案更名搬到暫存目錄去,然後刪除他
但可能是因為多執行緒並行和系統環境因為加密而忙碌的關係
刪除檔案的動作並沒作者想的那麼單純,甚至失敗率還頗高
所以作者在這裏做了很多防止檔案搬移或刪除失敗的措施
例如:
1. 如果暫存目錄不存在(原因後述),就把檔案設定隱藏屬性並設定開機後刪除
2. 如果搬移檔案到暫存目錄失敗,就把檔案設定隱藏屬性並設定開機後刪除
3. 如果搬移檔案到暫存目錄成功,t.wnry會試著把檔案更名成一個遞增數字檔名的WNCRYT檔,如果更名失敗就把檔案設定隱藏屬性並設定開機後刪除
4. 如果上述步驟都成功但刪除檔案失敗,就把檔案設定隱藏屬性並設定開機後刪除

描述上述步驟邏輯的程式碼流程如下圖


為了讓刪除檔案的動作更加保險,Wannacry作者甚至又加了一個執行緒專門來刪除沒刪成功的WNCRYT檔
也就是我們在佈局篇裡看到的RunTaskdl執行緒

t.wnry會對每個非系統槽的磁碟機根目錄底下都產生一個暫存目錄叫「$RECYCLE」並把他設為隱藏屬性
建立暫存目錄的動作因為在不同執行緒裡,所以步驟1的錯誤是有可能發生的
至於系統槽就直接用Windows的暫存目錄C:\Windows\Temp了(因系統而異),程式碼如下圖


對於各磁碟目錄的原始檔案,Wannacry只採用直接刪除的方法
如果受害者在這個時間點就發現並中斷Wannacry的後續動作,救回檔案的機會還是很大的
甚至你還可以直接從Wannacry刪除檔案的暫存目錄把檔案救回來
如下圖所示,我能夠直接讀取即將被Wannacry刪除的檔案


抹除檔案

其他檔案都是搬到上述的暫存資料夾後就刪除了事
但桌面、使用者文件資料夾幾個資料夾的檔案就不同了
對於受害者桌面和文件資料夾的檔案,Wannacry很明顯對他們「重點照顧」
Wannacry會先用隨機產生字串抹寫原始資料,然後再刪除之
以降低使用者用硬碟救援軟體恢復檔案的機率

一開始Wannacry的t.wnry先開啟要抹除的檔案
檔案,然後根據檔案大小決定要每單位抹除的長度
大於256kb就用256kb、小於256kb就直接用檔案大小,如下圖


如果上圖的a2參數不存在的話
t.wnry會改用同長度的「U來代替隨機字串,如下圖


目前尚未得知a2為空的的條件何時成立
網路上有人說是根據加密副檔名列表1和2來判別,但我實際上的測試並不是如此
所有被加密的目標,不分副檔名列表1或2,都是被隨機字串抹除的
下圖是列表1的pdf檔和列表2的zip檔案同時被加密的結果
可以看出他們都是被隨機字串抹除的


t.wnry抹除原始檔案的方式為:
1. 如果檔案小於0x400 bytes (1kb),那就直接抹寫上去
如果檔案大於1kb,那就先寫檔案結尾的1kb上去,如下圖


2. 然後從檔案開頭寫起,以0x40000 (256kb)的隨機字串為單位
不斷的從頭開始寫到結束。程式碼如下圖


抹寫硬碟
除了上述方式外,t.wnry也會在每個硬碟磁碟機的暫存目錄
(系統槽是Windows的暫存目錄,其他槽就是前面提到的X:\$RECYCLE)
不斷的寫入一個叫做「hibsys.WNCRYT」的隱藏檔案
以持續抹寫硬碟的方式進一步擾亂硬碟救援軟體的運作,步驟如下:

1. 向系統要一塊0xA00000 (10Mb)的記憶體,裡面塞滿了字串「U」
(不知為何Wannacry非常喜歡U)
同時也建立上述的暫存目錄和刪除hibsys.WNCRYT(存在的話),程式碼如下圖


2. 呼叫Windows API檢查當前磁碟目錄的剩餘空間,如果還大於0x40000000 (1Gb)的話
就以每10微秒的速度持續寫入10Mb大小的「U字串,重複20次
然後再刪除該檔案,程式碼如下圖


用Immunity動態跟蹤便可以看到t.wnry正在寫入hibsys.WNCRYT的狀況,如下圖:


我們可以從暫存目錄去撈出hibsys.WNCRYT,看看t.wnry實際寫入檔案的結果
如下圖,你可以看到整個檔案全被塞滿了U


至此,Wannacry所有的加密部分已告結束
該是讓受害者知道噩耗的時候了

投放說明檔案和@WanaDecryptor@.exe
在t.wnry逐個目錄加密檔案時,
他同時也會視目錄層級投放說明檔和Decryptor
說明檔案就是在佈局篇裡準備的@Please_Read_Me@.txt」
Decryptor則是「@WanaDecryptor@.exe
好讓某些狀況外的受害者能很快注意到發生什麼事
不過他會檢查當下目錄的深度 (從根目錄算起)
如果目錄深度超過4他就不放exe檔案,改放decryptor的Link
深度超過6他就不放任何東西了,程式碼如下圖


設置桌布

加密完所有檔案後
t.wnry會把b.wnry更名成「@WanaDecryptor@.bmp」並把他拷貝到受害者帳號的桌面
同時設定這圖檔為電腦桌面的桌布,程式碼如下圖


b.wnry就是一張bmp圖檔,相信很多人已經在其他研究文章中見過了

就算受害者看不懂英文,黑底紅字也有著很好的恐嚇效果


勒索程式@WanaDecryptor@.exe

雖然我們在前面幾篇文章中的分析過程常常提到@WanaDecryptor@.exe
但到目前為止我都還沒特別分析他的作用
因為他是視窗程式,很多行為是可見的
在這裏就不解釋看得到的部分了,這部分網路上也有不少分析
另外在分析WanaDecryptor的過程中,也能看到大量在前面就分析過的程式碼
例如加密、設定桌布、起始相關API等等
看得出來都是Copy/Paste的程式碼而已
這些部分也不贅述和前面重複的部分了

@WanaDecryptor@是個有設計輸入參數的MFC程式
不帶參數直接執行程式的話
會設定受害者的桌布和根據使用者環境決定勒索視窗要顯示什麼語言的訊息
並準備Bitcoin相關的說明給受害者,畢竟有不少人連這東西都沒聽過
下圖是相關程式碼


我們在佈局篇時有提過把tasksche.exe解開後的安裝包
其中解開後的msg目錄,存放著各種語言的說明檔案
他們的格式是RTF(Rich Text Format)檔
下圖是其中一篇日文的部分說明訊息:


不帶參數的WanaDecryptor是由前面提到的t.wnry內啟動的五個執行緒中
其中之一的SetTaskscheAutoStart執行緒執行的,每30秒執行一次
大家可以再回頭參考佈局篇的說明

fi參數
當WanaDecryptor附帶fi參數執行時
他會讀取0000000.res,並試著連接作者在暗網架設的伺服器
把從00000000.res讀取到的內容的一部分回傳給Wannacry作者

00000000.res的檔案格式如下圖


以下是欄位的說明表

00000000.res欄位分析
偏移值
(Offset)
說明
範例
0x0000
識別ID
FD2E6504C0BC2692
0x0060
t.wnry啟動時間
0x595086B8 == 06/26/2017 3:59am
0x0074
加密結束時間
0x5950AA31 == 06/26/2017 6:31am
0x0078
加密開始時間
0x5950AA14 == 06/26/2017 6:30am
0x007C
加密檔案數量
0x000001A0 == 416
0x0080
加密檔案總大小
0x665F0EB3 == 1.6Gb

帶fi參數WanaDecryptor的執行時機點是在t.wnry執行五個執行緒之後
初始化加密檔案行為之前,如下圖



t.wnry會先讀取00000000.res的前136bytes和c.wnry內設定的網址https://dist.torproject.org/torbrowser/6.5.1/tor-win32-0.2.9.10.zip (該網址已失效),如下圖




然後檢查TaskData\Tor\tasksvc.exe是否存在
不存在的話就把s.wnry這壓縮檔解開,裡面內含Tor相關的工具tasksvc.exe和tor.exe
然後bind TCP port 9059



接著WanaDecryptor讀取c.wnry設定裡的Tor server,Server列表如下:


gx7ekbenv2riucmf.onion
57g7spgrzlojinas.onion
xxlvbrloxvriy2c5.onion
76jdd2ir2embyv47.onion
cwwnhwhlz52maqm7.onion

然後把從00000000.res裡讀取到的前8個bytes的字串和受害者的Hostname、Username拼裝起來一個特殊的訊息送到上述Tor server,格式為:


[8 bytes from 00000000.res][Host name]\x00[Unknown Byte][User name]\x00+++
如下圖所示:




co參數

當WanaDecryptor附帶co參數執行時
是把00000000.res裡記錄的時間和加密相關資訊回傳給tor server
和fi參數執行時相同的啟動Tor部分就不提了
他回傳的資料格式如下:

--- [LaunchTime] [EncryptEndTime] [EncryptAmount] [EncrytSize] [Index]

這些資料我們都在前面介紹00000000.res時就介紹過了
下圖是回傳資料的一個範例:




在Wannacry的實際行為裡,
co參數的啟動時機在所有的加密行為之後
畢竟得全部加密完、這些回傳的資訊才能確定嘛。如下圖



vs參數

和前面兩個參數相比,vs參數單純的多
當WanaDecryptor附帶vs參數執行時
會試圖刪除所有受害者系統的還原點或磁碟備份,如Shadow Copy等
這些備份技術都是Windows自身支援的,程式碼如下圖


第68行起綠色部分的註解就是刪除備份的指令

執行vs參數的時機點就在co參數之後,目標是斬斷受害者所有的備份可能


如果受害者有所謂的異地備援,其實不管勒索病毒怎麼抹除檔案都還是能恢復的
這裡也提醒大家重要資料記得備份到不同的電腦裡


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