导语:在本文中,我们将为读者详细介绍如何利用LockCrypt勒索软件自身弱点恢复加密数据。
从今年年初开始,我们就意识到2018将变成加密货币挖矿软件元年:它们的风头如此之盛,压倒性地盖过了所有其他恶意软件。然而,勒索软件并没有立即在这个领域缴械投降,相反,每隔几个月就会有新的变体出现在某个角落,尽管在这里看起来有点单薄。
目前,最受欢迎的勒索软件非GandCrab莫属。不过,自2017年6月以来,原先默默无闻的LockCrypt勒索软件系列迅速蔓延开来。不过,由于它是通过RDP暴力攻击进行传播的,而这必须以手动方式进行,所以,尚未造成巨大的威胁。正因为如此,至今未见针对该软件的深入分析报告。
但是,近期接触到了一些LockCrypt的受害者之后,我们决定仔细研究一下该恶意软件。在此过程中,我们发现了一些有趣的事情,那就是勒索软件作者完全无视流行的建议,而是一意孤行地实现了自己的加密代码。不难猜到,他在代码中引入了某些弱点,导致在某些情况下可利用它们来恢复加密的数据。
分析的样本
99a3d049f11474fac6844447ac2da430
行为分析
在权限方面,该恶意软件必须以管理员身份才能正常运行。此外,由于该勒索软件需要以手动方式进行部署,因此,该软件没有使用任何用以提升权限的技巧或漏洞利用代码。
运行后,该软件将删除原始代码,并将其自身投放到C:\ Windows下名称为wwvcm.exe的文件中:
同时,它还会通过注册表项来实现持久性:
这个勒索软件会对自己能访问的所有文件进行加密。在此过程中,它会枚举并尝试终止所有正在运行的应用程序,以便避免它们妨碍访问受攻击的文件。需要注意的是,可执行文件也会受到攻击。
该软件会对加密文件的名称进行混淆处理:首先加密,然后转换为base64。同时,还会为文件名称添加随机ID,加密后的文件扩展名为“1btc”。
另外,该恶意软件的勒索信是作为TXT文件来进行投递的:
这些信息将在完成加密工作后弹出。
通过考察加密文件的内容,我们发现其熵非常之高,下面展示了原文件加密前后对应的BMP文件的样子:
我们对图像的初步判断是,这个勒索软件的作者在这里没有使用常见的XOR操作。根据我们的推测,这里好像使用了流密码来加密文件(或CBC模式下的其他加密算法)。通过查看代码,我们将会对它有进一步的了解。
通过检测注册表项的变化情况,我们找到了该勒索软件留下的其他数据,例如受害者的唯一ID:
网络通信
该恶意软件能够在没有Internet连接的情况下进行加密。但是,当在接入互联网的机器上运行该恶意软件的时候,它会向其CnC发送信号。其中,CnC IP为46.32.17.222
(位于伊朗)。
下面展示的是通信数据的一部分:
这个勒索软件会发送与受攻击机器有关的base64编码数据,例如随机ID、用户名、操作系统以及部署恶意软件的路径等:
WThSQVNVNDczUjZUMzVjNycsJ1dpbmRvd3MgNyBQcm9mZXNzaW9uYWx8dGVzdGVyfEM6XFVzZXJzXHRlc3RlclxEZXNrdG9wXGxvY2tjcnlwdC5leGU=
解码后的内容:
Y8RASU473R6T35c7','Windows 7 Professional|tester|C:\Users\tester\Desktop\lockcrypt.exe
然后,服务器会返回一组字节数据,它们看起来像一些随机或加密的数据。将来通过查看该软件的内部代码,就能弄清楚这些数据的作用。
深入分析勒索软件代码
对于这个恶意软件样本来说,它既没有加壳,也没有进行混淆处理。换句话说,我们可以直接看到代码的真面目。
在刚开始时,该勒索软件会检查自己所在的文件夹,并试图在Windows文件夹中创建一个副本,然后将自己重新部署到这个文件夹中。
然后,它会枚举所有正在运行的进程,并尝试终止其线程。
接着,它会读取注册表以检查自己是否已部署过了。如果找到某些对应的注册表项的话,它就会阻止重复感染——该恶意软件会将机器识别为已感染过了。否则,它会继续进行相应的部署工作。
加密过程
该恶意软件的感染过程是从与CnC进行通信开始的。
通过考察这个函数,我们就会发现,原来在行为分析过程中看到的那些字节,实际上扮演的是一个神秘的缓冲区的角色。下载的缓冲区会通过CRC32校验和进行验证。然后,它为进一步使用加密程序设置了一个全局变量。
现在来看,这个缓冲区貌似是一个用于加密处理的密码本。该软件的作者看上去好像要实现类似于一次性密码本的加密功能。但是,鉴于这里重复使用了该缓冲区,因此,他实现的算法更容易受到明文攻击。
有时候,如果无法从互联网上下该载缓冲区的话,那么还可以通过一个简单的伪随机数生成算法来生成相应的字节内容:
需要提示的是,该作者没有仔细挑选性能最佳的随机数生成器:使用的是GetTickCount函数,而不是更加符合加密要求的随机数生成函数。
通过考察加密例程,我们可以看到,该文件是通过一个非常简单的函数进行编码的:
这里的编码算法分两轮完成文件的加密处理,相应代码将在下面分别加以介绍。
第一轮编码
本轮操作的操作非常简单,它只用到了异或运算,不过它还引入了一个可以防止恢复原始密钥的小技巧。虽然来自输入的DWORD会与来自密钥的DWORD进行异或运算,但需要注意的是,这里的输入还会受到前一个输出的影响。在每一步中,输入DWORD的前半部分都来自前一个输出,而只有后半部分才是新引入的,这使得其成为一个简单的流密码算法。
第二轮编码
这一轮的处理看起来要更加复杂——在这里不仅使用了XOR操作,还使用了ROL操作和逐位交换操作。但是,这里没有像第一轮那样对输入进行相应的处理,所以这些操作很容易被反转。
经过这两轮的简单处理,在2,500个字节长的“pad”缓冲区的共同作用下,我们就能够得到具有相当高的熵的输出了。
文件名称的混淆处理
对于这些文件的名称,首先会与缓冲区进行异或运算,然后进行base64编码处理。XOR密钥的偏移量为从缓冲区开始偏移1111个字符。
负责对文件名进行混淆处理的代码为:
小结
综上所述,LockCrypt是由一位“涉世不深的”的攻击者编写的一款“质朴”勒索软件。之所以这么说,是因为其作者完全无视正确应用密码学的基本原则。与此同时,该软件的内部结构也很不专业。
对于那些通过手动方式分发的勒索软件来说,粗糙而不专业的代码是非常普遍的现象。因为这些作者不想在编写攻击或有效载荷代码上面花费太多时间。相反,他们只是一心想着快速、轻松的捞钱,根本没有长远的打算。也正因为如此,他们才很容易被击败。