0


WannaCry勒索病毒分析

分析病毒四部曲

在工作中,病毒分析师的任务就是从中毒的机器中提取样本,第一时间手工清理或是修复机器现场,之后再做分析。

分析病毒可以细分为四部曲:

1.提取样本,手工清理机器

2.行为分折,获取病毒行为

  1. 详细分折,找到行为的恶意代码

  2. 提出解决方案,提取特征给公司产品,完成查杀,编写文档报告,有条件编写专杀工具

样本的提取

在虚拟机中,运行样本(需要断网)。待病毒执行之后,开始提取样本。

使用PCHunter观察:

  1. 查看可疑进程

2.查看启动项(注册表、计划任务等)

3.查看驱动、服务等可疑项

  1. 查看其他杂项,网络连接

  1. 使用抓包工具(WSExplorer)查看可疑流量

无异常

6、其他

样本信息:

文件: C:\Users\15PB\Desktop\Wannary\WannaCry.exe

大小: 3723264 bytes

文件版本:6.1.7601.17514 (win7sp1_rtm.101119-1850)

修改时间: 2017年5月13日, 13:55:05

MD5: DB349B97C37D22F5EA1D1841E3C89EB4

SHA1: E889544AFF85FFAF8B0D0DA705105DEE7C97FE26

SHA256:24d004a104d4d54034dbcffc2a4b19a11f39008a575aa614ea04703480b1022c

CRC32: 9FBB1227

文件: C:\ProgramData\znemvazsnwpqy217\Wannacry.exe

大小: 3514368 bytes

文件版本:6.1.7601.17514 (win7sp1_rtm.101119-1850)

修改时间: 2022年7月11日, 13:22:29

MD5: 84C82835A5D21BBCF75A61706D8AB549

SHA1: 5FF465AFAABCBF0150D1A3AB2C2E74F3A4426467

CRC32: 4022FCAA

使用PEid查看样本信息,VC++6.0的程序,并且没有加壳

查看其导入表:

使用ResourceHack查看资源,发现资源中有PE文件,将其提取出来

使用PEid的插件Krypto ANALyzer查看用到那些算法:

再看看刚才从资源中提取出的wannacry2.exe,查看其导入表:

用到了创建进程、获取资源、创建服务、注册表等相关API函数

使用ResourceHack查看资源,用到了PK压缩包,将其提取出来,命名为 : wannacry3.zip

提取出来后,压缩包中的内容是加密的:

**手工清理机器: **

1、结束可疑进程

2、删除可疑进程启动项,删除可疑服务的注册表键值,删除生成的一些文件

3、手工无法清除病毒,需要进一步分析

行为分析

获取样本之后,在虚拟机中,使用监控工具监控样本的运行。待病毒执行差不多之后,查看病毒的行为。(本病毒程序需要断网)

使用火绒剑,将样本拖到火绒剑,对样本进行监控:

  1. 文件操作,主要看文件创建、修改、删除等操作

  1. 注册表操作,主要看注册表设置、创建等操作

  1. 进程操作,主要看创建进程、写入内存等操作

4.网络操作,主要看网络连接地址、IP等信息

  1. 其他行为,以及人肉看样本运行后的反应

查看执行监控

分析样本的行为之后,发现的恶意行为:

1、在C:\Windows目录下创建病毒文件:tasksche.exe,在C:\ProgramData目录下创建文件夹:znemvazsnwpqy217

2、创建@[email protected]文件,将文件感染为.WINCRY文件

3、创建注册表键值、设置注册表键值,HKEY_LOCAL_MACHINE\Software\Microsoft\Tracing\WannaCry_RASAPI32

HKEY_LOCAL_MACHINE\Software\Microsoft\Tracing\WannaCry_RASMANCS

4、设置启动项:C:\ProgramData\znemvazsnwpqy217\tasksche.exe

5、创建进程、跨进程写内存、打开设备、跨进程恢复线程

6、大量的持续性的网络连接行为(445端口)

详细分析

使用IDA对其进行分析,直接F5查看其伪代码

先判断是否能打开指定的URL,如果能访问,就退出程序,如果访问失败,就执行下面的病毒代码。因此,我们在前面运行病毒程序时需要断网。

分析sub_408090:

获取了当前模块名,然后判断了参数。如果参数小于2,说明是双击启动的程序,就执行sub_407F20函数;

里面又有两个函数,先分析sub_407C40:

创建了mssecsvc2.0的服务,显示名是Microsoft Security Center (2.0) Service,为了伪装自己,服务的路径是:C:\xxxx\WannaCry.exe -m security,创建之后,启动了这个服务。

分析sub_407CE0:

获取kernel32.dll的句柄,获取一些API,便于后面使用

找到R型资源,前面已经分析过了,里面是PE文件,加载资源,创建C:\Windows\tasksche.exe文件,然后将资源种的PE文件数据写到这个文件中。然后创建进程,启动这个tasksche.exe程序

如果参数大于等于2,说明是以服务的方式启动的程序,就打开服务管理器,打开服务mssecsvc2.0,然后执行sub_407FA0函数,更改服务的配置信息:

分析sub_408000:

