首页
社区
课程
招聘
[原创]Wannacry勒索病毒分析
发表于: 2019-6-17 18:17 7667

[原创]Wannacry勒索病毒分析

2019-6-17 18:17
7667

在找活了,之前有幸听过奇安信的招聘会,大佬说,Wannacry病毒现在还在某些地方流行着,是经典的勒索病毒。这让我觉得分析这个病毒是刷经验的好机会,所以就在决定分析一下这个在2017年的纵横江湖无敌手的勒索之王,由于是新手入坑,不对之处还请多多指教(●ˇ∀ˇ●)

病毒简介: 该病毒亦称 “永恒之蓝”,它利用Windows系统的SMB漏洞可以获取系统最高权限。骇客通过改造“永恒之蓝”制作了wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件。

而该病毒分为蠕虫传播部分和勒索病毒部分,在这我只分析了勒索病毒Wannacry部分,由于是自己分析学习,所以我就尽量解释详细一点。下面开始分析样本。

首先获取到病毒样本然后解压

使用Hash工具查看基本信息

加密了常用的大多数格式(约100多种)的文件,加密成后缀是.WNCRY文件,不花钱基本无法解密。

结论是c/c++语言编译器是C++6.0写的程序,无壳。

详细分析主要用到OD的动态分析和IDA的静态分析,只有动静结合才能更好更快更轻松的分析病毒。

找到WinMain函数后分析出了最后的一览图如下:

从上图中可知有几个比较关键的函数下面将一一分析他们。
1. ModifyRegedit函数修改了注册表

注册了一个名称为wd数据是当前目录的项

2. FreeRsrcFile释放资源函数

知道了有释放资源的相关操作,首先用ResHacker资源编辑工具查看wcry.exe的资源,发现一个资源类型为XIA,名称为2058的资源数据,可以看到16进制是 50 4B开头说明这个一个ZIP压缩包。

而该函数中FindResourceA,LoadResource,LockResource,SizeofResource这几个函数组合就是明显的要利用资源了,接下来的代码就是解压ZIP包释放出里面每个数据到当前目录。

3. AddWrite_cwnry函数写入比特币账户信息

此函数首先会从3个比特币账户中伪随机抽取出一个(不同的电脑抽取到的账户不同),然后把改账户写入到c.wnry文件中,我的电脑写入的是"13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94",从而得出结论c.wnry文件存储的是比特币账户信息,可能被用于解密器读取。

运行病毒后可查看到解密器右下角有该账户信息

4. HideAndCreate函数是以命令行和不显示GUI窗口的方式启动程序

5. GetSomeAPI函数
该函数就是获取一些加密解密和文件操作的API地址

6. InitCriticalSec函数
该函数用于初始化临界区,用于线程同步。此病毒之后会分析到有5个线程,对于多线程的程序,临界区的使用很有必要。它能做到多个线程对同一段代码的访问时,我正用着这个资源呢,不希望别的线程使用它。

7. KeyAndMem函数
主要是分配了2块全局堆内存

8. DecryptPeData解密函数

首先此函数会读取t.wnry文件进行一系列简单的操作之后,把t.wnry文件里的内容进行解密,然后得到一个大小为0x10000字节数据,可以观察内存有0x5A4D 和0x4550所以确定这是一个PE文件。

提取该PE文件,直接复制该0x10000字节的二进制内存数据,然后在010Editor中Crtl+Shift+V粘贴后保存为EXE文件,再用PEID查看,实际上他是个DLL动态库文件。

把它保存为t.wnry.dll文件,那么就知道了t.wnry文件保存的是t.wnry.dll加密后的数据,从之后的分析中会知道这个模块才是wannacry病毒的核心模块,关键的功能都在这个模块中实现的。

9. PeToMem加载DLL函数
这个函数比较复杂,总结起来也很简单,就是申请了一块虚拟内存存放t.wnry.dll的内容,把改虚拟内存中NT头和DOS头的地址存放进堆空间中。

从下图可以看出堆内存中第一个地址中是NT地址,第二个地址保存的是DOS头地址。

10. GetFunAddr函数
它遍历t.wnry.dll的导出表,最终找到并返回了TaskStart函数的地址


