wannacry勒索病毒简单分析

样本概况

样本信息

MD5:DB349B97C37D22F5EA1D1841E3C89EB4
SHA1:E889544AFF85FFAF8B0D0DA705105DEE7C97FE26
CRC32:9FBB1227
文件大小:3723264 bytes
文件名称:11.exe

环境及工具

环境:win7 32位 专业版
工具:IDA pro、OD、010Editor、LordPE

分析目标

分析勒索病毒感染文件的逻辑

简单行为分析

导入表分析

使用LordPE查看导入表
导入函数包括资源操作相关API,GetProcAddress动态加载函数,微软加密库中的API以及服务操作相关的API。
猜测样本将释放文件,使用微软加密库函数对文件进行加密以及创建服务等操作,动态加载dll获取API。

字符串分析

文件中含有大量API字符串,并且包含文件名称taskche.exe,包含一条网址,猜测有网络连接行为。

查看资源

资源中存在一个PE文件。猜测会释放并执行。
在这里插入图片描述

火绒剑行为监控

查看主要行为为释放PE文件taskche.exe并备份,然后执行,仅此操作。

病毒详细分析

11.exe

在这里插入图片描述
首先尝试连接URL,连接成功则直接返回,否则执行sub_408090。
在这里插入图片描述
根据启动参数个数进行行为判断,如果带有参数,会利用漏洞进行网络传播,即调用serviceCtrl函数。
如果没有参数,则会调用sub_407F20。
在这里插入图片描述
主要做了两件事,一个是创建启动服务,另一个就是释放PE文件并且执行该PE文件。
在这里插入图片描述
在这里插入图片描述
可以看出,这里释放了资源中额PE文件,名称为taskche.exe,并且带参数"/i"执行该文件。

总结11.exe的主要行为

  1. 尝试连接URL,成功返回。猜测是防止解密完用户再次感染。
  2. 如果程序带参数运行,则创建服务,并且通过漏洞传播。
  3. 如果无参运行则会释放PE文件taskche.exe并带参执行。

taskche.exe

将释放11.exe的资源dump出来接着进行分析:
总体流程如下图:
在这里插入图片描述
详细流程如下:

  1. 判断启动参数是否为”/i”
  2. 查找C盘下是否存在programData/Intel文件夹,存在一个则在文件夹下创建根据计算机名HASH出来的随机文件夹
    在这里插入图片描述
  3. 将taskche.exe拷贝到随机文件夹下
    在这里插入图片描述
  4. 创建服务,再次启动taskche.exe。启动参数为零,则顺序往下执行。
    创建服务:
    在这里插入图片描述
  5. 创建一个注册表项
    在这里插入图片描述
  6. 释放资源操作,这里是个压缩包
    在这里插入图片描述
    可以看出,资源内包含了许多的文件,这里将释放到当前文件夹中
    在这里插入图片描述
  7. 随机一个比特币账户写入到c.wnry中
    在这里插入图片描述
  8. 执行两条cmd命令,用于隐藏当前文件夹,并且设置当前文件夹权限为所有人完全访问权限
    在这里插入图片描述
  9. 导入相关API,用于后面的文件操作和加解密操作
    在这里插入图片描述
  10. 构造函数构造数据结构,并且调用sub_401437函数导入秘钥
    通过CryptImportKey从40EBF8处BLOB导入秘钥
    在这里插入图片描述
  11. 解密t.wnry文件,解密方式为RSA+AES方式解密文件
    在这里插入图片描述
    在这里插入图片描述
  12. 手动加载dll,查找导出表获取taskStart函数
    在这里插入图片描述
    在这里插入图片描述
    因为这里t.wnry解密后的文件没有落地,所以通过LordPE dump内存获取文件进行分析。
    在这里插入图片描述

总结taskche.exe的主要行为

  1. 备份taskche.exe文件到新创建的随机目录中
  2. 释放资源中的压缩包中的大量文件
  3. 随机选取一个比特币账户写入到c.wnry文件中
  4. 使用RSA+AES的方式解密t.wnry为恶意dll,手动映射PE文件,查找导出表中的taskStart函数,手动调用,参数为(0,0)。

dump.dll