注册一个函数处理服务控制的请求,然后设置了服务管理器的状态信息,分析sub_407BD0:

分析sub_407B90:

先初始化网络环境,如果成功返回0,就执行下面的函数。

分析sub_407620:

该函数是获取了一个密钥容器,然后初始化了临界资源对象。

分析sub_407A20:

申请了两块内存空间,将0x40B020上的内容拷贝到内存空间中,拷贝大小16480字节,将0x40F080上的内存拷贝内存空间中,拷贝大小51364个字节。将这两个地址上对于大小的文件拷贝出来保存exe,对其进行分析,发现40B020上的内容是个dll,导出表中有个PlayGame函数:

将数据拷贝到内存后,又执行了下面的操作:

分析sub_407720:

sub_409160,通过网卡设备,获取IP地址列表

sub_4076B0,连接445端口,如果能连接上,就利用漏洞进行攻击

sub_407480(connect_remote445),连接局域网IP的445端口,看是否能连接成功

如果连接成功,创建线程,执行sub_407540(exp_445),利用漏洞,在局域网内进行攻击

分析sub_407840:

先是获取两次系统运行时间,获取当前线程ID和句柄,然后有一个while循环,里面又有一个do-while循环,有一个随机函数:sub_407660(Random)

作用是随机生成几个数,然后将生成的数组成一个外网的IP地址,然后尝试连接这个IP的445端口,如果连接失败就睡眠,然后继续循环,如果连接成功,就跳出循环。

如果连接外网IP的445端口成功了,就会循环去连接这个IP子网段1-254得445端口,如果连接成功,就利用漏洞执行攻击的行为。

病毒主程序的流程图:

分析tasksche.exe程序:

分析sub_401225:

随机生成一个字符串作为服务名。

分析sub_401B5F(create_server_dir):创建服务的目录

sub_401AF6(create_dir):创建目录,并将目录设置为隐藏

sub_401F5D:创建服务,启动程序

sub_401CEB(create_server):创建服务、启动服务

sub_401EFF(create_mutex):创建互斥体

sub_401064(exec_shell):创建进程,执行cmd命令

分析sub_4010FD(reg_setORget):设置注册表,或者获取注册表中的病毒路径

分析sub_401DAB(unzip_src):释放资源,解压缩的解压密码:WNcry@2o17

分析sub_401E9E(write_cwnry):将比特币钱包的地址写入到c.wnry文件中

第一次传入的是1,就是读取c.wnry文件信息到内存中,第二次传入的是0,就是将DstBuf中的内容(钱包地址)写入到c.wnry文件中

分析sub_401064(exec_shell):创建进程,执行命令,将当前目录设置为隐藏,设置当前目录所有人都可以访问

分析sub_40170A(get_api):获取一些API函数,便于后面使用

分析sub_4012FD:构造函数,初始化

分析sub_401437:导入密钥,申请2段内存空间

sub_401861(g_CryptImportKey):导入密钥

分析sub_4014A6:解密t.wnry文件,返回PE文件(是个.dll文件)

通过OD观察,解密之后的文件是PE文件,大小是0x10000

分析sub_4021BD:加载DLL文件到申请的内存中,加载到0x100000000,记录一些PE信息

sub_4021E9:

有个循环,应该是在获取区段的一些信息

获取了API:GetNativeSystemInfo的地址,申请了内存:

获取了进程的堆句柄,申请了堆空间,将一些信息保存堆空间中,又申请了内存空间,将PE文件的一些信息保存到了申请的内存中,PE文件保存到了v22结构体中

分析sub_402924:遍历dll的导出表,找出TaskStart函数

找到TaskStart函数之后,调用这个函数:

分析sub_40137A:应该是析构函数:

tasksche.exe****程序流程图:

分析tasksche.dll中的TaskStart函数

分析sub_10004690:创建互斥体,防止多开。如果返回1,说明病毒程序存在,就结束,如果返回0,说明病毒程序不存在,继续执行

分析sub_10001000(read_or_write):传入的参数是1,读取c.wnry文件到内存中

分析sub_100012D0(check_system_user):检测是否是系统用户

分析sub_10003410(get_api):获取一些API,便于后面使用

分析sub_10004600(create_mutex):创建互斥体,设置访问控制的属性

分析sub_10004500(check_crypt_file):读取00000000.dky和00000000.pky文件,测试加密是否正确

sub_10003D10(test_crypt):进行加密的测试,如果最后Str1和Str2相等,说明加密解密没有问题

分析sub_10004990:启动勒索弹窗的程序WannaDecryptor,将病毒目录添加到开机启动注册表中

sub_10001000(read_or_write):传入的参数是0,将配置信息写入到c.wrny文件中

sub_10004890(start_decrptysexe):如果不是系统用户、管理员用户,就创建线程,执行taskse.exe提升权限,然后启动@[email protected]程序,弹出勒索对话框;如果是系统用户,就创建进程,启动@[email protected]程序

sub_100047F0(create_reg_run):隐藏执行cmd命令,创建开机启动项,在注册表run下添加tasksche.exe