11. 调用TaskStart函数
这个函数才是真正的核心函数,病毒功能都在这里面实现。
12. FreeData函数收尾释放数据

6. 然后调用了几个不怎么重要的函数,接下来就是创建5个线程

7. 第一个线程回调函数CreateResFile1
此函数就是创建00000000.res文件写入时间信息

8. 第二个线程回调函数CheckDkyFile
每隔5秒检测00000000.dky文件对其处理。

9. 第三个线程回调函数CheckNewDisk
它的功能就是每3秒检测是否有新的磁盘,有就对其文件加密,我的虚拟机没有新磁盘,所以就略过。

10. 第四个线程回调函数RunTaskdl1
每隔30秒运行一次taskdl.exe程序。

11. 第五个线程回调函数RunExeAndSetReg
每隔30秒就运行taskse.exe和@WanaDecryptor@.exe这两个程序和设置注册表启动项。

接下来回到第一层,继续分析第一层后半段的代码。
通过以上对加密函数层层分析,已经知道了加密形式是怎么进行的了,只是上面的加密只针对桌面文件进行加密,实际上从加密函数第三层开始传入的参数不同,加密的路径自然也会改变。

(1.1) 紧接加密后的下一个函数是InterlockedExchange原子操作,交换两个数。这也是由于多线程的原因,用于线程同步,让线程之间互补干扰。
(1.2) 接下来加密全盘文件,获取出所有磁盘类型,对固定的磁盘文件进行加密,然后再对其他用户同样进行此操作。主要加密函数是EncryptDiskAll。

(1.3) 最后一段代码

taskdl.exe程序是在TaskStart函数的第4个线程中被运行的。现在分析它,当然前面的步骤都一样,查壳,看是什么程序等等。
找到WinMain函数可以看到,这个程序就是用来删除后缀为.WNCRT的文件的。

进入DeleteFile11函数中发现,这就是获取上面才分析过的临时路径,他删除里面的.WNCRYT文件实际就是删除hibsys.WNCRYT这个文件。
所以得出结论taskdl.exe的功能就是删除hibsys.WNCRYT文件。

TaskStart的第5个线程运行了此程序,分析这个程序的时候我们要注意用OD打开它后需要添加点击"调试" ->"参数"附加参数"taskse.exe C:\Users\15pb-win7\Desktop\wcry\wcry2.0\@WanaDecryptor@.exe"才能正常运行。

最开始判断参数是否符合,然后进入提权函数

最后还有一个解密器@WanaDecryptor@.exe,我就不分析了,直接运行它,就可知道它的功能,生成一张图片,把它设置为桌面背景,然后每个几秒弹出一个勒索窗口让用户交钱。

