作者 | 楊秀璋
編輯?| 夕顏
題圖 | 東方 IC
出品 | CSDN(ID:CSDNnews)
這篇文章將詳細講解WannaCry蠕蟲的傳播機制,帶領大家詳細閱讀源代碼,分享WannaCry勒索病毒是如何傳播感染的。作者分析該病毒一個月,一方面覺得自己技術菜,另一方面深知系統安全需要堅持,繼續加油。希望文章對您有所幫助~
本文參考了github、安全網站和參考文獻中的文章(詳見參考文獻),并結合自己的經驗和實踐進行撰寫,也推薦大家閱讀參考文獻。
作者的github資源:
軟件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
Wannacry分析:https://github.com/eastmountyxz/WannaCry-Experiment
WannaCry背景
2017年5月12日,WannaCry蠕蟲通過永恒之藍MS17-010漏洞在全球范圍大爆發,感染大量的計算機。WannaCry勒索病毒全球大爆發,至少150個國家、30萬名用戶中招,造成損失達80億美元,已影響金融、能源、醫療、教育等眾多行業,造成嚴重的危害。
WannaCry是一種“蠕蟲式”勒索病毒軟件,由不法分子利用NSA泄露方程式工具包的危險漏洞“EternalBlue”(永恒之藍)進行傳播。該蠕蟲感染計算機后會向計算機中植入敲詐者病毒,導致電腦大量文件被加密。
WannaCry利用Windows系統的SMB漏洞獲取系統的最高權限,該工具通過惡意代碼掃描開放445端口的Windows系統。被掃描到的Windows系統,只要開機上線,不需要用戶進行任何操作,即可通過SMB漏洞上傳WannaCry勒索病毒等惡意程序。
勒索病毒是怎么傳播的、WannaCry利用永恒之藍漏洞進行網絡端口掃描攻擊,目標機器被成功攻陷后會從攻擊機下載WannaCry蠕蟲進行感染,并作為攻擊機再次掃描互聯網和局域網的其他機器,行成蠕蟲感染大范圍超快速擴散。
木馬母體為mssecsvc.exe,運行后會掃描隨機IP的互聯網機器,嘗試感染,也會掃描局域網相同網段的機器進行感染傳播,此外會釋放敲詐者程序tasksche.exe,對磁盤文件進行加密勒索。木馬加密使用AES加密文件,并使用非對稱加密算法RSA 2048加密隨機密鑰,每個文件使用一個隨機密鑰,理論上不可攻破。同時@WanaDecryptor@.exe顯示勒索界面。其核心流程如下圖所示:
WannaCry勒索病毒主要行為是傳播和勒索。
傳播:利用基于445端口的SMB漏洞MS17-010(永恒之藍)進行傳播
勒索:釋放文件,包括加密器、解密器、說明文件、語言文件等;加密文件;設置桌面背景、窗體信息及付款賬號等。
WannaCry傳播機制源碼詳解
WannaCry蠕蟲主要分為兩個部分:蠕蟲部分用于病毒傳播,并釋放出勒索程序;勒索部分用于加密用戶文件索要贖金。大家可能看到的很多樣本都是沒有傳播部分代碼或域名開關的。接下來是作者一點點的摸索,希望對您有所幫助,也歡迎批評和指正。
勒索病毒原理。1.WannaCry蠕蟲傳播流程
WannaCry運行的整體流程推薦安天公司的框架圖,如下圖所示:
主程序文件利用漏洞傳播蠕蟲,運行WannaCry勒索程序
WannaCry勒索程序釋放tasksche.exe,對磁盤文件進行加密勒索
@WanaDecryptor@.exe顯示勒索信息,運行TOR客戶端
其中,圖中上半部分為WannaCry蠕蟲的傳播部分,該蠕蟲通過網絡進行傳播,有自我復制和傳播迅速等特點。傳播步驟如下:
wannacry勒索病毒?(1) 連接遠程域名開關
(2) 判斷參數個數,選擇蠕蟲安裝流程或服務傳播流程
<2時,進入安裝流程,點擊直接運行
① 創建服務:服務名稱mssecsvc2.0,參數為–m security
② 釋放并啟動tasksche.exe程序
≥2時,進入服務傳播流程
① 服務函數中執行傳播感染功能
② 打開mssecsvc2.0服務并設置其狀態
③ 蠕蟲初始化操作后,會進行局域網和公網傳播(建立局域網或公網IP表,創建IP線程)
④ 嘗試連接445端口,測試是否存在SMB漏洞
⑤ 如果存在漏洞,則建立通信連接并發送Payload(X86或X64)進行攻擊
⑥ 執行shellcode并使用APC注入將生成的dll注入到進程lsass.exe
⑦ dll調用導出函數PlayGame,釋放資源文件并保存為mssecsvc.exe執行
作者的分析工具主要是IDA Pro靜態分析和OllyDbg動態調試,大家分析惡意樣本一定在虛擬機中,并做好相關安全保護(如斷網、物理隔離、共享協議端口關閉等)。
2.程序入口Start
計算機蠕蟲病毒屬于什么病毒?通過OD打開樣本wcry.exe,發現程序入口地址為0x00409A16,對應start()函數。
通過一些初始化設置,緊接著會調用WinMain()函數進入主程序。
主程序調用關系如下圖所示,調用地址為0x00409B45。
3.域名開關WinMain
主程序運行后會先連接域名(KillSwitch)hxxp://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com
如果該域名連接成功,則直接退出且不觸發任何惡意行為
如果該域名無法訪問,則觸發傳播勒索行為,執行sub_408090函數
勒索病毒溯源分析。該代碼會調用InternetOpenUrl打開對應的網址,并根據其訪問情況執行不同的操作。如果網址無法訪問,會調用sub_408090()函數創建蠕蟲服務。這也意味著如果蠕蟲作者注冊并訪問了該URL,WannaCry蠕蟲也就停止了傳播。目前該域名已被英國的安全公司接管,網上懷疑該操作能有效防止在線沙箱檢測。
4.參數判斷sub_408090
接著進入sub_408090函數,通過判斷參數個數來執行相應的流程。
sub_407F20函數:當參數<2,進入蠕蟲安裝流程
sub_408000函數:當參數≥2,進入蠕蟲服務傳播流程并創建mssecsvc2.0服務
勒索病毒源碼公開,該函數調用了相關的API函數,比如創建服務(OpenSCManagerA)、打開服務(OpenServiceA)等。當我們直接運行wcry.exe時,傳遞的參數是1(程序本身),則進入蠕蟲安裝程序;當我們傳遞參數3(程序本身、二進制程序、服務參數)時,則進入蠕蟲服務傳播流程。
推薦綠盟API詞典:惡意樣本分析手冊——API函數篇 - 李東宏
mssecsvc2.0服務對應的數據部分如下圖所示,該服務會偽裝成微軟安全中心的服務,服務的二進制文件路徑為當前進程文件路徑,參數為“-m security”。
OD動態調試如下圖所示,包括調用CALL訪問函數,將服務PUSH入棧等。
電腦感染了蠕蟲病毒,
5.蠕蟲安裝流程sub_407F20
蠕蟲安裝流程主要調用sub_407F20函數,包括sub_407C40和sub_407CE0。
(1) sub_407C40:創建mssecsvc2.0服務,并啟動該服務,參數為”-m security”,蠕蟲偽裝為微軟安全中心。
復制應激、(2) sub_407CE0:讀取并釋放資源tasksche.exe至C:\Windows路徑,創建線程運行。
主要調用的函數包括GetProcAddress、MoveFileEx、CreateFile等。
動態調用過程如下圖所示:
釋放的C:\Windows\tasksche.exe效果如下圖所示:
計算機蠕蟲比計算機病毒傳播得更快?
6.蠕蟲服務傳播流程sub_4080000
當參數≥2時,蠕蟲執行服務傳播流程,調用sub_4080000實現,其代碼如下:
sub_4080000會打開mssecsvc2.0服務并設置其狀態,服務設置函數包括RegisterServerCtrlHandlerA、SetServiceStatus。
糯蟲病毒傳染,動態分析過程如下圖所示:
核心函數是sub_407BD0,它的功能包括:
初始化操作
局域網傳播
公網傳播
蠕蟲通過什么傳播病毒,
7.蠕蟲初始化操作sub_407B90
蠕蟲初始化操作主要調用sub_407B90函數實現,具體功能包括:
WSAStartup:初始化網絡
sub_407620:初始化密碼
sub_407A20:獲取Payload
感染蠕蟲病毒癥狀。
函數WSAStartup主要是進行相應的Socket庫綁定。函數原型如下:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
使用Socket程序之前必須調用WSAStartup函數,以后應用程序就可以調用所請求的Socket庫中的其它Socket函數
int WSACleanup (void)
應用程序在完成對請求的Socket庫的使用后,要調用WSACleanup函數來解除與Socket庫的綁定并且釋放Socket庫所占用的系統資源
gethostbyaddr \ gethostbyname \ gethostname \ getprotolbynumber \ getserverbyname \ getservbyport
Socket接口的檢索有關域名、通信服務和協議等Internet信息的數據庫函數
繼續調用sub_407A20函數從內存中讀取MS17-010漏洞利用代碼,Payload分為x86和x64兩個版本,32位大小為0x4060,64位大小為0xc8a4。
8.局域網傳播sub_407720
蠕蟲初始化操作后,會生成兩個線程,分別進行局域網和公網傳播。
result = sub_407B90
v1 = (void *)beginthreadex(0, 0, sub_407720, 0, 0, 0)
v3 = (void *)beginthreadex(0,0, sub_407840, v2, 0, 0)
局域網傳播:蠕蟲根據用戶內網IP,生成覆蓋整個局域網網段表,然后循環嘗試攻擊。
這里存在一個疑問:你怎么能確定v1是局域網傳播,而v3是外網傳播呢?
在函數sub_407720中,會繼續調用線程執行sub_4076B0函數。同時,函數如果同時調用10個以上IP地址,會執行Sleep暫停100毫秒(1秒=1000毫秒)。
核心函數:sub_4076B0
函數sub_407720會調用函數sub_409160,接著調用GetAdaptersInfo獲取網卡配置和IP地址詳細信息,最終進行局域網IP地址拼接和傳播。而外網傳播的IP地址是通過四個隨機數產生的,通過這些差異就能判斷是局域網傳播還是外網傳播。
函數sub_4076B0會連接445端口,如果445端口連接成功,接著發起漏洞攻擊。如果連接超過10分鐘則終止該線程。
接下來調用sub_407540函數發起漏洞攻擊。
核心函數:sub_407540
9.公網傳播sub_407840
公網傳播:公網IP地址通過4個隨機數拼接而成,然后循環嘗試攻擊。
sub_407840函數會生成四個隨機數,然后調用aDDDD進行IP拼接,表示成%d.%d.%d.%d。0xFF表示255,對應最大地址,v8余數不等于127內網。接著調用sub_407540函數進行外網傳播。
in_addr_t inet_addr(const char cp)
作用:將一個點分十進制的IP轉換成一個長整數型數
參數:字符串,一個點分十進制的IP地址
返回值:如果正確執行將返回一個無符號長整數型數,如果傳入的字符串不是一個合法的IP地址,將返回INADDR_NONE
char * inet_ntoa(struct in_addr in)
作用:將一個十進制網絡字節序轉換為點分十進制IP格式的字符串
參數:一個網絡上的IP地址
返回值:如果正確,返回一個字符指針,指向一塊存儲著點分格式IP地址的靜態緩沖區;如果錯誤返回NULL
在sub_407840函數中,繼續調用線程執行sub_407540函數,該函數為漏洞利用核心函數。
10.漏洞檢測及創建通信連接sub_407540
IP地址拼接好后,會創建漏洞利用線程,調用sub_407540函數。
第一步:檢測目標是否可以安裝雙星脈沖DOUBLEPULSAR(端口445)
如果需要,后續可以分享一篇永恒之藍和雙星脈沖相關知識。
第二步:利用MS17-010漏洞,嘗試建立通信連接并發送漏洞利用程序數據包
通過connet建立Socket通信連接,再調用send和recv進行數據包握手確認。最后會調用核心函數sub_406F50。
11.發送SMB數據包sub_4072A0
建立通信連接(connect、send、recv),發送利用Eternalblue的蠕蟲SMB數據包。具體流程包括:(還需進一步分析)
建立連接:IP地址、445端口
先發送一個SMB請求
接受正常回復后往SMB做緩沖區溢出
先往SMBv2的緩沖區發數據,然后是往SMBv1發大量數據,最后往SMBv2發數據
SMBv1連接關閉后SMBv2附近會產生空洞
形成永恒之藍攻擊后門
最后用雙星脈沖來將dll注入有后門主機并運行
12.獲取Payload(dll+shellcode)
樣本在利用漏洞MS17-010獲取目標主機權限后,并不會直接發送蠕蟲自身到目標,而是發送一段經過簡單異或加密后的Payload到目標機器中執行。在sub_4077A0函數中,v7是系統標記,當v7等于1時表示32位操作系統,當v7等于0時表示64位操作系統。
核心函數:sub_406F50(發送Payload)
Payload由shellcode和包含樣本自身的dll組成,Payload分為64位與32位,函數sub_406F50如下圖所示。
32位shellcode起始地址0x42E758
64位shellcode起始地址0x42FA60
dll同樣分為64位與32位版本,根據目標主機系統的不同,讀取不同版本的dll
32位dll起始地址0x40B020,大小為0x4060字節
64位dll起始地址0x40F080,大小為0xc8a4字節
Shellcode相關信息
32位shellcode起始地址0x42E758,大小為0x1305字節
64位shellcode起始地址0x42FA60,大小為0x1800字節
13.提取shellcode
對應的反匯編代碼如下,包括x64_payload_addr、x86_payload_addr。
32位Shellcode獲取:0x42E758~0x42FA5D。
64位Shellcode提取:0x42FA60~0x43125F。
14.shellcode分析之安裝后門
Shellcode反匯編及功能分析如下:
第一部分:安裝后門
第二部分:利用安裝的后門,APC向應用程序注入dll
① 查找基地址
② 獲取Hash計算方法
③ 根據基地址、函數hash字符查找導出函數地址
④ 查找需要用到導出函數地址并保存導出函數hash對照表
⑤ 查找目標進程,通過hash編碼782BF0E7h進程名查找(lsass.exe)
⑥ 使用查到導出函數的地址,并進行APC注入
⑦ 最后將shellcode自身以及其所分配的內存清0
shellcode部分作者還需要進一步研究,加油~
安裝后門主要執行sub_401370函數,在遠程電腦上安裝雙星脈沖DOUBLEPULSAR后門。
15.shellcode分析之APC注入
shellcode第二部分是利用安裝的后門,APC向應用程序注入dll。
(1) 查找ntoskrnl.exe基地址
首先找到gs[38]處的_KIDTENTRY64指針,在KIDTENTRY64的偏移4,得到中斷處理的函數指針,這個地址在ntoskrnl.exe中,我們就找到了ntoskrnl.exe的地址空間,然后去地址空間的頁頭地址對比PE頭MZ,找到則函數返回。
(2) 獲取Hash計算方法
需要使用的函數并沒有硬編碼寫到程序里,而是硬編碼了這些函數的hash值。所以我們需要首先知道函數編碼和hash值得對應關系。Hash計算方法如下,用c++代碼注釋了一下。
(3) 根據ntoskrnl.exe基地址、函數hash字符查找導出函數地址
find_func函數如下,有了ntoskrnl.exe所有導出函數hash對照表,整個程序流程就明朗了。
(4) 查找需要用到ntoskrnl.exe導出函數地址并保存備用
(5) 查找目標進程,通過hash編碼782BF0E7h進程名查找(lsass.exe)
查找目標進程,通過hash編碼782BF0E7h進程名查找,直接沒找到“lsass.exe”,查找方法是使用pid暴力查找。具體通過pid調用PsLookupProcessByProcessId得到pEProcess結構指針,再通過pEProcess調用PsGetProcessImageFileName得到進程名。
(6) 使用查到導出函數的地址,并進行APC注入
APC注入,使用查到導出函數的地址,注釋見截圖。第六個參數包含了第三層shellcode和dll代碼,可自行dump出研究,第七個參數指定為usermode。
(7) 最后將shellcode自身以及其所分配的內存清0
內核部分的注入代碼主要流程就分析完了,到用戶層的shellcode自己實現的一個pe loader而沒有使用LoadLibary,這樣使得注入更加隱蔽,查詢PEB_LDR_DATA的也查不到被注入了dll。
16.dll導出及分析
shellcode使用APC注入將生成的dll注入到系統進程lsass.exe,導出的dll文件如下圖所示:
火絨劍檢測結果如下,通過APC注入將生成的dll注入到系統進程lsass.exe,接著釋放資源mssecsvc.exe,最后釋放勒索程序tasksche.exe。
17.釋放資源tasksche.exe
dll具有一個導出函數PlayGame,它會將母體程序釋放到被攻擊的計算機,保存為C:\WINDOWS\mssecsvc.exe并執行。下面是作者分析導出的dll靜態代碼,主函數PlayGame。
PlayGame包括兩個核心函數:sub_180001014和sub_1800010F8。
sub_180001014:釋放資源
sub_1800010F8:運行文件
最后釋放資源tasksche.exe(勒索加密程序)到C:\WINDOWS目錄下,并將其啟動。
被攻擊的計算機包含蠕蟲的完整功能,除了會被勒索,還會繼續使用MS17-010漏洞進行傳播,這種傳播呈幾何級向外擴張,也是該蠕蟲短時間內大規模爆發的主要原因。
18.勒索行為
勒索行為下一篇文章將詳細介紹
運行病毒程序后的界面如下圖所示,已經成功被勒索。再次強調,所有代碼必須在虛擬機中執行,并且關閉文件共享。
樣本的解壓密碼是WNcry@2ol7,通過資源工具也可以查看到。解壓后的文件結構如下:
msg文件夾下就是所有的語言包。
其他文件內容如下,下一篇文章會詳細介紹勒索原理。
b.wnry: 中招敲詐者后桌面壁紙
c.wnry: 配置文件,包含洋蔥域名、比特幣地址、tor下載地址等
f.wnry: 可免支付解密的文件列表
r.wnry: 提示文件,包含中招提示信息
s.wnry: zip文件,包含Tor客戶端
t.wnry: 測試文件
u.wnry: 解密程序
總結
寫到這里,這篇文章就介紹完畢。主要講解了WannaCry蠕蟲的傳播機制,也是作者一個月的研究成果,感覺是全網WannaCry蠕蟲傳播部分最詳細的一篇文章了。最后,感覺自己真的好菜,但也需要加油,希望您喜歡這篇文章~
參考文獻
為了更好幫助讀者,作者將參考文獻提前。下面給出下各大安全廠商及安全大佬對WannaCry蠕蟲分析的文章,強烈推薦大家閱讀,作者也吸取了它們的精華,在此感謝。
安全廠商樣本分析:
[1] 安天針對勒索蠕蟲“魔窟”(WannaCry)的深度分析報告
[2] [分享] 勒索病毒WannaCry深度技術分析——詳解傳播、感染和危害細節 - 火絨安全
[3] WannaCry勒索病毒詳細解讀 - 騰訊電腦管家
[4] NSA Eternalblue SMB 漏洞分析 - 360核心安全
[5] 針對WannaRen勒索軟件的梳理與分析 - 安天
[6] 【權威報告】WanaCrypt0r勒索蠕蟲完全分析報告 - 360追日
[7] WannaCry勒索病毒分析報告 - 瑞星
安全大佬樣本分析:
[1] 對WannaCry的深度分析 - 鬼手56(勒索部分詳解)
[2] [原創]WannaCry勒索軟件中“永恒之藍”漏洞利用分析 - 展博
[3] [原創]通過Wannacry分析內核shellcode注入dll技術 - dragonwang
[4] [病毒分析]WannaCry病毒分析(永恒之藍) - 小彩虹
[5] WannaCry勒索病毒逆向和內網傳播數據分析 - sec360zz
[6] 首發 | Wannacry勒索軟件母體主程序逆向分析(含臨時解決方案自動化工具)- expsky
[7] [原創]WannaCry深度詳細分析報告(很細很深)- anhkgg
[8] https://github.com/rapid7/metasploit-framework
[9] https://www.zhihu.com/question/59792644
原文鏈接:
https://blog.csdn.net/Eastmount/article/details/105903050
推薦閱讀
真沒想到,Python 還能實現 5 毛特效
作詞家下崗系列:教你用 AI 做一個寫歌詞的軟件
AI修復100年前晚清影像喜提熱搜,這兩大算法立功了
阿里云自研數據倉庫 AnalyticDB 再捧 TPC 全球冠軍
調查了 17,000 多位程序員,當前的云原生開發現狀究竟如何?
CSW:驚天巨騙 or 比特幣“圖騰”中本聰?
從 0 到 70%:Chrome 上位揭秘!
你點的每個“在看”,我都認真當成了AI
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态