2017年6月4日 星期日

Wannacry病毒深度技術分析(一)-傳播篇



在Wannacry造成災情之前
筆者剛好有在研究他所利用的漏洞-EternalBlue
也因此有機會在Wannacry事件中盡一番心力
於是想藉此把Wannacry像熱血系列一樣

用反向工程(Reverse engineering)研究一下
所以在之後的文章裡

我們會用幾篇文章的篇幅把Wannacry大卸八塊
看看他內部到底是怎麼運作的


在筆者研究Wannacry的這段期間

網路上已經有不少專門研究安全威脅的公司或論壇發表了相關研究
畢竟筆者是業餘,而且不以搶快為目的
所以Wannacry的行為其實已經被他們研究的差不多了
筆者當然也有參考不少這些文章
如果已經有看過網路上所有Wannacry技術研究相關的人
應該會看到很多和其他文章雷同的地方
就請當作我這些文章是把網路上這些相關資訊整合起來的筆記吧

因為我們不會特別從基礎講起
建議讀者最少對C、Windows API有基本的認知

Wannacry的組成

WannaCry主要由四個部分組成:Launcher.dll、mssecsvc.exe、tasksche.exe和t.wnry

他們的相關用途隨著文章跟蹤的過程會一一介紹

Wannacry感染其他電腦的技術細節

大部分人應該都知道
Wannacry是利用今年(2017)四月,Shadowbroker釋出從NSA偷來的眾多漏洞工具的其中之一:EternalBlue (永恆之藍 )來進行感染的
這一點可以在他的的反向程式碼中看出來

節錄自mssecsvc.exe的攻擊程式碼,偵測對方是否已經被感染