分析sub_10003AC0(createkey_file):创建00000000.pky文件(保存公钥)和00000000.eky文件(保存加密私钥)

g_CryptExportKey:创建pky文件,导出rsa公钥写入到创建的00000000.pky文件中

create_key:创建00000000.eky文件,将加密的密钥写入其中

encrypt_rsa:导出加密的私钥

分析sub_100046D0(open_res):打开00000000.res文件,第一次打开时文件不存在,所有会失败

分析sub_10004420(getrandom):随机生成8个字节,写入到res_file_buff中

分析sub_10004790(create_res_file):创建00000000.res文件,将全局变量res_file_buff中的内容写入到res中

sub_10004730(write_res_file):创建res文件,将res_file_buff中的内容写入到res中

分析sub_100045C0(check_dky_file):检测当前目录下是否有dky文件,测试加密函数

sub_10004500(check_crypt_file):

分析sub_10005730(encryptfile):如果设备有新磁盘加入,就遍历目录,加密其中的文件

sub_10005680:

sub_10001830(move_to_temp):移动部分文件到临时文件,由f.wnry文件保存这些文件名

StartAddress--sub_100029F0:创建线程,移动目录到临时文件

分析sub_10005540(encrypt):加密文件

sub_10005060(get_temp):获取临时目录,或创建一个隐藏的回收站目录

sub_10001910(get_path):创建C:\Windows\temp\3.WNCRYT

sub_100027F0(encrypt_dir):递归遍历文件,加密文件

sub_10002300(enum_dir):遍历文件,加密函数。如果遍历到的是目录,就将特目录过滤掉,将目录加入容器中,如果遍历到的是文件,就过滤掉3个病毒创建的文件,然后获取文件的类型,过滤掉.exe、.dll、.WNCRY文件,然后将文件保存到容器中

sub_10002F70(test_iscreatefile):检测这个目录是否可以创建文件,如果可以创建,就删除文件

sub_100032C0:过滤掉一些特殊的目录

sub_10002D60(check_file_type):获取文件的类型

如果是.exe和.dll文件,返回1,如果是.WNCRY文件,返回6,如果是要加密的文件类型,返回2:

如果是.WNCRYT,返回4,如果是byte文档,返回3。

sub_10002940(encrypt_file):加密文件

sub_10002200(encrypt_fun):加密文件

sub_10001960(encrypt_data):创建新文件,将加密的数据放到这个文件中

先进行判断,如果条件都满足,说明文件已经被感染了,就退出;如果不满足,就创建文件,用于保存加密的数据。

在加密文件中,先写入一些原始文件的信息

将加密后的数据写入到刚才创建的文件中

分析sub_10005190:填充磁盘。获取磁盘类型,如果是硬盘,就创建hibsys.WNCRYT文件,然后不停地将内存中地数据写到hibsys.WNCRYT文件中

sub_10005120(del_hibsys_file):删除hibsys.WNCRYT文件

分析sub_10001760(releaseresource):释放资源

分析sub_10005300(starttaskdl):创建线程,启动taskdl.exe程序

分析sub_10004990:分析过了,启动勒索弹框程序,将病毒目录加到开机启动项注册表中

分析sub_100057C0(batoperator):创建bat脚本,执行代码

分析sub_10004CD0(runbat):运行批处理文件,u.wnry变为解密文件@[email protected]

sub_10001140:启动bat脚本并删除脚本

分析sub_10004DF0(create_rwnry):创建勒索文档,从r.wnry中读取数据到内存,然后写入到@[email protected]

分析sub_10005480(encrypt_file_):加密文件

sub_100053F0:加密文档

sub_10004F20:将b.wnry 拷贝到 @[email protected] 中,设置桌面背景

执行cmd命令,启动程序,填充磁盘,最后释放资源。

TaskStart****函数的流程图:

5****个线程回调函数:

病毒发作操作:

加密算法

1、内置RSA公钥是病毒制作者硬编码到病毒中的,随病毒进行传播;

2、病毒执行后,随机生成一对RSA公钥、私钥,公钥保存在00000000.pky文件中,

私钥会被内置RSA公钥进行RSA-2048加密,保存在00000000.eky中。

3、病毒会随机生成不同的AES密钥,AES-128-CBC模式加密每个文件(每个文件的AES密钥不同)

4、加密文件的AES密钥会被随机生成的RSA公钥进行RSA-2048加密,加密后的密钥和加密后的文件会构成加密后的文件.WNCRY

解决方案(或总结)

1、提取病毒的特征,利用杀毒软件查杀

    病毒特征:WANACRY!、WNcry@2o17

2、手工查杀

    1、删除病毒进程

    2、删除病毒启动项

    3、加密文档无法解密

3、修复方法

    1、系统升级、及时打补丁。

    2、被加密的文件,不重要的话,就重装系统,重要的话只能交赎金解密。

    3、关闭445端口。

    4、创建一个互斥体,防止病毒运行。

本文转载自: https://blog.csdn.net/ZK_1874/article/details/127578455
版权归原作者 K_BLACKHOLE 所有, 如有侵权,请联系我们删除。

“WannaCry勒索病毒分析”的评论:

还没有评论