恶意样本分析-wannacry

wannacry进行了大范围的感染,这何尝不算是一种名著呢

病毒样本来自开源恶意代码样本库:theZoo

测试环境:windows7 x64虚拟机

获取恶意行为

(首先需要注意的是,这个样本是勒索病毒传播后释放的用于加密的本体,在该样本上并没有获取到试图传播的行为)

首先运行该恶意程序,是熟悉的界面

![wcry-1](../../_ resource/wcry-1.png)

程序创建了一些新的文件,同时对文件进行加密操作,结果是exe文件无法执行,文本文件的内容也被经过加密,查看其它文件可知,恶意程序对所有加密的文件都添加了WANACRY!的头。

![wcry-2](../../_ resource/wcry-2.png)

使用微步云沙箱检测一下,可以列出其及进行的明显的恶意行为。

![wcry-3](../../_ resource/wcry-3.png)

根据微步沙箱的检测结果,程序似乎进行了一些兼容性的调整,在不同的系统中表现得行为不尽相同,但是都成功的达成了加密文件的目的。同时还检测出了对于硬盘和内存大小的查询操作,猜测是检测程序是否运行在虚拟环境当中。

试图手动清理病毒

首先尝试清理病毒生成的文件,大部分生成的文件可以直接删除。查看注册表,并没有发现相关的自启动信息。使用任务管理器杀死恶意程序的进程并尝试重启。

……

出乎意料的,程序没有再出现,任务管理器删除时也没有任何阻力,感觉此病毒的危害在于大规模的传播和对于数据的加密,在持续性威胁上没有下太大的功夫。

分析恶意代码

病毒主体分析

将虚拟机恢复到上一个快照,重新运行病毒,尝试分析相应的主进程和其他生成的文件。

首先看一下运行的病毒本体

![wcry-4](../../_ resource/wcry-4.png)

查看资源,可以发现存在压缩包,但是压缩包有密码无法解压。IDA打开程序进行分析

可以分析出该程序的流程:

![wcry-6](../../_ resource/wcry-6.png)

获取计算机的名称并以此生成随机ID

![wcry-7](../../_ resource/wcry-7.png)

以上判断是否有/i参数

![wcry-8](../../_ resource/wcry-8.png)

以上代码生成临时目录,接着程序会将自身复制到临时目录当中并启动自己。

![wcry-9](../../_ resource/wcry-9.png)

以上代码中程序会将自己写入注册表

![wcry-10](../../_ resource/wcry-10.png)

以上代码中程序释放存储的资源并解密(即对压缩包解密),此处可以获取压缩包密码WNcry@2ol7。得到了压缩包的密码,解压成功,压缩包内是恶意程序运行之后释放的文件,涵盖一些经过加密的可执行文件和语言选项。

![wcry-11](../../_ resource/wcry-11.png)

以上代码中,成宿会随机选取比特币账号并存入c.wnry文件

![WCRY-5](../../_ resource/wcry-5.png)

这段代码当中,attrib +h用于给指定文件添加隐藏属性

icacls . /grant Everyone:F /T /C /Q该命令将对前目录及其所有子目录和文件的完全控制权限授予 “Everyone” 这个用户组。

在运行命令行指令之后程序会对从压缩包解密的t.wnry进行解密操作,后面的对文件加密操作就交给t.wnry完成。在尝试dump出完整的t.wnry文件之前,我们尝试分析一下对于这个文件的解密函数。使用findcrypt插件可以迅速定位到加密的常数所在。

![wcry-12](../../_ resource/wcry-12.png)

通过对于最外层的获取信息的函数的分析,密钥信息似乎存储在t.wnry文件当中。

![wcry-13](../../_ resource/wcry-13.png)

用于解密key的函数如下

![wcry-14](../../_ resource/wcry-14.png)

查询微软文档可知该函数是一个RSA加密,由于RSA加密文件会耗费更多时间,病毒的开发者选择使用RSA加密AES的key。

释放的t.wnry分析

重置虚拟机环境,使用调试器。用PEtools可以将t.wnrydump出来。(需要获取文件在内存当中的地址和文件大小)

如下所指,动态调试至红色箭头所指部分时,1处是解密前t.wnry所在的位置,2处所指的内容为程序的大小。

![wcry-15](../../_ resource/wcry-15.png)

![wcry-16](../../_ resource/wcry-16.png)

![wcry-17](../../_ resource/wcry-17.png)

步过之后可以在栈中找到解密之后的文件存储的地址。

![wcry-18](../../_ resource/wcry-18.png)

1处指向的位置是t.wnry解密之后所在的地址,2处是t.wnry解密之后在内存中的状态,可以看出此时已经正确的显示了PE文件头。

![wcry-19](../../_ resource/wcry-19.png)

直接保存即可,可以得到正确的t.wnry.dump,此时大部分的需要动态分析的部分已经结束了。使用IDA打开,首先从taskstart开始分析。

![wcry-20](../../_ resource/wcry-20.png)

此处提到的00000000.res是恶意样本运行之后释放的文件

![wcry-21](../../_ resource/wcry-21.png)

![wcry_22](../../_ resource/wcry_22.png)

这里的函数使用.dky文件和.pky文件尝试加密流程能否正常运转。

![wcry_23](../../_ resource/wcry-23.png)

这个函数启动@WanaDecryptor@.exe,将病毒写入注册表

回到taskstart

![wcry-24](../../_ resource/wcry-24.png)

恶意样本行为总结和预防方式

经过搜索,该恶意样本没有传播的过程,应是从可传播的样本中dump出的用于执行加密行为的本体。试图通过逆向恶意代码来解密被加密过的文件并不划算,病毒的作者还是进行了一番精心设计的。

病毒的加密流程很长,需要消耗很多时间,在此期间如果尽快停止病毒的运行并进行清理还是可以挽回大多数文件的。