导语:本文介绍了加密算法的基本结构和流程,以随机数发生器为例,讲解了如何攻破加密算法。
当应用加密算法时,有许多地方可能会出错。难点在于识别和分析程序员用来加密的方法,然后寻找其中的漏洞。漏洞的种类也很多,比如弱加密算法、弱密钥生成器、服务端漏洞和密钥泄露等。
定位加密算法
在尝试寻找漏洞之前,首先要知道使用了什么加密算法。最常用的方法就是查看API调用,如果API调用可以查到,那很容易就可以识别使用的算法。
很多时候,加密算法是静态编译到恶意软件中的,或者使用了传统的写加密算法。这种情况下,就要理解解密算法的内部工作流程来识别代码。
文件的内容可以被加密然后写回文件中,所以最快的减小加密的范围的方法是交叉引用ReadFile和WriteFile API调用。加密就是在这两个点间执行的。
识别加密代码
当寻找静态加密编译的加密代码时,不需要找任何的API调用。理解加密算法的底层工作原理是非常必要的。
首先,我们看一下AES算法的高级流。大多数的同步加密算法的流都与之类似,区别在于所使用的数学操作的类型,但是核心概念是相同的。所以,理解AES对于在现实中识别其他类型的加密算法是非常有帮助的。
AES是对称加密算法,会执行一系列的数学和逻辑运算:
· 要加密的明文数据
· 静态字节是算法的一部分
· 加密使用的密钥
根据AES的选择和密钥大小,流会有所不同。从上面的图会有一些block组成的环:
· Add key添加密钥
· Shift rows行变换
· Sub bytes字节替换
· Mix columns行列交换
上面的步骤中,文件数据被读入固定字节的矩阵中。本例中是16字节,但实际上根据算法的不同,几字节都有可能。下面是这几轮的结果:
· Add key将密钥数据和输入数据矩阵进行XOR运算;
· Shift rows对数据进行移位操作。比如,数据本来是 4 5 2 1,左移1位就变成了5 2 1 4。
· Sub bytes是利用算法内置的静态字节数组。数据的每个字节都是lookup矩阵的索引。这样,一个静态的替换就发生了。
· Mix columns对矩阵中的字节进行一些数据操作和线性变换,这样矩阵中的每个字节就都变了。
上面4个步骤可以看做是一轮。AES有10到14轮,也就是说在二进制文件中寻找加密代码,应该是一段很长的重复代码。这是从二进制文件中寻找加密代码的一种方法。
下面是加密的另一轮,AES算法的另一种或相似的同步加密:
操作的顺序有点不同,但这不重要。我们并不是寻找AES算法的漏洞,我们寻找的是AES在实践时的漏洞。给出AES内部工作原理细节的原因是让大家更好的理解其工作原理,便于在代码中识别。
以Scarab勒索软件为例,它使用了静态编译的AES来加密文件,我们对不同加密算法的内部工作原来进行了研究,这可以帮我们识别使用加密算法。
这也就说明了在同一个勒索软件中可能会使用多种加密方法。我们有文件加密的流图还有加密密钥的算法。虽然这不是修改文件本身的加密,但是可以用来确保文件加密密钥的安全。这些弱点都可以用来攻破加密。技术上可以使用任意次数的加密组合,因为这是由作者决定的。必须要理解和识别每个加密算法以及所起的作用。因为攻破一个错误使用的加密算法就可以连环攻破整个加密方案。
随机数生成器
攻破加密的另一个出发点就是加密密钥生成器,大多数情况下加密密钥生成器来源于一个随机数生成器。
如果你之前了解过任何加密的话,就应该知道随机数生成器的重要性。因为一旦你可以让随机数生成器生成之前加密时所产生的值,那么就可以重新生成之前的加密密钥。
下图中,系统时间作为弱随机数生成器的种子。
大多数情况下,任何的计算机算法都只能执行一定次数的循环。如果输入函数的输入是一样的,那么输出的结果也应该是一样的。对随机数生成器来说,只要有足够大的输入来生成随机数值就可以进行推断了。比如,一些弱随机数生成器利用日期作为输入。因此,这些条件都可以重新创建的。唯一需要做的就是利用足够多的随机输入来获取足够多的熵值。
一些强的随机数生成器会使用样本音频数据、加上日期。并使用鼠标输入和其他的元素来让输入尽可能的随机化。这样的话,暴力破解进行重新创造就变得很难。
破解弱RNG的理论过程
假设勒索算计用用当前时间的微秒作为RNG的种子,使用的加密是标准加密。下面是攻击的基本步骤。
· 网络管理员分析勒索软件发现了用于加密的公钥是受害者的ID。
· 网络管理员可以通过日志等了解感染发生的大概时间,比如,10:00:00am 到10:00:10am一个10秒的时间窗口。
· 因为RNG使用微秒作为seed,那么就有1000万个可能的seed。
· 如果勒索软件用时间作为seed值x,那么加密密钥对就是KEYx。
· 然后从10:00:00开始以微秒的单位递增,用标准软件进行密钥对创建。
· 然后检查是否与受害者ID(公钥)匹配。
· 最终,会有一个与之匹配的密钥。然后可以尝试私钥并进行解密,就可以将原始文件恢复。
在这个场景中,用到了暴力破解。如果RNG用微秒和当时的进程数相结合作为seed,就增加了复杂性。比如说当时运行的进程有5-25个,那么暴力破解需要尝试的次数就是1000万-2亿次,虽然也是可以破解的,但是增加了破解的复杂度。
如果加入了足够多的参数,或者参数的可能性比较多的话,那么最终需要暴力破解的次数会非常多,多到可能用尽你余生的时间都不够的。
解密实践
下面是一些成功破解的勒索软件的例子和所使用的方法。
7ev3n, XORist, Bart: Weak encryption algorithm Petya: Mistakes in cryptography implementation DMA Locker, CryptXXX: Weak key generator Cerber: Server-side vulnerability Chimera: Leaked keys
弱加密算法
DES算法是上世纪开发的,并广泛用于加密实践。因为密钥位数限制,目前DES被认为是一种弱加密算法。因为加密算法的密钥的位数是考虑加密算法强壮性的一个因素。密钥位数越大,破解的难度就越大。
通过查看文件也可以得到加密算法的一些信息。
从上图可以看出,熵值比较低,加密文件中的数据与原文比较相似。这应该是明文XOR的结果。
从上图看出,熵值明显是比较大的。很难从密文中看出与明文的相似处。
文件可视化是对给定勒索软件进行解密的第一步,从中我们可以找到所使用的加密算法和加密算法的强弱。也能给出一个攻击的方向和如何攻破加密。比如,上面列表中的Cerber就是利用服务端的漏洞进行攻击的,虽然加密本身是很强的,但是也可以攻击侧信道来创建解密器。
结论
为了寻找加密算法的弱点,需要对加密算法进行识别和分类。然后对代码进行初步识别,再进一步找出可能存在的弱点和漏洞,再利用这些漏洞和弱点就可以攻破加密算法。