在网络技术不断发展的同时,一系列的网络恶意软件也在不断衍生。勒索软件是黑客用来劫持用户资产或资源并以此为条件向用户勒索钱财的一种恶意软件。
Cylance高级威胁研究员Derek Soeder在本文中与大家分享了如何对勒索软件进行逆向工程以恢复加密用户文件的密码。下面我们来看看Soeder都做了哪些操作,来恢复被勒索软件“绑架”的用户数据。
挑战勒索软件
2013年初,有一家机构向我们寻求帮助,请求恢复他们被勒索软件ACCDFISA感染的服务器中的数据。这个恶意软件已经仔细扫描了每个驱动器上的每一个文件,并且对所有重要文件进行了恶意加密。想要从备份恢复完全是不可能的,因为服务器上的备份驱动同样已经安装了恶意软件。这真的是一场完败!
这个恶意软件让每个文件变成了一个包含加密RAR的自解包程序,同时文件名带有指令:(!!解密电子邮件id…到…@…!!).exe。
这个变体声称使用了256字符随机生成这一高级加密标准.256对每个“受害者”进行单独加密,同时攻击者可以远程存储这些密码。据称这种加密方式可以安全地删除所有未加密原文件以及密码文件,来对恢复硬盘的努力进行阻碍。
试图找到解压软件加密中的一个漏洞似乎并不是最有效的解决思路;相反,我们要把注意力转向破解密码上。为此,我们需要找到创建密码的代码。
找到密码生成器
在对受感染服务器的驱动副本进行反复查看之后,我们发现恶意程序和一些奇怪的文件可能有关系。我们发现微软Sysinternals的删除工具(可以永久删除文件)、一个“NoSafeMode”库以及一个用于自解包程序的RAR实用程序。而RAR实用程序则成为我们进行逆向工程的起点。
这个实用程序接受加密秘钥作为一个命令行参数,所以我们猜测能够通过回溯用于启动的恶意软件代码,从而找到密码生成器。
首先,我们在一次性系统中运行此勒索软件。我们用调试器来拦截生成过程的调用,启动RAR实用程序,伪装成svchost.exe。这样我们就能看到勒索软件执行的每个命令,以及最终用于加密文件的密码。截获的密码为aseT322B2XgM(mC0…有57个字符长,大小写、数字、标点符号混合通过一个点击动作就随机生成)。而以aes开始的密码可能是巧合,或是有意而为的点缀。如果是故意的,那么我们期望可以找到勒索软件代码中的字符串。当我们打开勒索软件反汇编程序时,我们发现不只是aes,而是aesT322。我们因此知道密码实际上是aesT322以及后面大约50位随意生成字符。
我们知道截获的密码不一定与加密客户文件的密码相同。但是我们已经知道一些线索来指导我们下一步逆向工程:我们可以寻找密码本身或者碎片,寻找可能用于生成密码的字符表,以及寻找用于构建命令行密码部分的字符串。
我们使用调试器寻找勒索软件运行时被分配到全局变量的值,通过逆向工程,我们确认了一个全局变量:一个是aesT322前缀字符串,另一个是50位随机字符的字符串,以及57位的完整密码。
搞清楚生成器工作原理
我们了解了很多关于勒索软件的工作原理,但目前我们不认为这会对受害者有所帮助。实际上,我们排除了只是一个固定字符串(即简单密码)被用于所有情况的可能,我们仍然在探索的路上。
通过在程序中跟踪每个实例中的三个变量,我们发现一个循环,就是随机选择的50个字符来自一个由26个小写字符、26个大写字母、10个数字以及16个标点构成的78个字符表,其中有重复。计算机很难实现真正的随机。想要打败加密的一个方法便是攻击“伪随机数生成器”(PRNG),而这就是我们真正要做的。
最终我们发现了初始化的PRNG,或说是去了“种子”的,这是一段带有来自执行此代码线程标识符的32字节数字,以及以毫秒为单位系统运行的时长。这些都是可以预测的值。由于32字节的种子,我们现在了解到最多可能有40亿种不同密码,而非真正从78个字符中随机产生出50个字符而存在的天文数字般可能性。
原因是之前提到的,即使在随机行为中计算机也通常运用了僵化的决定方式。而对于任意给定的种子值,PRNG可以在任何时间从初始值以相同顺序、相同方式、产生相同的数字。而种子是32字节的数字,那么就存在0到10亿的可能性,因此相同初始状态存在的可能领域是大大受限的。
猜密码的过程是十分耗时的,而这正是我们接下来要做的。
猜密码
一个包含40亿个密码的列表是恐怖的。但我们知道了种子是依赖于一个线性ID的(它是四的倍数),通常少于10000和系统正常运行周期。在49.7天的进程中,正常运行时间将从0数到40亿,然后环绕一圈再次回到0。我们需要了解服务器在被攻击之前运行了多久——可能通过一个文件时间戳或一个时间日志条目——来缩小可能性的范围。但是我们发现了一些更好的情况。
在所有奇怪的文件中,我们发现一个在ProgramData目录下的stppthmainfv.dll,带有21行每行含有8个随机字母。我们决定逆向操作,用“暴力”破解所有存在可能的种子值,找出哪个可能让PRNG产生出这21行的。由于这是一个32位的字符串,我们知道在一台正常电脑上搜索应该不会超过几个钟头。这样就会比使用所有潜在密码破解RAR实用程序速度快得多。
一个单核CPU4秒钟便可测试31956209种存在的可能性,同时找到stppthmainfv.dll 中相同顺序的字母生成的31956208个种子值。我们生成了大约12MB的密码列表与种子值进行测试(比测试236GB大小的40亿中可能要强太多了)。我们通宵运行了一批程序,针对RAR实用程序进行密码逐个测试。
当清晨降临,我们已经获得了那个我们一直在等待的——正确密码。实验成功了!最终,看我们成功从勒索软件中夺回了用户的数据。
评论前必须登录!
注册