科普:彩虹表破解开机密码、MD5算法等的原理

前言

或许对于大多数人来说,实际中并不需要了解这些理论,能够使用现成的工具就行,但是我个人觉得了解了这些可以将工具使用的更好,更何况理论研究中思维的碰撞也是一种乐趣

一、 简介

彩虹表技术以时空折中理论为基础,即增大存储空间的开销缩短密码破解所需要的时间,时空折中的相关理论在密码学中应用很广,最初是在1980年,公钥密码学的提出者之一Hellman针对DES算法提出的一种攻击方式,经过不断地改进,2003年瑞典的Philippe Oechslin 在Making a Faster Cryptanalytic Time-Memory Trade-Off一文中提出了一种高效破解windows开机密码的时空折中算法,并命名为彩虹表,当然当时是针对Windows Xp开机认证的LM-HASH算法。除了破解开机密码,彩虹表目前还应用于散列密码如SHA、MD4、MD5等算法的破译,速度快、效率高、疗效有保证,Philippe的论文中提到:“1.4G的彩虹表可以在13.6s内破解99.9%的数字字母混合型的Windows密码”,具有很强的实用性。

二、 彩虹表的原理

设想一下这种情况:你已经拿到了一台服务器的Shell,并且通过HashDump工具获取到了主机中存储的用户密码的Hash值(一条Lm-Hash密文)

例:C23413A8A1E7665FAAD3B435B51404EE

怎么据此得到明文的用户密码搞定管理员权限呢(当然提权方法很多,如直接扔进在线解密网站或是用wce、minikazi之类的工具直接搞到原始明文密码,或者干脆绕过密码提权,这里只是做个示例),有两种很容易想到的方法:一种是字典破解,二是暴力穷举,这两种方式应用的都非常广,字典破解存储常用的用户名密码和其对应的密码Hash值,破解时只需根据需要破解的密码找到对应的明文密码即可,破解速度快,但是破译效率依赖于字典的构造,并且经常需要大量的存储空间存放字典文件;暴力破解法一般比较盲目,常见的形式就是依次计算1-N位字符串的密码值与需破解的密码进行比较,成功率全靠人品。这两种方法分别对空间和时间的要求比较大,久之,人类开始寻找折中的方法,彩虹表就是时空折中的典型,下面我就以彩虹表的生成和查表这两个步骤来介绍彩虹表破解的原理。

2.1 造表过程

此处仅介绍彩虹表的原理,对Hellman等人对时空折中算法的研究就不做详细介绍了,有兴趣的可以看一下Hellman在1980年发表的论文:A cryptanalytic time-memory trade-off,对理解彩虹表的构造过程会有很大帮助,Philippe Oechslin这人只是在Hellman的基础上做了稍微改进。

彩虹表实质上还是属于字典破解的一种,不过不再是简单的明文—密码的对应,为了节省字典存储空间,彩虹表省去了能通过计算得出的数据,达到这点的关键在于设计出一个函数族Rk(k=1、2、3、4……)将hash密文空间映射回明文的字符空间。

这么说很高端大气,一般没人听的懂,我当时也没懂神马映射、空间啥的,其实就是把hash密文再按照一定的规则转化成普通字符串的转化函数,例如字符串qshud的32位MD5密文e978c6b019ac22a3fd05b14d36621852,最简单的转化处理就是直接截取第一个字符e。因为e也可能是某些人的口令哦,再对字符e进行32位MD5运算得到密文e1671797c52e15f763380b45e841ec32,再取前两位字符e1,继续MD5运算得到cd3dc8b6cffb41e4163dcbd857ca87da,再取前三位cd3……,这时转换的函数族Rk其实就是截取密文的前k位,k=1、2、3、4…….照此法动作若干次(次数不限、本例为8次),得到5626cf5e6f1093c2840a16512f62c3b5,再取前八个字符 5626cf5e.

好了,下面我们就只需要存储字符串qshud和 5626cf5e就齐活了,刚才中间的字符数据e、e1、cd3… d989670就不用管了,它们属于可以通过qshud计算出的数据,不必进行存储,需要的话稍微花些时间计算即可,亲们必须先记着这种只存储首尾字符串的存储方式,下一节查表过程会继续讲到这种存储如何配合查表过程的。

__________我是分割线______________

上一段的例子只是针对MD5算法最简单的一种彩虹表,彩虹表可以处理的hash算法很多,进行的hash运算我们就记为H,函数族Rk(k=1、2、3、4……)都可以自定义,最初开始处理的明文再多选取一些,如图1中第一列的wikipedia、abcdefgh…passwd等,依次计算就得到了图1中的几条字符串链。

2

图1 简化的彩虹表造表流程图

Ps:一条条的链并列的形状就像是彩虹的色带,这就是彩虹链(表)的由来。

图1的例子使用的是自定义的R1、R2、R3函数,注意可不是上例提到的截取前几个字符形式的Rk函数,只是为了便于说明图1中的彩虹表虚构出的,具体转换方式不必深究。我们最后存储的只有wikipedia-rootroot、abcdefgh-myname…passwd-linux23,这就是彩虹表造表的大致过程,为了便于说明,示例比较简单,在实际造表中还需要考虑更多的因素,如最重要的Rk系列函数构造、每一条链的长度、造表需要的空间、存储格式等等。

2.1 查表过程