最后病毒样本(解压密码15pb)、wcry.exe的UDD,和一些IDB分析文件打包上传!

 
 
 
 
 
 
 
  • 分析平台:win7虚拟机
  • 分析工具:OD、IDA
  • 辅助工具:LordPE、PEID、010Editor、火绒剑、ResHacker、Hash等
  • 第一次传入的命令行参数是"attrib +h .",该参数意为隐藏属性,运行过后发现病毒所在的当前目录不见了,在文件夹选项中点击显示隐藏文件后,可看见该目录被隐藏了!
  • 第二次运行它命令行参数是"icacls . /grant Everyone:F /T /C /Q",意为创建一个名为Everyone的账户,授予/T /C /Q的访问权限。
  • t.wnry.dll模块中TaskStart函数才是真正的加密函数,亦可称之为加密器,wannacry的核心功能都在这里面实现,这个函数就是水磨工夫,分析过程中很有很多函数没用过,就查MSDN和百度, 比较耗时,但是静下心来还是能勉强理解它的,坚持就是胜利。
  • TaskStart函数在t.wnry.dll模块中,分析时打开它g到0x10005AE0 地址反编译为伪C代码后一览图


    接下来逐一分析:
    1. SingleRun单一运行函数
    可以看到它创建了名为MsWinZonesCacheCounterMutexA的互斥体,用于防多开,确保单一实例运行,套路!

    2. 之后进行了一些操作,读取c.wnry文件,对比密钥不等,获取一些API地址这些比较简单的操作。
    3. NoDoubleOpen函数
    这个函数,检测一个互斥体,第一次没有所以它再次创建了一个名称是"Global\MsWinZonesCacheCounterMutexA0"的互斥体。

    4. CheckFileExist函数
    它检测一个00000000.dky的文件,由于第一次没有,不理睬,继续跟踪。

    5. CreatePubPriFile函数
    这个函数总结后就是在当前目录创建00000000.pky文件保存公钥,创建00000000.eky保存加密后的私钥。在OD中分析工程中能看到RAS和AES等字符串,说明此病毒采用的是RAS和AES双重加密。
  • WritePubKeyToFile写入公钥文件函数
  • WritePriKeyToFile写入私钥文件函数
  • CreateResFile函数填充了8个字节随机数和4字节时间信息的内容,在之后这个.res还会保存更多的时间信息,所以得出结论.res文件是用来保存时间信息的。

  • RunTwoExe函数功能是运行taskse.exe和@WanaDecryptor@.exe程序
  • SetRegeditRun函数
    把"C:\Users\15pb-win7\Desktop\wcry\wcry2.0\tasksche.exe"设置为自启动项

    12. 加密关键函数
    (1.0) EnOne_100057C0加密函数第一层
    这个函数很长,很多,函数嵌套复杂,所以先分析第一层的前半段,前面一些函数条件不满足的就不管它了,从CopyUwnryFile开始分析
  • CopyUwnryFile函数
    此函数首先检测@WanaDecryptor@.exe文件是否存在,没有就拷贝u.wnry的内容创建为新未见@WanaDecryptor@.exe。并且在之后创建了一个@WanaDecryptor@.exe.lnk文件也就是@WanaDecryptor@.exe文件的快捷方式。
    可以双击@WanaDecryptor@.exe程序发现这个就是解密器程序,它会显示出勒索窗口和勒索桌面背景。
    可以得出结论u.wnry文件保存就是解密器内容的数据。
  • CreateReadingFile函数
    这个函数拷贝r.wnry里的内容生成一个阅读文件@Please_Read_Me@.txt。

    打开@Please_Read_Me@.txt一大堆英文,提醒用户:你该交钱解密了...

    (2) EnTwo_10005480加密函数第二层
    这个函数获取了桌面路径和文档路径,并对其下的文件进行加密,然后再查找其他所有用户,对其他用户的文件进行加密。

    (3) EnThree_100027F0加密函数第三层
    这个函数就是过渡的作用,主要还是看第四层里的内容。

    (4) EnThree_100027F0加密函数第四层
    首先获取桌面路径

    然后遍历文件,挑选出需要加密的文件保存其信息到一个数据结构中
  • 其中SelectEncryptFile函数辨别出哪些是需要加密的文件,从下面的图中可知这个病毒丧心病狂,居然要加密100多种格式的文件,基本包含了我们常用的所有文件。


    回到第四层继续,之后就进入了一个循环中,每次在数据结构中取出一个信息,调用第五层加密函数加密对应的文件。然后判断目录层级是否小于等于6是就拷贝@Please_Read_Me@.txt文件和@WanaDecryptor@.exe到当前目录。


    (5) EnFive_10002940加密函数第五层
    第五层比较简单,首先判断文件是那种类型(病毒作者自定义的类型),然后根据类型的不同决定是否加密。

    (6) EnSix_10002200加密函数第六层
    第六层也比较简单,首先获取原文件全路径,对比该文件是否是.WNCRY格式,不是就在其文件名后追加.WNCRY,然后经过第7层加密的问价就以其命名!

    (7) EnSeven_10001960加密函数第七层
    首先读取原文件前8个字节比较是否是"WANACRY!",之后文件类型是4的情况下,会在新的文件名后面加上字符"T"如:"C:\Users\15pb-win7\Desktop\1234.docx.WNCRYT",再创建该文件,也就是加密后的文件,此时只是没有填充内容而已。

    然后在该文件中依次写入8字节字符"WANACRY!"、某个大小数值0x100、再写入0x100大小的数据、文件的类型值和原文件的大小。

    然后再读取原文件内容经过第八层加密后,输出加密后的内容,再把该内容追加写入到刚才创建的文件中,设置文件日期和时间信息,加密文件就到此完成了,最后做了一个移动文件的操作,实际作用就是个文件后缀.WNCRYT改为.WNCRY。

    (8) EnAight_10006940加密函数第八层
    第八层就是通过解析原文件,每次输入16个字节通过第9层加密后输出16个字节,依次循环直到加密完成为止,然后输入加密后的缓冲区。

    (9) 加密函数结语:加密函数从第八层之后就完全是数据加密相关的代码,没有其他重要的操作了,层数太多,关于加密函数的分析我也就到此为止了。
  • EncryptDiskAll函数
    此函数会得到磁盘的盘符如"C:\",在最后它会调用加密函数的第3层,加密全盘的数据,如有其它盘也一样。
    在这之前会得到一个临时路径,只有c盘时是:"C:\Users\15PB - W~1\AppData\Local\Temp\",之后我添加了一个E盘,得到的是:"E:\$RECYCLE"
  • 先开始以不显示GUI窗口的方式启动了解密器@WanaDecryptor@.exe程序,此时可看到桌面背景被更改了
  • 再向00000000.res文件写入当前时间信息
  • 运行cmd
  • 不断的向磁盘写入数据
  • WriteMassData写入删除数据函数分析
    首先该函数在之前得到的临时目录以隐藏方式创建了hibsys.WNCRYT文件

    然后获取磁盘是否还有多余空间,有责每次写入0xA00000个字节的0x55,循环写入0x14次,检测磁盘有无多余空间。。

    我花了10多分钟检测了一下写满磁盘会发生什么,如下图,我的磁盘总60G被写满了之后单步跟踪OD会发现它又把这整个文件删除了,回复了原来空闲空间,我只想说一句"卧槽",我猜测病毒作者的意图是不断的占用磁盘的性能,让用户欲罢不能。

    到此TaskStart函数就分析完毕,在整个分析过程中由于是多线程程序,有些函数的分支我分析的时候不满足条件,我就没有分析下去,所以,肯定有些关键点我没分析到,比如创建了加密文件后,会删除原文件,我就没分析到删除原文件是哪里进行的,这不得不说是个小遗憾,由于是新手分析了10来天,我有点小崩溃不想继续分析了,我也算对得起WannaCry了,哈哈,接下来分析最后两个程序taskdl.exe和taskse.exe。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 4
