原文:https://blog.malwarebytes.com/threat-analysis/2018/02/encryption-101-malware-analysts-primer/
0x00 简介
虽然大部分安全业内人士对于加密技术并不陌生,但是,仍有许多人对加密技术在恶意软件(特别是勒索软件)中的应用方式缺乏基本的了解。鉴于此,本文将会为大家介绍加密机制及其恶意应用方面的入门知识。
首先,我们将介绍什么是加密技术,然后,讲解勒索软件加密文件时所用的主要方法。在本系列的第二篇文章中,我们将以勒索软件Ransom.ShiOne的最新变体为例,展示在破解加密的文件时,要特别留意加密系统的哪些主要弱点。
0x01 什么是加密?
简单来说,加密就是对信息进行编码处理,使得只有授权方才可以访问明文信息,而未授权方则无法访问这些信息。从计算的角度来看,加密就是将数据从可读形式(明文)转换为编码形式(密文)的过程,以达到只有有权访问解密密钥的一方才能对密文进行正确解码的目的。过去很长时间以来,军队一直都在使用加密技术作为通信保密的手段,时至今日,该技术已广泛用于保护数据的传输和存储,以及身份的证明和验证等领域。
不幸的是,加密也被用于恶意目的,例如勒索软件就属于这种情况。
0x02 分析加密算法
对于恶意软件分析人员来说,为了有效分析用于恶意目的的加密算法,需要在创建或接收加密数据的计算机上对其进行深入考察。如果他们可以在数据加密之前访问系统上的任意进程的话,则通常可以获得足够的数据用于进行解密,或直接查看解密后的数据。
要想在无需破解加密的情况下恢复文件的话,成为观察者是唯一的机会。但是,对于勒索软件攻击情形来说,成为观察者通常是不可能的。这是因为,当恶意软件运行结束并发送加密密钥后,我们就无法观察其加密过程了。这时,我们就必须依靠分析代码,并寄希望于加密系统存在某些弱点了。
那么,成为解密和加密的观察者究竟意味着什么呢?有人曾问我:
为什么恶意软件作者不总是对C2服务器的通信进行加密处理呢?
我的回答是,因为恶意软件是可以公开获取的,毕竟它可能运行于世界各个角落的受害者系统上。作为逆向工程师,我们能够访问二进制文件,并可以在最低、最详细的级别上考察软件。而在这个级别上,安全通信毫无意义,因为我们可以在加密前和解密后“窥视”系统。
在客户端(受害者计算机)上接收到的SSL或https通信流量,需要在内存中进行解密,以便提取出符合恶意软件要求的数据。而在这个过程中,如果我们有机会“窥视”内存,则可以截获通信流量解密后的原始数据,因此,当服务器将加密数据发送到被监控的恶意软件时,它确实无法隐藏任何秘密。
前面的逻辑同样适用于勒索软件和文件加密的情形。如果我们在“窥视”勒索软件的过程中,它在本地生成了加密密钥,那么,我们就可以在内存中看到该密钥,并将其保存下来,之后,就可以用它来解密勒索软件加密的文件了,当然,这要求我们了解勒索软件所使用的加密算法。
在勒索软件运行和加密文件的时候,如果用户转储了其内存的话,就有机会成为观察者并恢复文件。不幸的是,事情并不总是如我们所愿,因为受害者的第一本能并不是在创建内存转储的同时继续允许进程运行。但作为一个理论示例来说,至少在技术上是行得通的。
0x03 勒索软件使用的算法
近几年来,我们遇到过许多“绑架”受害者文件的算法,其中大部分都与标准、公开和经过验证的非对称加密算法有关。但是,偶尔也会遇到自定义加密算法(可能会更弱),有的直接使用简陋的混淆方法来“挟持”受害者的文件。
多年前,当我刚开始接触勒索恶意软件时,它们通常会使用其他方法“绑架”受害者计算机来从事勒索,而不是加密驱动器上的所有文件。现在,他们的勒索手段已经变得五花八门,从文件隐藏、自定义加密算法到主引导记录(MBR)重写,真可谓应有尽有。
0x04 文件混淆
就文件混淆方式来说,勒索软件只是移动或隐藏目标文件(文档及其认为受害者在意的其他文件),然后要求受害者支付赎金以恢复文件。在这种情况下,恢复方法其实非常简单,只要对执行隐藏操作的代码进行逆向,然后反转这些操作就行了。
下面给出一个示例:弹出窗口声称硬盘驱动器已损坏,并要求受害者回电咨询,这时他们就要求支付“支持”费用以恢复文件。在某些恶意软件中,会显示一个弹出窗口(如下所示),并将所有文档和桌面文件简单地移到一个隐蔽位置的新文件夹中。要想解决这个问题,可以查看代码,就能找出哪些文件被移动到了哪个位置。
0x05 自定义加密算法
对于自定义加密算法来说,最常见的情形就是通过一种标准方式修改文件中的所有内容。一个简单的例子就是,利用常量或循环字节组对文件进行逐字节异或运算。在这些情况下,我们可以将算法本身视为密钥,因为一旦逆向该算法的代码,就可以知道它是如何修改或加密文件的。然后,只要对这些步骤执行反向操作,就可以恢复文件了。相比之下,当面对非对称加密时,算法本身对于解密文件来说并没有太多的帮助。
0x06 MBR重写
在第三种情况下,MBR会被一个需要输入密码或序列号才能访问的小程序所重写。然后,恶意软件会强制重启计算机,并在系统加载Windows之前,提示用户需支付赎金才能获取访问密码,并给出具体支付方式。在这种情况下,通过逆向引导记录中的序列号或密码验证算法(实质上就是创建一个keygen),就能得到相应的密码。或者,使用出厂引导记录重写硬盘的相应引导区,也能够解决问题。
除了逆向算法之外,剩下的难点就是需要了解如何重写MBR,以将原始代码恢复到驱动器的引导区中。
以下是一个MBR锁的示例代码。需要注意的是,它没有要求输入任何ID,这意味着锁定过程无需特定的数据,并且可能需要静态解锁代码。
实际上,上面介绍的这些方法并非标准意义上的加密技术,之所以在此介绍它们,是为了说明有时自定义的、闭源的混淆算法破解起来非常容易。现实中,大多数犯罪分子都会使用标准化的、公开的开源加密算法来加密文件进行勒索,这是因为这些算法都经过了严格检验,因此具有可靠的安全性。换句话说,尽管我们能够了解相关加密算法的所有细节,但这仍然于事无补——除非拥有加密密钥,否则很难通过其他方法来解密加密的数据。
为什么要强调这一点呢?因为有些使用标准算法的开源加密算法,其安全性是建立在加密密钥之间特定关系之上的。例如,有的算法会导出两个既相互关联又相互独立密钥。这类算法被称为非对称密码术,它是目前绝大多数勒索软件作者所采用的加密方法。
0x07 非对称密码加密
非对称加密通常会生成两个完全不同的密钥;然而,它们之间的关系是密不可分的。一个密钥(公钥)用于将数据加密为密文,而其另一个密钥(私钥)用于将密文解密为原始明文。之所以被称为不对称的,是因为公钥只能用于加密,而不能用于解密。要想解密,必须使用私钥才行。
对基于非对称密码算法的加密通信来说,两个密钥都是在本地生成的——无论公钥还是私钥。公钥可向所有人公开。如果我们想给Bob发送一则只有他才能阅读的消息,这时候,可以使用Bob的公钥来加密消息:因为他的公钥无法用于解密邮件,所以这样做是十分安全的。只有借助于相应的私钥,Bob才能解密该邮件,从而看到原始文本。
下面给出了一些示意图,可以帮助读者加深理解。
这里的加密算法与勒索软件作者用于文件加密的方法是相同的,具体过程如下:
首先,生成一个随机数组。在进行第一轮文件加密操作前,将会用到这个字节序列。通常,算法会对公钥进行一系列的数学运算,实际上就是通过随机初始化操作,根据初始密钥来创建子密钥。然后,用这个子密钥加密文件数据。在加密过程的第一阶段,会生成第二个随机数组,并将其用作初始化向量(IV)。在接下来的各个阶段,都将使用前一阶段的输出作为其新的IV。
最初,算法会使用随机数作为IV,然后,将生成的密文用于下一轮加密。
实际上,密钥本身的生成也依赖于随机数生成器。因此,拥有一个可靠的、“尽可能随机”的随机数生成器是非常非常重要的。
0x08 勒索软件常用的文件加密算法
现代勒索软件通常会在本地动态生成密钥,然后将它们发送至对应于客户端ID的C2服务器上,或者由作者生成密钥并提前植入到勒索软件本身之中。
虽然后一种做法要更安全一些,但其缺点是,需要为每个受害者生成一个全新的二进制文件,所以需要大量额外工作;或者可以退一步,在每次攻击活动中,让同一版本的恶意软件使用相同的密钥。这里需要注意的是,虽然密钥生成无法被直接观察到,并且分析人员也无法检查算法代码本身的弱点,但不同受害者实际上将具有相同的加密密钥。因此,如果一个受害者支付赎金并分享密钥的话,那么受这一版本影响的其他人就都能免费解密自己的文件了。我们称这种弱点为泄漏密钥。
如果密钥是动态生成的,那么就存在使用内存转储来恢复文件的可能性(尽管这个可能性很小),以及分析师可以在加密代码中找到漏洞的可能性(尽管这个可能性也很小)。内存转储对于恶意软件作者来说并没有太大威胁,如前所述,毕竟清楚应该在何时创建转储文件的用户并不多见。然而,这种本地密钥生成方法的优点是,恶意软件是完全动态的,没有两个人会共享相同的密钥。也就是说,上面的两种方法各有优缺点。
现代勒索软件作者通常使用AES,RSA,Blowfish等标准加密算法,以试图达到没有解密密钥的情况下,受害者无法恢复加密文件的目的。之所以加了“试图”这两个字,是因为在很多情况下这些优秀的算法会被误用(允许相同的密钥被生成两次)。另外,密钥的传输和生成也是可以被拦截的。
不对称密码加密算法几乎是无法破译的,但这并不意味着毫无希望。为了了解加密的破解之道,请阅读本系列的下面一篇文章,届时,我们将以ShiOne勒索软件为例,为恶意软件分析人员演示如何查找加密算法的弱点。