如果已经有了上文图一中生成的彩虹表,怎样找到hash函数H的一条密文re3xes对应的明文呢?解释这个破解过程需要明确一点:如果re3xes对应的明文属于彩虹表中的某条链,那么就有可能找到其对应的明文,注意这里的“属于某条链”不仅仅是指属于彩虹表的一条链中存放的头尾两个字符串,还包括这两个字符串中的中间数据,图一中中间计算的明文数据secret、jimbo也算是属于彩虹表的第一条链中,同理bernie、zurich属于第二条链,culture、crypto属于最后一条链,虽然彩虹表中只保存了每条链的链首链尾两个字符串,但是这些中间数据是可以根据链首字符串重新计算出来的。来看一下re3xes的破解过程,先猜测下密码re3xes对应的明文数据是某条链中间计算出数据的最后一个,注意第一、二条链的中间数据中的最后一个明文口令jimbo、zurich,依次经过H-R3运算得到保存的链尾字符串rootroot、myname,那么密文re3xes经过R3转换之后得到的数据就是某条链的链尾字符串,这点应该不难理解,如密文v0d$x对应的明文jimbo是第一条链最后一个中间明文数据,则v0d$x经过R3转换得到链尾字符串rootroot,但是密文re3xes经过R3函数转换之后得到的rambo并不是表中保存的任一条链的链尾字符串,这就说明re3xes对应的明文数据并不是某条链中间计算出数据的最后一个,猜测不成立,继续猜测re3xes对应的明文数据可能是某条链中间计算出数据的倒数第二个,同样可以很容易推出re3xes依次经过R2-H-R3转换之后得到的数据是某条链的链尾字符串,计算出re3xes经R2-H-R3转换的结果为linux23,通过搜索彩虹中存放的链尾字符串,得到linux23恰好是最后一条链的链尾,O(∩_∩)O~,到了这一步已经成功了一大半,下面就来根据存储的最后一条链链首的passwd重新计算出密文re3xes对应的明文吧,既然re3xes经R2-H-R3转换之后得到链尾的linux23,那么链首的passwd经H-R1-H运算后的结果culture就是re3xes对应的明文啦,流程图见下图2,小功告成~(≧▽≦)/~。

3

图2彩虹表破解密码示意图

注意:经过这种运算能得到链尾字符串的话只是成功了大半,还是有一小半人品不好的情况额,如果Rk函数设计的不好,存在一个密文字串qshud和re3xes经过R2-H-R3运算后都能得到linux23,那么在破解密文qshud的时候也会得出明文为culture,这种错误的情况称为“假警”,因为实际应用中的数据量都比较大,所以出现这种情况也是很正常的,这是只需要简单计算一下hash验证下即可,从另一个角度看数据量大的同时也能保证彩虹表的明文覆盖率更大,破解效果更好,出现“假警”情况的话就继续查表过程直至找到正确的明文或是找完整个表也没找到明文╮(╯_╰)╭……

ps:彩虹表类似于用大量随机字符串来保证对明文的覆盖率,所以Rk系列函数的构造直接影响能破解密码的范围。

三、 彩虹表的不足与改进

3.1 不足:加盐情况处理不好

现在很多加密方法计算密码Hash时,会在待处理的明文字符串后面加上一串随机的字符串再进行加密操作,开始密码验证时会先在用户输入的密码后加上相同的随机字串进行加密,结果再与存储的Hash进行比较。如明文口令是qshud,则附加上一段随机字符串再计算hash,正确口令的hash存储时也是这样的处理过程,这样做的一个好处就是可以在一定程度上防止彩虹表破译,假设随机字符串为“!@#¥”之类的特殊符号,在造表的过程中设计R函数就需要考虑到映射回这些特殊符号,这就大大增大了造表的空间和难度。

3.2 不足:不能保证100%破解

造表过程中可以很明显的看出,只有明文字符串属于彩虹表的某条链上才能保证这条明文对应的Hash可以被破解,然而设计的再好也不能保证能够破解所有对应的Hash密码,实际中破解率99%以上就已经很实用了。

3.3 改进:破解率100%的雷表

上文已经提到了破解的效率并不能达到100%,而雷表就是对这点的改进,据称可以达到100%的破译,但是涉及的技术会更加复杂。目前这项技术还未被公开,网上也找不到详细的介绍。

3.4 改进:显卡并行编程加速造表过程

利用显卡多核的特点,设计并行的造表算法(CUDA并行编程),一般情况下能将造表速度提至7倍(以我一个很水的实现为起点~囧)或更高。

四、 彩虹表下载及相关工具

免费彩虹表下载:

Free Rainbow Tables:http://www.freerainbowtables.com/en/tables/,提供了LM、NTLM、MD5、SHA1等彩虹表下载。

工具:

Opcrack:有自己独特的彩虹表结构,支持LM,NTLM破解。

RainbowCrack:可以自己造表,支持LM, NTLM, MD5, SHA1, MYSQLSHA1, HALFLMCHALL, NTLMCHALL的破解。

Cain:由Oxid.it开发的一个针对Microsoft操作系统的免费口令恢复工具。号称穷人使用的L0phtcrack……

嗯,我们这次的科普文到这里就结束了,对密码学还有逆向方面比较感兴趣的同学可以通过文章上方的投稿者:qshud这个链接与我进行联系交流。同时未来我将继续在91ri.org发布更多关于密码学及逆向方面的文章,还请大家多多支持哟~

日币奖励:

本文为原创文章,首发91ri.org,根据本站积分规则给予日币奖励共6枚。