節錄自Luke Jennings 反向EternalBlue得到的程式碼: 
(來源:https://github.com/countercept/doublepulsar-detection-script/blob/master/detect_doublepulsar_smb.py)

從這段簡短的程式碼片段我們可以知道Wannacry和EternalBlue有一定程度的關係
事後也證明它的確是利用EternalBlue的漏洞

附帶一提,我寫的偵測程式也是根據這段程式碼來實作的
之後的文章裡我們還會見到這段程式碼

感染開始

目前的分析位置

要講Wannacry的感染過程
得先從mssecsvc.exe開始看起
它是Launcher.dll在本地端電腦drop下來的程式



Kill Switch?

在Wannacry開始在世界各地造成災情時
一度有傳出有人找到Wannacry的「Kill Switch」可以終止病毒運作
這傳聞的確是真的,我們可以在剛開始造成災情的病毒樣本上見到

mssecsvc.exe在一開始啟動時,會嘗試打開URL 「http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com」
如果此網站能連上的話,就停止執行並退出程式
在病毒剛開始在全世界擴散之初,一位MalwareTech的研究員在研究樣本時發現了這行為
出於好奇他註冊了這個域名
結果竟然無意間中止了最初病毒的擴散
以下是Kill Switch的程式碼:



這段程式碼非常直觀,連不上這網址時就退出,反之就繼續運作,進入WannaCryMain函式
對於這麼簡單就成功的反制方法意外奏效
病毒作者在短短幾個小時內也很快放出來了沒有Kill Switch的變種來繼續感染
儘管如此,MalwareTech也成功的爭取了幾個小時讓大家安裝Patch了
至於病毒作者為何弄了個石頭砸自己的腳,眾說紛紜
比較普遍的說法是為了讓Wannacry偵測自己是不是跑在砂盒(Sandbox)環境下
但寫的手法太粗糙了,最少也應該隨機生成幾個網址來偵測
這樣研究人員起碼也不能用註冊網域的方式來阻止病毒執行

現在的Wannacry變種都沒有Kill Switch了,不過我手上這樣本就是最初有Kill Switch的版本
所以我在動態分析樣本時,都得手動避開這檢查才能繼續分析下去



創建服務

Kill Switch檢查通過後
Wannacry會在Windows裡創建名為「mssecsvc2.0」的服務
描述是「Microsoft Security Center (2.0) Service」並設定為開機後啟動
以便受害者重開機後繼續感染
同時也啟動該服務開始進行傳播行為



被種Key之後的系統服務註冊表:




註冊為服務後的Wannacry接著會把Tasksche.exe解開並啟動他
繼續進行其他加密行為
加密這部分的分析我們會在之後的文章討論
今天我們只專注在傳播部分


傳播過程


把自身註冊為Windows服務的Wannacry啟動後
會執行真正的兩條感染執行緒
啟動執行緒後會讓自己沉睡一整天
讓這兩個執行緒盡情的工作

下面是RunInfectProc函式的程式碼:



其中,InfectLAN這執行緒的目標是感染與該電腦同網段的PC
他使用Windows API的GetAdaptersInfo取得該網段的IP資訊
利用這些資訊生成一個覆蓋整個區域網網路的table來攻擊其他電腦



InfectLAN 呼叫 StartInfect進行攻擊的程式碼:



InfectWAN則是隨機生成IP
偵測他們是否能連接SMB
可以的話就一樣呼叫MS17_010Attack加以攻擊



至於MS17_010Attack實際的攻擊細節

Wannacry利用了前一個月被公開的EternalBlue和DoublePulsar Exploit
我們在之後會另開專文進一步探討這個漏洞
在這裡只要知道Wannacry利用了Exploit把DLL注入到受害者系統的lsass.exe就可以了

準備Payload


在實際感染到其他受害者電腦並注入DLL前

Wannacry會根據對方的平台準備Payload
在準備Payload之前,Wannacry先呼叫Windows API CryptoAcquireContext



這API呼叫之後,Wannacry便初始化了加密相關的API而讓Wannacry有了加密能力
之後加密受害者電腦的檔案時我們會再見到他
總之接著Wannacry開始組裝Payload



從上圖我們可以看到Payload依平台分成兩種
x68的Payload大小為16480、而x64的Payload大小為51364
在這段程式碼裡Wannacry只取用Payload的.rsrc section其後的部分來組裝成最後要注入到受害者機器的檔案-Launcher.dll


目前的分析位置

儘管Payload的大小隨不同平台而不太一樣
但他們的目的都是一樣的
就是Payload的內容都是準備注入的DLL的啟動函式-PlayGame
下圖是含有PlayGame的Binary內容起始處






乍看之下我們看不出什麼名堂
那是因為IDA Pro把這區段當成是資料了
(以標準來說他的確也是資料)
所以我們要讓IDA把這裡當成是程式碼
只要在0x00400C134處按C
IDA就會從此處起以組合語言來解釋他
再用Create Function功能
我們就能把他還原成C程式碼了

轉成程式碼的0x00400C134處如下圖



我們可以看到Payload內容其實就是Launcher.dll內的PlayGame函式
至於這PlayGame函式在做什麼事情
我們等討論到注入DLL之後的行為就會提到

Wannacry把Payload的內容組裝成Launcher.dll後
會加密封包並注入到目標系統內
(加密方式我們在分析EternalBlue時會提到)
這段封包的大小足足有5Mb,其實就是Launcher.dll的大小
下圖是動態跟蹤Wannacry時,Wannacry準備好Launcher.dll時截取的圖:







我們把這塊記憶體Dump出來後

就能得到Launcher.dll全部的binary
Launcher.dll的大小為5Mb左右
以Malware來說,這Size是有點大的
下圖是x86版本Launcher.dll的檔案資訊




釋放Mssecsvc.exe

Wannacry傳播成功並注入DLL之後
另一名受害者B的lsass.exe記憶體內也有了Launcher.dll
他的感染循環示意圖是這樣的



被注入到lsass.exe的Launcher.dll
其實一直待在記憶體中,不會存到硬碟裡
我們只能用Windbg等其他軟體觀察到他的存在
這個DLL裡面只有一個Export函式,就是前面Payload裡的PlayGame


PlayGame的函式作的事情其實也不複雜
他只是用Windows API的LoadResource把內嵌在Launcher.dll裡面的mssecsvc.exe放出來而已



我們可以用工具找出Launcher.dll內嵌的Resource「W」


開頭的前3個Byte是Resource大小
0x38D000 = 3723264 bytes就是mssecsvc.exe的大小
由於mssecsvc.exe是第一個存到受害者硬碟的檔案
所以他通常被視為Wannacry的本體
Wannacry的Launcher.dll釋放mssecsvc.exe到C:\Windows目錄後
就用CreateProcessA把mssecsvc.exe啟動



就這樣
在受害者B的電腦裡又啟動了Wannacry的感染循環
於是Wannacry就此生生不息....
呃,起碼Wannacry的作者是這麼想的

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