一.WannaCry背景
2017年5月12日,WannaCry蠕虫通过永恒之蓝MS17-010漏洞在全球范围大爆发,感染大量的计算机。WannaCry勒索病毒全球大爆发,至少150个国家、30万名用户中招,造成损失达80亿美元,已影响金融、能源、医疗、教育等众多行业,造成严重的危害。
WannaCry是一种“蠕虫式”勒索病毒软件,由不法分子利用NSA泄露方程式工具包的危险漏洞“EternalBlue”(永恒之蓝)进行传播。该蠕虫感染计算机后会向计算机中植入敲诈者病毒,导致电脑大量文件被加密。
WannaCry利用Windows系统的SMB漏洞获取系统的最高权限,该工具通过恶意代码扫描开放445端口的Windows系统。被扫描到的Windows系统,只要开机上线,不需要用户进行任何操作,即可通过共享漏洞上传WannaCry勒索病毒等恶意程序。
WannaCry利用永恒之蓝漏洞进行网络端口扫描攻击,目标机器被成功攻陷后会从攻击机下载WannaCry木马进行感染,并作为攻击机再次扫描互联网和局域网的其他机器,行成蠕虫感染大范围超快速扩散。
木马母体为mssecsvc.exe,运行后会扫描随机IP的互联网机器,尝试感染,也会扫描局域网相同网段的机器进行感染传播,此外会释放敲诈者程序tasksche.exe,对磁盘文件进行加密勒索。
木马加密使用AES加密文件,并使用非对称加密算法RSA 2048加密随机密钥,每个文件使用一个随机密钥,理论上不可破解。同时@WanaDecryptor@.exe显示勒索界面。其核心流程如下图所示:
WannaCry勒索病毒主要行为是传播和勒索。
传播:利用基于445端口的SMB漏洞MS17-010(永恒之蓝)进行传播
勒索:释放文件,包括加密器、解密器、说明文件、语言文件等;内存加载加密器模块,加密执行类型文件,全部加密后启动解密器;解密器启动后,设置桌面背景显示勒索信息,弹出窗口显示付款账号和勒索信息
二.实验环境搭建
实验环境:
攻击机1:Kali-linux-2019.2 IP:192.168.44.138
攻击机2:Win-server-2003 IP:192.168.44.131
受害主机:Win7 64位 IP:192.168.44.132
实验工具:
Python 2.6
Python32-221.win32-py2.6
Shadowbroker-master (https://github.com/misterch0c/shadowbroker)
Wcry.exe
实验步骤:
配置Windows Server 2003、Kali、Windows7实验环境
Kali检测受害主机445端口(SMB协议)是否开启
运行永恒之蓝Python脚本
利用DLL后门文件进行Doublepulsar注入
Metaploit获取受害主机的shell
运行wcry.exe母体程序,实现勒索和文件加密
三、样本概况
1 | 文件版本:6.1.7601.17514 (win7sp1_rtm.101119-1850) |
查壳
看到了一些注册表操作
资源段查看
这个资源名为XIA的自定义资源了文件头为pk 这是一个zip文件 接下来直接将资源提取
应该是病毒释放到桌面的一些文件
三.具体行为分析
使用火绒剑工具监控病毒样本的运行,待病毒执行一段时间后,分开查看病毒的行为。分析监控到的日志,主要观察的点:
①文件操作,主要看文件创建、修改、删除等操作
②注册表操作,主要看注册表设置、创建等操作
③进程操作,主要看创建进程、写入内存等操作
④网络操作,主要看网络连接地址、IP等信息
⑤其他行为,以及观察病毒样本运行后的反应
3.1进程树比对
由上图可以得知 病毒创建了四个子进程 其中还使用了cmd.exe执行一个批处理脚本文件
3.2 进程行为检查
3.2.1 文件操作,主要看文件创建、修改、删除等操作
由于数量太多,我先筛选了文件创建
可以看到它创建了很多的有后缀的文件,应该是加密文件
还创建了后缀~sd52fb.tmp文件
这个还在每个目录下创建了@WanaDecryptor@.exe @Please_Read_Me@.txt 应该是感染文件
筛选释放隐藏文件行为
在筛选释放隐藏文件行为
病毒在系统盘和桌面释放了几个PE文件并启动执行 这里应该是在释放隐藏在资源中的文件
3.2.2注册表操作
关于注册表 这里我使用regshot对运行病毒前后做一个快照进行比对 直接查看结果
关于注册表的修改操作并不多 在HKLM\SOFTWARE新增加了一个键 并且把当前病毒的路径添加上去 并且还添加了另外两个值
3.2.3网络操作
从网络监控可以看到 病毒一直在监听两个端口 并尝试连接局域网内的一些ip 企图向局域网扩散
五、使用IDA和OD进行详细分析
主体逻辑
关键函数ReleaseFiles()
ReleaseFiles()这个函数首先将资源中隐藏的压缩包进行解压 解压密码是WNcry@2017 然后释放压缩包中的所有文件到当前进程的路径下释放完之后的桌面路径
writecwnry
这个函数获取到了三个比特币账户 然后随机将其中的某一个写入到c.wnry文件中 所以c.wnry这个文件应该是跟勒索相关的
ExeCmdCommand 执行命令行参数
第一个ExeCmdCommand创建了一个进程 进程的参数是attrib +h . 这个参数的含义是将当前路径下的所有文件设置为隐藏 但是这其实是个错误的命令 正确的命令是attrib +h 没有后面的那个点 所以这个函数也就没有起到作用第二个`ExeCmdCommand直接看命令行参数 ‘icacls . /grant Everyone:F /T /C /Q’ 这条命令是给当前的windows系统添加了一个叫Everyone的用户 并给这个用户所有的权限至此 第一个部分分析完成
GetApis 获取必要的API函数
个函数的功能很简单 就是在获取各个API函数的地址 比如CreateFileW WriteFile 等等 为后面的操作做准备
importKeyAndAllocMem
这个函数做了两件事情 1. 导入RSA的私钥 用于后面的解密文件 2. 申请两块大小为0x100000的内存
DecryptFile 解密t.wnry
这个函数一直在对t.wnry这个文件进行读取操作 读取到内存之后传入上个函数拿到的密钥句柄 在内存中进行解密 然后返回解密之后的文件内容 我们可以在OD中查看函数的返回值
这里可以看到解密之后的内容 是一个PE文件 接下来提取出解密之后的文件内容 查看一下PE结构 判断是个dll文件 接下来再跟t.wnry原始文件做一个对比
WriteAllocMem
拷贝PE文件到内存
GetExportFunAddr 获取导出函数地址
这个函数传了两个参数 一个是堆空间的首地址 一个是TaskStart这个字符串 单步步过这个函数 可以看到函数返回了一个地址 并且在后面调用了这个这个地址 但是我们并不知道地址从何而来 所以还需要跟进去
这个函数首先取出了数据目录表 然后根据数据目录表找到了导出表 接着查看刚刚提取出来的dll的导出表 如下
有一个导出函数TaskStart 这不就是传进去的第二个参数吗
从上面的分析可以得出病毒的主体程序实际上只做了一些初始化的操作 到目前为止并没有看到它感染或加密任何一个文件 也没有对用户进行勒索
对t.wnry.dll(病毒核心部分)的分析
主体逻辑如下 下面就是病毒的所有操作了 包括加密文件 勒索用户等所有操作
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com