勒索病毒是怎么傳播的,WannaCry勒索病毒復現及分析,蠕蟲傳播機制全網源碼詳細解讀 | 原力計劃

 2023-12-25 阅读 79 评论 0

摘要:作者 | 楊秀璋編輯?| 夕顏題圖 | 東方 IC出品 | CSDN(ID:CSDNnews)這篇文章將詳細講解WannaCry蠕蟲的傳播機制,帶領大家詳細閱讀源代碼,分享WannaCry勒索病毒是如何傳播感染的。作者分析該病毒一個月,一方面覺得自己技術菜,


作者 | 楊秀璋

編輯?| 夕顏

題圖 | 東方 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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196861.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息