支持
分享
最新回复 (12)
雪    币: 751
活跃值: (1409)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
2
加油加油
2019-6-17 18:39
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是C++6.0写的程序,黑客这么穷啊,vs2013都用不起么
2019-6-17 19:17
0
雪    币: 5492
活跃值: (1740)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
4
需要兼容性强啊,那些大机关,部门,公司用的都是WIN7,甚至XP系统啊
2019-6-17 19:58
1
雪    币: 1795
活跃值: (63)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
之前分析过,不过没写分析文章,给作者点赞。。
先不看内容,过几天我也搞一篇,然后对比楼主大大,看自己哪些分析有遗漏
最后于 2019-6-17 20:30 被myangel编辑 ,原因:
2019-6-17 20:29
0
雪    币: 14539
活跃值: (17553)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
6
mark,楼主辛苦了
2019-6-17 21:00
0
雪    币: 40
活跃值: (680)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
总结就一句话.自己生成个rsa的公钥A和私钥B,私钥B自己保存 公钥A当成病毒的初始密钥,再在程序里生成一个公钥C和私钥D.公钥C用来加密电脑上的文件.私钥D被公钥A加密保存在电脑上  由于没有私钥D 所以电脑上面所有文件无法进行恢复。
2019-6-18 09:22
0
雪    币: 40
活跃值: (680)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
至于感染的方法大家都知道 就是永恒之蓝漏洞    
2019-6-18 09:24
0
雪    币: 1725
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark
2019-6-18 19:37
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark
2019-6-18 23:49
0
雪    币: 258
活跃值: (124)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
406
11
厉害 
2019-6-22 19:57
0
雪    币: 36
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
可能帮我分析一个软件??。
2019-7-24 21:41
0
雪    币: 2989
活跃值: (4911)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
膜拜
2020-11-1 19:01
0
游客
登录 | 注册 方可回帖
返回
//