Encryption 101:一个恶意软件分析师的入门书

尽管安全行业的大多数人都知道加密是什么,但很多人对如何在恶意软件中使用它们缺乏基本的了解 – 特别是勒索软件。 因此,我们认为在加密机制介绍性入门以及如何将其用于恶意目的是有益的。

首先,我们将介绍什么是加密技术,然后,讲解勒索软件加密文件时所用的主要方法。

什么是加密?简单来说,加密就是对信息进行编码处理,使得只有授权方才可以访问明文信息,而未授权方则无法访问这些信息。从计算的角度来看,加密就是将数据从可读形式(明文)转换为编码形式(密文)的过程,以达到只有有权访问解密密钥的一方才能对密文进行正确解码的目的。过去很长时间以来,军队一直都在使用加密技术作为通信保密的手段,时至今日,该技术已广泛用于保护数据的传输和存储,以及身份的证明和验证等领域。

不幸的是,加密也被用于恶意目的,例如勒索软件就属于这种情况。

分析加密算法

如果恶意软件分析人员想要有效评估恶意加密,他需要观察创建或接收加密数据的计算机上的加密。 如果您有权访问在执行加密阶段之前运行的任何进程,则通常会有足够的数据能够解密或仅查看本机解密的数据。

要想在无需破解加密的情况下恢复文件的话,成为观察者是唯一的机会。但是,对于勒索软件攻击情形来说,成为观察者通常是不可能的。这是因为,当恶意软件运行结束并发送加密密钥后,我们就无法观察其加密过程了。这时,我们就必须依靠分析代码,并寄希望于加密系统存在某些弱点了。

那么,成为解密和加密的观察者究竟意味着什么呢?有人曾问笔者:为什么恶意软件作者不总是对C2服务器的通信进行加密处理呢?

笔者的回答是,因为恶意软件是可以公开获取的,毕竟它可能运行于世界各个角落的受害者系统上。作为逆向工程师,我们能够访问二进制文件,并可以在最低、最详细的级别上考察软件。而在这个级别上,安全通信毫无意义,因为我们可以在加密前和解密后“窥视”系统。

在客户端(受害者计算机)上接收到的SSL或https通信将在内存中解密,以便以恶意软件所打算的方式处理数据。 此时,我们将始终能够检查内存并以原始形式提取解密的通信,所以当服务器将加密数据发送到正在分析的恶意软件时,它确实不会隐藏任何内容。

前面的逻辑同样适用于勒索软件和文件加密的情形。如果我们在“窥视”勒索软件的过程中,它在本地生成了加密密钥,那么,我们就可以在内存中看到该密钥,并将其保存下来,之后,就可以用它来解密勒索软件加密的文件了,当然,这要求我们了解勒索软件所使用的加密算法。

在勒索软件运行和加密文件的时候,如果用户转储了其内存的话,就有机会成为观察者并恢复文件。不幸的是,事情并不总是如我们所愿,因为受害者的第一本能并不是在创建内存转储的同时继续允许进程运行。但作为一个理论示例来说,至少在技术上是行得通的。

勒索软件使用的算法

多年来,我们遇到了很多用来保存受害者档案人质的算法。 其中最常见的涉及使用标准,公开和经过验证的算法进行非对称加密。 但偶尔我们会看到自定义加密(可能会更弱),或者甚至是简单的混淆方法来保存文件作为人质。

多年前,当笔者刚开始接触勒索恶意软件时,它们通常会使用其他方法“绑架”受害者计算机来从事勒索,而不是加密驱动器上的所有文件。现在,他们的勒索手段已经变得五花八门,从文件隐藏、自定义加密算法到主引导记录(MBR)重写,真可谓应有尽有。

文件混淆

在文件混淆的情况下,勒索软件只会移动或隐藏目标文件 – 文件及其认为受害者会关心的任何其他文件 – 并要求赎金来恢复文件。 在这种情况下,恢复是微不足道的。 您可以简单地反转正在执行隐藏的代码,并能够撤消所执行的操作。

下面给出一个示例:弹出窗口声称硬盘驱动器已损坏,并要求受害者回电咨询,这时他们就要求支付“支持”费用以恢复文件。在某些恶意软件中,会显示一个弹出窗口(如下所示),并将所有文档和桌面文件简单地移到一个隐蔽位置的新文件夹中。要想解决这个问题,可以查看代码,就能找出哪些文件被移动到了哪个位置。

自定义加密算法

在处理自定义密码时,通常会通过以标准方式修改文件的算法传递文件。 一个简单的例子就是文件中的每个字节被一个常量或循环字节组异或。 在这些情况下,您几乎可以将算法本身视为关键。 如果您可以反转该算法,则可以确定它是如何修改或加密文件的。 然后,简单地颠倒步骤会给你原来的文件。 相比之下,当面对非对称加密时,算法本身不会为您提供足够的解密文件。

