从Wannacry到WannaRen:螣龙安科2020年4月7日,360CERT监测发现网络上出现一款新型勒索病毒wannaRen,该勒索病毒会加密windows系统中几乎所有的文件,并且以.WannaRen作为后缀。360CERT该事件评定:危险等级为高危,影响面为广泛。
经360安全大脑分析确认,“WannaRen”勒索病毒的作者正是此前借“永恒之蓝”漏洞祸乱网络的“Shadow Brokers”组织。从三年前Wannacry席卷全球,至少30万用户中招,到今天卷土重来,这两款病毒背后的原理基本是一样的,今天翼火蛇就带你来深度分析这两款病毒的原理。
原理分析(以Wannacry为例)
传播基础——EternalBlue“永恒之蓝”漏洞
“永恒之蓝”漏洞本来是美国国家安全局(NSA)开发的针对微软的攻击武器,但在2013年6月被黑客团队ShadowBreakers窃取,在2017年,ShadowBreakers公布了一大批网络攻击工具,其中包含“永恒之蓝”工具。
”永恒之蓝“利用Microsoft 服务器消息块(SMB)协议的实现中的一个漏洞。该漏洞的存在是因为各种版本的Microsoft Windows中的SMB版本不同,服务器处理来自远程攻击者的特制数据包,使他们可以在目标计算机上执行任意代码。该漏洞利用的是windows计算机的445端口,445端口是一个毁誉参半的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共享你的硬盘。而在Wannacry攻击中,攻击者就是扫描开放445文件共享端口的Windows机器,不需要用户的任何操作就能在电脑和服务器中植入Wannacry病毒。
病毒核心——加密勒索病毒部分
PART1 wcry.exe主程序
这一部分是是病毒的初始化操作,代码逻辑如下:
初始化操作
病毒首先获取到计算机名,然后计算出计算机名的ASCII乘积,将这个乘积作为随机数种子调用两次rand函数,最后获取到一个字母+数字的随机字符串,接下来程序对命令行参数做了一个判断,然后切换当前进程的路径为工作目录。
随后,通过RealseFiles函数将资源中隐藏的压缩包进行解压 解压密码是WNcry@2017,然后释放压缩包中的所有文件到当前进程的路径下。然后,再利用WriteCwnry函数将比特币账户写入到c.wnry文件中。最后通过执行两次ExeCmdCommand函数,隐藏当前路径下的所有文件,同时向系统中添加一个叫everyone的用户,并且给他所有权限。
加载病毒核心操作
这部分的函数所有的操作都只有一个目的,就是为了调用dll中的导出函数。
首先,通过GetApis函数获取各个API函数的地址,比如CreateFileW、WriteFile 等等,为后面的操作做准备。
接着,通过CDatabase::CDatabase构造函数初始化两个用于线程同步的临界区对象。接下来利用ImportKeyAndAllocMem函数导入RSA密钥并申请两块内存空间。
私钥已经导入完成,那么接下来要做的就是解密了。通过DecryptFile函数对t.wnry这个文件进行读取操作,读取到内存之后传入上个函数拿到的密钥句柄,在内存中进行解密,然后导出一个dll文件。
随后,通过WriteAllocMem函数申请一块堆空间,并且把已经解密的dll文件写入到堆空间中。然后,通过函数GetExportFunAddr函数从堆空间中取出dll导出函数的地址,并且通过析构函数析构,释放资源。
PART1总结
从上面的分析可以得出病毒的主体程序实际上只做了一些初始化的操作,到目前为止并没有看到它感染或加密任何一个文件,也没有对用户进行勒索,真正的核心代码在t.wnry中。
PART2 t.wnry.dll病毒核心
第二部分是病毒的所有操作
CreateResFile 第一个线程回调函数
这个函数在工作路径创建了00000000.res这个文件,并且往里写入数据。
CheckDky 第二个线程函数
这个函数的作用是每个五秒检测工作路径下是否存在774F34B5.dky这个文件。
EncryptAllFiles 第三个线程函数 加密所有文件
这个函数是整个病毒程序最核心的函数,代码量最多,里里外外总共嵌套了十几层函数。
l 核心加密函数第一层
循环检测是否有新的磁盘加入,如果有,则加密,没有就一直循环。
l 核心加密第二层
这一层有三个函数很重要
MovFileToTemp:移动文件到临时目录下并重命名为.WNCRTY
FillDisk:在回收站创建一个文件,并且循环写入数据直到磁盘空间不足
EncryptFile:加密磁盘上的所有文件
l 核心加密第三层
进到第三层之后又有一个函数,这个函数会遍历并且加密所有的文件,而且是递归调用的。
l 核心加密第四层
这个函数首先遍历所有的文件,对文件夹和文件执行不同的操作,并且对后缀名进行过滤。
l 核心加密第五层
这个函数首先会调用sub_10002E70这个函数 根据这个函数返回值的不同 执行不同的加密策略
l 核心加密第六层
这个加密函数首先做了一些准备工作,获取文件的后缀名,然后跟.WNCRY做判断,如果比较成功,则不加密,接着做了一个字符串拼接,然后才开始加密文件
l 核心加密第七层
接下来是这个程序的核心的加密算法,他加密的步骤如下
1.读取文件前0x8个字节的内容,跟WANACRY!作比较
2.使用原文件名+.WNCRYT 创建一个新文件,创建的时候这个文件并没有任何内容
3.对创建的文件写入数据
4.读取原文件 将加密后的文件内容写入到创建的文件
StartTaskdl 第四个线程回调函数 以隐藏的方式启动taskdl.exe
这个函数每隔三秒以隐藏的方式启动taskdl.exe
StartExeAndSetReg 第五个线程回调函数 启动taskse.exe和@WanaDecryptor@.exe并且修改注册表
WannaCry病毒的大致原理就是这样,在其核心部分,同时使用了十几个函数的嵌套,复杂程度堪比当年的熊猫烧香。但是WannaCry病毒存在一个致命缺陷,即病毒作者无法明确认定哪些受害者支付了赎金,因此很难给相应的解密密钥,所以用户即使支付了赎金,也未必能顺利获得密钥该电脑系统及文件依旧无法得到恢复。
当然,Wannacry病毒并不是金刚不坏,主要有这样几种防御措施。
1. 关闭445端口
2.更新补丁
3.通过某些安全软件来防范加密
事实上,在面对所有的勒索病毒时,避免接触感染源,及时更新系统补丁才是上上策,一旦病毒已经感染,文件已经被加密,在短时间内破解密钥几乎是不可能的,因而事前防范才是克制勒索病毒像2017年那样肆虐的关键所在。