整体流程:
在这里插入图片描述
详细流程分析:

  1. 开始是一些初始化操作,包括互斥体检测多开,读取c.wnry获取比特币账户,检查当前用户权限,构造密码和资源文件名res,pkey,ekey。并对密码文件进行检测,防止重复感染。
    权限比较如下:
    在这里插入图片描述
  2. 构造数据结构,调用importKeyFromMem尝试通过秘钥文件导入秘钥,不存在则创建秘钥文件。
    在这里插入图片描述
  3. 尝试读取资源文件,不存在则创建
    在这里插入图片描述
    Sub_10004420:
    在这里插入图片描述
  4. 开辟5个线程
    在这里插入图片描述
    1. 线程1:用于更新res文件中的时间标志。
      在这里插入图片描述
    2. 线程2:用于检测dkey文件,推测是用来给支付比特币后的用户解密。
      在这里插入图片描述
    3. 线程3:用于检测磁盘变化,当磁盘更新后进行遍历感染
      在这里插入图片描述
      Sub_10005680:
      在这里插入图片描述
    4. 线程4:用来启动taskdl.exe
      在这里插入图片描述
    5. 线程5:用于更新c.wnry时间标志,启动taskse.exe和@WanaDecryptor@.exe,设置注册表自启动。
      在这里插入图片描述
      setAutoRUN:
      在这里插入图片描述
  5. Sub_100057c0用于创建@WanaDecryptor@.exe,readMe.txt,结束相关进程,遍历磁盘进行文件加密,写满磁盘等操作。主要是针对线程的初始化操作。
    在这里插入图片描述
    如上,创建勒索客户端、遍历加密文件,结束进程占用。
    在这里插入图片描述
    枚举所有磁盘,进行遍历加密操作。
    针对关键加密函数sub_10005540:
    在这里插入图片描述
    首先检测磁盘是否有剩余空间,然后检测磁盘类型,后面就调用encryptFile进行遍历加密。
    encryptFile:
    在这里插入图片描述
    针对fileHandle,主要是进行文件遍历,符合条件放入链表,再统一加密处理:
    在这里插入图片描述
    对于文件夹的遍历,过滤条件folderFilter如下:
    在这里插入图片描述
    将符合条件的文件夹保存在链表中。
    如果遍历到文件,同样的操作,文件类型过滤,放入链表。
    在这里插入图片描述
    getFileType规则如下:
Type 0:无后缀名的文件
Type 1:exe和dll
Type 2:
".doc" ".docx" ".xls" ".xlsx" ".ppt" ".pptx" ".pst" ".ost" 
".msg" ".eml" ".vsd" ".vsdx" ".txt" ".csv" ".rtf" ".123" 
".wks" ".wk1" ".pdf" ".dwg" ".onetoc2" ".snt" ".jpeg" ".jpg"
Type 3:
 ".docb"  ".docm"  ".dot"  ".dotm"  ".dotx"  ".xlsm"  ".xlsb"  ".xlw"  ".xlt"  ".xlm"  ".xlc" 
 ".xltx"  ".xltm"  ".pptm"  ".pot"  ".pps"  ".ppsm"  ".ppsx"  ".ppam"  ".potx"  ".potm"  ".edb" 
 ".hwp"  ".602"  ".sxi"  ".sti"  ".sldx"  ".sldm"  ".sldm"  ".vdi"  ".vmdk"  ".vmx"  ".gpg"  ".aes" 
 ".ARC"  ".PAQ"  ".bz2"  ".tbk"  ".bak"  ".tar"  ".tgz"  ".gz"  ".7z"  ".rar"  ".zip"  ".backup" 
 ".iso"  ".vcd"  ".bmp"  ".png"  ".gif"  ".raw"  ".cgm"  ".tif"  ".tiff"  ".nef"  ".psd"  ".ai" 
 ".svg"  ".djvu"  ".m4u"  ".m3u"  ".mid"  ".wma"  ".flv"  ".3g2"  ".mkv"  ".3gp"  ".mp4"  ".mov" 
 ".avi"  ".asf"  ".mpeg"  ".vob"  ".mpg"  ".wmv"  ".fla"  ".swf"  ".wav"  ".mp3"  ".sh"  ".class" 
 ".jar"  ".java"  ".rb"  ".asp"  ".php"  ".jsp"  ".brd"  ".sch"  ".dch"  ".dip"  ".pl"  ".vb"  ".vbs" 
 ".ps1"  ".bat"  ".cmd"  ".js"  ".asm"  ".h"  ".pas"  ".cpp"  ".c"  ".cs"  ".suo"  ".sln"  ".ldf" 
 ".mdf"  ".ibd"  ".myi"  ".myd"  ".frm"  ".odb"  ".dbf"  ".db"  ".mdb"  ".accdb"  ".sql"  ".sqlitedb" 
 ".sqlite3"  ".asc"  ".lay6"  ".lay"  ".mml"  ".sxm"  ".otg"  ".odg"  ".uop"  ".std"  ".sxd"  ".otp" 
 ".odp"  ".wb2"  ".slk"  ".dif"  ".stc"  ".sxc"  ".ots"  ".ods"  ".3dm"  ".max"  ".3ds"  ".uot"  ".stw" 
 ".sxw"  ".ott"  ".odt"  ".pem"  ".p12"  ".csr"  ".crt"  ".key"  ".pfx"  ".der"
