安全路透社
当前位置:安全路透社 > 网络转载 > 正文

伴着WSF重新杀回的Zepto勒索软件,它都对文档都做了什么

* 本文原创作者:降草

前言

随着安全软件查杀技术的进步,安全软件对PE文件的查杀检测能力已是特征码时代的查杀方法难以望其项背。而非PE文件有着天生的躲避白名单的基因,这就使得越来越多的恶意PE采用“曲线救国”——使用非PE来进行加载执行。本文分析的就是通过wsf脚本下载勒索软件后加载执行,以实现加密用户文件勒索比特比的目的。

文本所分析的样本及分析时的idb文件下载地址:

链接:http://pan.baidu.com/s/1dF5clYL 

密码:2r7b

wsf是WindowsScript File的缩写,是一种windows脚本文件,这种脚本可以包含多种不同脚本语言。只需在标签中指明该段程序是用何种语言编写的,就可以同时包含.vbs和.js脚本等内容。

一.对脚本的调试

样本脚本是个下载者,主要功能是从四个指定的网址中下载dll文件,随后通过rundll32.exe来调用dll文件的qwerty导出函数。

1. 静态分析

脚本为了躲避分析,进行了混淆。混淆的手段包括变量名混淆(变量名使用很长的无意义的字符),加入无用字符,等义语句替换等。对于这个脚本,通过观察可以知道,脚本中的所有的变量名都加了“wedontcareroyals”前缀,可以通过全局删除掉“wedontcareroyals”使脚本看起来更直观。但即使这样,由于这个脚本代码众多而且代码中各式各样的字符串处理函数,使得无法一目了然的看出脚本功能。对于这种功能较复杂,各种字符转换函数的脚本最好的方法还是进行动态调试。

2. 动态调试

动态调试常用的有两种方法,一是在需要的地方通过打印显示出想要的信息,二是通过单步跟踪的方式进行调试。

2.1 对于wsf脚本,可以使用WScript.Echo命令进行打印

如在脚本第291处添加下面代码,就可以打印出脚本联网下载样本的地址

WScript.Echo(wedontcareroyalsFANCYHORDA6);

运行样本后,可以看到弹窗中显示了样本下载dll的网址为:

QQ截图20160914231537.png

2.2 单步跟踪

类似于我们平时使用OLLYDBG调试PE文件,我们也可以使用vs2008动态调试wsf脚本,

调试的命令为cscript.exe,脚本路径 //X

运行命令后会显示下面的界面,选择调试器后就可以用指定的调试器调试脚本。

同样通过下断点也可以调试到联网下载文件的代码。

下载文件后,会判断下载下来的文件是不是PE文件,其中ASCII值77代表是M,ASCII值90代表是Z,如果是PE文件,加上.dll后缀

调用rundll32.exe加载qwerty函数 DoJVmk2.dll

二.对勒索软件的分析

将链接中的文件下载后,发现该文件是个勒索软件,运行后的效果如下:

在每个加密过的文件夹下,都会有一个html文件向受害者显示勒索信息

主要代码功能分析:

勒索软件会遍历系统上的文件夹(包括共享目录),计算文件的加密优先级,根据优先级决定加密文件的先后顺序,这主要是为了用最少的时间最大程序的破坏用户最重要的文件。同时软件还有删除备份镜像,回传用户信息等功能。

1. 遍历指定扩展名的文件

勒索软件为了加快遍历速度,对每个盘符开启一个线程,进行文件遍历:

遍历时也会遍历共享目录,对共享文件下的文件内容也会加密

同时,为了防止加密系统软件导致系统无法启动,勒索软件会排除掉文件名中带有以下字符的文件:

2. 加密优先级算法

勒索软件会对根据文件的扩展名和文件大小决定文件的加密顺序,对遍历到的文件进行优先级打分,分值最高的优先加密。

打分算法:

1. 不同扩展名,对应不同的基础分,基础分可以为正数也可以为负数。基础分最高分为7分,为.key扩展名。最低分为-15分,最低分针对主要视频音频类文件格式。

2. 根据文件体积大小,在基础分的基础上进行相应的减分,而且是累积减分。

大于1M,-5分

大于10M,-10分

大于100M,-10分

大于1G,-10分

假设一个大小大于1G的a.csr文件,根据算法计算分数的过程为为:.csr对应的基础分为6分,因为文件大小大于1G,则要减的分数为5+10+10+10=35,最终得分为6-35=-29分,这个分数在整体的文件系统中只能算是“差生”水平,在加密文件过程中,也会相应的“优后”加密。

3. 加密后文件内容组成

加密后文件的内容由两部分组成

第一部分为:使用AES算法对原始文件内容加密

第二部分为:解密块内容。

通过逆向,得到解密块数据结构的生成算法为:

1) 生成随机的16字节的AES密钥(也称为AES_KEY)

2) 申请空间,写入下面三部分内容:

1. 写入magic1:93 FE 56 89(内存顺序),在magic1后面写入16字节的用户ID,

2. 随后留出0×100大小的空间(在后面填充数据使用),

3. 写入magic2:2A A1 1B D4(内存顺序),在magic2后面写入当前文件名。

3) 使用RSA算法加密1)中生成AES_KEY,并将加密结果替换2)中第二部分留空的0×100大小的空间中

4) 使用AES加密2)中的第三部分数据并替换之

通过上面步骤最终生成的解密块内容为:

magic1 + 用户ID+ RSA(AES_KEY) + AES(magic2+filename)

在调试的过程中,得到的其中一个解密块的内容如下图:

其中红色框为:MAGIC1

黄色框为:用户ID

选中内容为:RSA(AES_KEY)

青色框内为:AES(MAGIC2+filename)

在计算上面的加密块算法中和RSA公钥保存在程序中,在运行过程中,导入公钥,用于加密生成的随机的AES密钥,导入RSA公钥的过程及所使用的RSA公钥如下:

使用的AES_KEY,为随机生成:

使用RSA公钥加密AES_KEY

在此调用AES算法时,勒索软件为了达到最大运行速度,会判断CPU是否支持一些列用于处理AES加密和解密的指令。这在freebuf以前的文章中也有过提及,请参考《逆向分析及识别恶意代码中的AES算法》

那么如何判断CPU是否支持AES加密与解密的指令的呢 答案是CPUID函数:

如果cpu支持AES指令,可以看到调用aeskeygenassist指令

使用AES算法加密magic2+filename:

使用AES算法加密原始文件内容:

4. 可以预见的解密的过程

当勒索者收到赎金后,会提供给受害者RSA的私钥,对于加密过的文件,通过定位每个文件解密块的RSA(AES_KEY)部分,通过RSA私钥解密出AES_KEY,有了AES_KEY,就可以解密结构的后面部分得到文件的原始文件名,解密文件的前面部分得到文件内容,从而恢复文件。

此外,由于RSA的公钥是硬编码在程序中的,因此对于不同的受害用户,勒索者可能会使用相同的解密程序对其进行解密。

该勒索软件与常见勒索软件不同之处主要在于,第一优化了加密算法,如果CPU支持AES算法指令则直接使用CPU指令。第二优先加密重要的文件内容,用最快的速度把用户最有价值的文件加密。另外,对于用户,建议保持安全软件常开模式,同时避免打开来路不明的文件。

参考资料:

https://www.bugsfighter.com/remove-zepto-ransomware-decrypt-zepto-files/

http://securityaffairs.co/wordpress/49094/malware/zepto-ransomware.html

https://www.helpnetsecurity.com/2016/07/05/locky-ransomware-variant-zepto/

https://support.microsoft.com/zh-cn/kb/308364

* 本文原创作者:降草

未经允许不得转载:安全路透社 » 伴着WSF重新杀回的Zepto勒索软件,它都对文档都做了什么

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册