一、 前言
近两年,以敲诈勒索为目的的文件加密恶意软件逐渐成为恶意软件中的主力军。以Locky家族,ceber家族为典型代表的敲诈勒索软件席卷国外,对政府机构,公司乃至个人用户造成了极大的危害。早期的敲诈勒索软件一般以网页挂马形式出现,“落户”到本地运行后会经过一系列的代码重组及解密操作得到用于执行主要功能的shellcode,然后运行shellcode对指定文件进行加密。由于程序代码段在解密和解混淆之后与之前已经完全不同,主要功能又移至shellcode中执行,因此此类加密勒索软件较容易躲过杀软的静态检测。但为了对抗杀软不断更新的特征库,软件作者也必须不断更改加密方法,这也造成了研发成本的增加。
在最近这段时间,加密勒索类软件有简化的趋势,软件开发者将目光转向了拥有较为完善的加密函数类库的.NET平台,同时也去除一些混淆操作,直接使用.NET平台下一些公开的混淆方法。当然,软件开发的简化也“造福”了国内一大帮急于发财但技术又不是那么过关的“伪黑客”。从最近的样本捕获可以发现,已有一些国内黑客试水.NET平台下的加密勒索软件。
二、 样本具体分析
捕获到的样本由c#语言编写,使用了.NET Reactor4.2混淆,在去混淆之后程序只有20几k的大小。可以看出,.NET平台下的加密勒索软件相比较之前国外的其他加密勒索软件体积上缩小特别多,但加密的速度还是不尽如人意,一般需要半分钟至一分钟的时间才能完成一整套加密操作。
图1 去混淆后的程序非常小
样本集加密与解密于一身,当文件被加密后,受害者只需要到相应比特币网站上付款然后再双击运行一次原程序即可进行解密。第二次运行该程序,程序便通过判断赎金是否到账来决定是否进行解密。相比较国外一些非常繁琐的交付赎金解密的步骤,这款国产敲诈勒索相对比较“良心”,但也侧面说明一点,作者的目标可能不是一些企业用户或者机构用户,而是普通的用户,包括不了解电脑知识的用户,该软件一旦传播开来破坏性不小。
和其他加密勒索软件的套路相同,该软件也是使用AES加密算法去加密系统中的文件,然后使用RSA加密算法去加密AES密钥。虽然AES是对称加密算法,但RSA为非对称加密算法,只有拥有RSA私钥才能解密得到AES的密钥进而对被加密的文件进行解密。除外,软件加密时使用的AES密钥是随机生成的,因此在加密过后无法复现密钥。
图2 密钥间加密过程
图3 用AES密钥对文件进行加密
程序通过判断文件名来选择执行加密的文件,除了一些系统文件夹诸如“Program Files”之外,还专门针对国内用户加密文件名中含有“优酷”,“风行”,“QQpet”字样的文件。
图4 一些被加密的文件名
在进行加密之后,程序会将交付赎金的步骤等需要受害者知晓的信息写入到文件中,并将文件放在系统的关键文件夹以及桌面上。除外,为了更加显眼作者干脆来了个超大的对话框告诉受害者交付赎金的方法。
图5 初始化文件中的内容
图6 将恢复步骤写入文件并复制到桌面上
图7 循环弹对话框
下图所示就是弹出的写有恢复步骤的对话框。从中可以看出,恢复步骤其实不复杂,交付赎金之后双击再次运行程序即可。
图8 写有恢复步骤的对话框
那么程序是如何判断用户已经交付赎金了呢?从下面的代码可以看出,程序访问相关比特币帐户,并根据返回值来进行判断。可以看出,作者使用的比特币网站和国内一些打码平台的运作方式相似,即用户通过相关网址提交数据,而程序可以访问相关接口来获取实时的结果,这种借助第三方来进行交易的方式不仅不容易暴露作者身份,也方便作者实时获得账户信息,可以说是一种自动化的“提款机”。
图9 访问比特币帐户相关网址
图10 判断付款金额是否足够
从上图可以看出,受害者应付的数值为num3,受害者所付的数值为num4/1E08,通过判断两值的大小来确定付款金额是否足够。从返回信息和代码信息可以看出,num3是应付赎金对应的比特币数目,通过访问hxxp://blockmeta.com/api/v1/chain/ticker可以获得当前比特币对人民币的汇率,并通过num(应付金额)/num2(比特币汇率)来计算作者应得的比特币,然后作者访问自己账户获得已收到的比特币数并进行比较。
图11 返回信息显示比特币汇率
在获得赎金后,程序就该执行解密操作了,按照常见的加密勒索软件的套路应该是访问一个暗网地址获取密钥解密。不过。。。作者好像用了另一种套路,他把密钥全部存放在了本地。。。放在了本地。。。本地。。。
如下图所示,作者把加密文件用的AES密钥和加密AES密钥的RSA公钥私钥全存放在了桌面的ckt文件中。
图12 生成ckt后缀的文件存放密钥
当交付赎金成功后,即通过本地的ckt文件进行解密。
图13 调取存放在本地的密钥进行
既然密钥都存放在本地,就可以通过密钥来进行相应的解密操作。可以说,这个加密勒索做得相当相当相当失败。不过换句话说,一般用户可能不知道桌面上的ckt文件就是解密的密钥,所以说,中了加密勒索软件之后先别慌张,先检查程序是否遗留下样本或者一些相关的信息,如果有的话可以提交到杀毒软件相关反馈窗口,由病毒分析人员分析并确定解密的可行性。
除了利用本地的密钥进行解密,我们还发现了另一个可以利用的点。程序通过判断作者比特币账户上的比特币数量是否大于应付赎金可兑换的比特币数量来决定是否进行解密。判断的代码如下所示。
图14 判断条件
该条件如果成立,则说明支付的赎金不够。因此满足支付的条件为num4/1E08>num3。num4和num3都是从作者账户或者相应比特币汇率信息中得到的数据,修改较不方便,但1E08是硬编码在代码里的,当然可以通过修改这个数值来使条件满足。既然作者用num4/1E08和num3比较,说明num4应该比num3大好几个数量级,我们不妨把1E08改为1,只要num4最初不等于0,num4/1E08>num3就有极大可能会成立。
图15 修改前相应位置的IL指令
图16 修改后相应位置的IL指令
果不其然,即使没有交付赎金,程序也能跳转到解密部分执行解密功能。加密勒索软件转眼间就成了解密程序。当然,如果num4等于0,就不能通过修改1E08这个值来改变跳转条件,这时候可以通过修改相应的IL指令将跳转条件中的<=改为>即可实现相同效果。如下图所示。
图17 修改前相应位置的IL指令
图18 修改后相应位置的IL指令
图19 解密前的文件
图20 解密后的文件
只能说,这种把密钥存放在本地的方式实在太失败了,但侧面也反映出了作者的一些顾虑。如果通过服务器上传密钥或下载密钥进行解密就会很容易被分析人员通过服务器地址溯源出病毒作者的个人信息。由此看来作者的“反侦察意识”还是蛮强的,只是使用的方法,实在不忍直视。。。
可能作者也发现了该软件存在严重的漏洞,不久过后,360互联网安全中心又捕获到一枚加密勒索软件。通过对该加密勒索软件的分析不难看出,两个加密勒索软件出自同一人之手。
图21 升级后的加密勒索软件
图22 新样本中对ckt的命名方式和上一个样本相同
新样本中的加密手法和老样本相同,只是对于密钥的处理方式发生了改变,不再是以前的直接将密钥存放在本地,而是将用户计算机名称以及加密所需的密钥上传到hxxp://www.diaochapai.com/survey/b6ceb9cf-3902-4496-a630-89055efde01c。这是一个用户发布调查表的网站,从用户计算机获取的数据可能作为调查表的内容上传到该地址,而软件作者作为调查表的发布者可以很容易的看到这些数据,也就可以得到每一台计算机感染该加密勒索软件时所使用的密钥。由于上传密钥时顺道上传了计算机名,也就达到了“一机一码”的效果,作者在接收赎金进行解密时也更加方便。
图23 上传密钥和计算机名
同样,加密成功后程序会弹出相应的文本内容以及警告框要求用户联系邮箱imugf@outlook.com来申请解密。
图24 弹出写有恢复方法的文本内容
图25 弹出警告框
被加密后的文件如下图所示。
图26 被加密的文件
那么,是不是作者上传了密钥就没办法进行解密,只能乖乖交付赎金了?理论上是这样的,但不知是作者良心发现还是良心发现,竟然留下了一段可能可以用来解密的代码。
如下图所示,作者在进行上传操作时使用的是try catch语句,一旦上传出现异常则转向异常处理代码,而异常处理代码竟然是。。。把密钥保存在本地。
图27 一旦上传失败就将密钥存在本地
可能作者考虑到有些用户的文件遭到加密时上传地址已经失效,如果这时不存留一份密钥的话,用户的文件将永远无法解密。看来作者还是有点良心的。。。而作者又是一个善于“隐藏身份”的人,肯定会经常修改上传地址,这会导致该版本的上传地址很快就失效,因此许多用户的文件遭到加密时,是可以在本地找到解密密钥的。不过如果用户不知道本地存放的这些以ckt为后缀的文件就是解密密钥,可能同样会去联系作者,也同样会被坑一笔钱。
图28 分析过程中该上传地址已经失效
所以用户在发现自己计算机中的文件遭到加密后千万不要马上联系对方,可能加密密钥就在本地,而你却因此被坑了一大笔钱。这时候将情况反馈给杀毒软件厂商才是最正确的选择。
三、总结
由于加密勒索软件开发技术的简化以及该产业所带来的暴利对国内黑产从业者的诱惑,国内的加密勒索软件数量将呈现不断上升的趋势。用户在发现计算机中的文件被加密后,不要急于支付赎金,而应该检查计算机中是否有相应病毒样本或者相关信息的残留,如果有的话可以反馈到杀毒软件,由专业分析人员进行分析并确定解决方案。值得一提的是,360安全卫士已经开通了“反勒索服务”,并向用户公开承诺:使用360安全卫士11.0版本并开启该服务后,一旦感染敲诈者病毒,360将提供最高3个比特币(约13000元人民币)的赎金并帮助用户回复数据,让用户远离财物及文档的损失。