Type 4:.WNCRYT
Type 5:.WNCYR
Type 6:.WNCRY

接着对于链表中的文件进行加密操作
在这里插入图片描述
对于sub_10002940:
在这里插入图片描述
针对sub_10002200,主要用于加密之前构造不同的文件后缀,作为加密后的文件:
在这里插入图片描述
针对cryptFile,开始真正的文件加密操作:
对于cryptFile主要分为两种加密方式,方式3和方式4。
方式4:
该中文件是指大于1K小于200M的文件,这种文件仅仅加密一次。
流程如下:
1.打开文件
2.获取文件大小
3.获取文件时间。
4.判断文件是否已经被加密(这里主要为了加密方式3会加密两次)
在这里插入图片描述
5.创建一个新的文件.wncryt
在这里插入图片描述
6.选择加密秘钥
在这里插入图片描述
7.写入加密文件头
在这里插入图片描述
8.对文件进行循环读取加密
在这里插入图片描述
9.修改文件名称
在这里插入图片描述
至此,小于200M大于1KB的文件加密流程就完成了
对于大于200M的文件,会进行两次加密:
第一次在第5步时,会先对文件进行预处理,将文件头部的0x10000字节的数据追加到文件的最后,然后将头部的0x10000字节清零,随后写入加密标记
在这里插入图片描述
后面不会对文件进行加密操作而直接返回,将文件类型修改为5,文件后缀修改为.WNCYR
在这里插入图片描述
将该修改后的文件加入第二次处理的链表,按照加密类型4进行加密处理。
至此,对于文件加密的详细流程已经分析完毕,由于代码非常多,比较复杂,简单总结一下加密流程:

  1. 遍历时对不同文件进行分类
  2. 通过sub_10002E70再次对文件进行大的分类,选择不同的加密方式。主要是通过文件大小进行,按照200M为分界线将文件分为两大类。分两次进行加密操作。
  3. 大于200M的文件会先进行一次预处理,将头部0x10000字节预留出来,用于写入相关标记,然后再按照方式4加密。小于200M的文件直接使用方式4加密。
  4. 加密方式为,利用cryptGenRandom产生真随机数,使用该随机数进行AES拓展加密,利用加密后的秘钥进行AES加密文件内容。随后将对产生的随机数使用RSA公钥加密,写入到文件中。这样一来,受害者自行解密几乎不可能,因为私钥保存在其他人手中,我们无法猜测出该16字节的随机数。
    下面会设置壁纸,启动勒索客户端,遍历磁盘写入垃圾数据,重启时删除。
    对于磁盘填充的操作如下:
    在这里插入图片描述

总结dump.dll的主要行为

  1. 创建秘钥文件和资源文件,用于后面加密时使用
  2. 检测是否存在dkey解密用的秘钥文件,存在则停止加密
  3. 检测磁盘状态,磁盘有更新则会对新磁盘进行加密
  4. 启动勒索客户端,设置注册表自启动
  5. 启动taskdl.exe进行扫尾工作
  6. 遍历文件进行指定类型文件的加密
  7. 在所有磁盘创建临时文件,循环写入数据,占满磁盘

总结

  1. 文件加密方式为使用真随机数进行加密,使用RSA加密随机数保存到文件中用于解密
  2. 部分文件采用的加密秘钥可能没有保存私钥,即不能解密
  3. 病毒传播使用"永恒之蓝漏洞",通过139和445端口进行局域网和外网的传播
  4. 病毒往磁盘写入大量垃圾数据,重启后又会删除
  5. 病毒采用注册表加服务实现自启动
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值