MBR重写

在第三种情况下,MBR将被一个需要密码或序列号访问的小程序重写。 恶意软件会强制重新启动计算机,在系统加载Windows之前,它会首先提示用户如何支付赎金以接收密码。 在这种情况下,反转启动记录中的串行或密码验证算法(实质上是创建一个keygen),将为您提供知道哪些密码允许访问的功能。 或者,使用出厂引导记录重写硬盘的那部分也会禁用计算机上的锁定。

除了逆向算法之外,剩下的难点就是需要了解如何重写MBR,以将原始代码恢复到驱动器的引导区中。

以下是一个MBR锁的示例代码。需要注意的是,它没有要求输入任何ID,这意味着锁定过程无需特定的数据,并且可能需要静态解锁代码。

现在,这三种替代方法并没有在标准意义上使用加密,但我在这里提到它们是因为它表明自定义的书面封闭源混淆有时可能会被打破。 大多数犯罪分子使用标准化,公开的开放源代码加密算法来加密文件以进行勒索是因为它们经过了测试并且具有可靠的安全性。 这意味着您可以了解有关加密算法的每一个细节,但这并不重要 – 除了拥有加密密钥之外,您无法通过任何方法解密加密。

为什么要强调这一点呢?因为有些使用标准算法的开源加密算法,其安全性是建立在加密密钥之间特定关系之上的。例如,有的算法会导出两个既相互关联又相互独立密钥。这类算法被称为非对称密码术,它是目前绝大多数勒索软件作者所采用的加密方法。

非对称密码加密

非对称加密涉及生成两个完全不同的密钥; 然而,他们有共同的关系。 一个密钥(公钥)用于将数据加密为密文,而其伴侣(私钥)用于将密文解密为原始明文。 它被称为不对称,因为公钥虽然用于加密,但不能用于解密。 私钥需要解密。

对基于非对称密码算法的加密通信来说,两个密钥都是在本地生成的——无论公钥还是私钥。公钥可向所有人公开。如果我们想给Bob发送一则只有他才能阅读的消息,这时候,可以使用Bob的公钥来加密消息:因为他的公钥无法用于解密邮件,所以这样做是十分安全的。只有借助于相应的私钥,Bob才能解密该邮件,从而看到原始文本。

下面给出了一些示意图,可以帮助读者加深理解。

这与勒索软件作者用于文件加密的方法相同。 加密过程的基本运行如下:

首先,生成一个随机数组。在进行第一轮文件加密操作前,将会用到这个字节序列。通常,算法会对公钥进行一系列的数学运算,实际上就是通过随机初始化操作,根据初始密钥来创建子密钥。然后,用这个子密钥加密文件数据。在加密过程的第一阶段,会生成第二个随机数组,并将其用作初始化向量(IV)。在接下来的各个阶段,都将使用前一阶段的输出作为其新的IV。

最初,算法会使用随机数作为IV,然后,将生成的密文用于下一轮加密。

密钥本身的生成也依赖于随机数生成器。 正如你可以想象的那样,拥有一个坚实的“尽可能随机”的发电机是非常重要的。

文件加密算法

现代勒索软件通常会做以下几件事情之一:它可以在本地动态生成密钥,并将它们发送到连接到客户端ID的C2服务器,或者密钥由作者生成并预先加载到勒索软件本身中。

虽然后一种做法要更安全一些,但其缺点是,需要为每个受害者生成一个全新的二进制文件,所以需要大量额外工作;或者可以退一步,在每次攻击活动中,让同一版本的恶意软件使用相同的密钥。这里需要注意的是,虽然密钥生成无法被直接观察到,并且分析人员也无法检查算法代码本身的弱点,但不同受害者实际上将具有相同的加密密钥。因此,如果一个受害者支付赎金并分享密钥的话,那么受这一版本影响的其他人就都能免费解密自己的文件了。我们称这种弱点为泄漏密钥。

如果密钥是动态生成的,那么就存在使用内存转储来恢复文件的可能性(尽管这个可能性很小),以及分析师可以在加密代码中找到漏洞的可能性(尽管这个可能性也很小)。内存转储对于恶意软件作者来说并没有太大威胁,如前所述,毕竟清楚应该在何时创建转储文件的用户并不多见。然而,这种本地密钥生成方法的优点是,恶意软件是完全动态的,没有两个人会共享相同的密钥。也就是说,上面的两种方法各有优缺点。

现代勒索软件作者通常使用这些标准化加密形式之一AES,RSA,Blowfish等试图在受害者的文件不可恢复的情况下不提供解密密钥。 笔者“尝试”的原因是因为很多情况下这些好的算法被滥用(这将允许相同的密钥被生成两次)。 另外,密钥的传输和生成可以被拦截。

 

上一篇:CVE2018-6789利用及保护机制的绕过

下一篇:对JSON Web Services的Fuzz研究