看到这个标题,你肯定抱着怀疑的态度。破解 12+ 字符的密码,在理论上这是不可能的。因为按照安全专家的说法,想要破解一个 12+ 字符的高强度密码,大概需要 17134 年。这里我只是说,如果我们利用一些现代硬件设备,如“预算”裂解装置,我们就能在一个相对合理的时间范围内,穷举出像 MD5,NTLM,SHA1等,这些标准快速散列算法。通常,暴力破解这种方式,对于超过 8 个字符的标准快速散列算法加密的密码,一般被认为是无法破解的。
例如当我们对一种语言的特点,和不同人的不同习惯上分析发现,英语单词平均有 4.79 个字符长度,而一般情况下,人们会习惯性的使用多个单词组合来构建密码。有关更多破解工具及其使用的内容请参考 Amazon 上的 Hash Crack。
那么为什么12+字符的超强密码,容易受到攻击呢?事实上,通常人们在创建大于10个字符以上的密码时,都会习惯性的使用一些常见的单词或短语组合来构建。之所以这样做,其实也很容易理解。例如密码 “horsebattery123”比“GFj27ef8%k $ 39” 记起来会更加容易。这已经不是一个“漏洞”的问题,而是人类的思维本能和行为习惯形成的。因此,这个问题也会一直存在我们的周围。我当然赞同,使用XKCD那种漫画随机产生的四个单词作为密码。但是那只适用于非快速散列算法,如bcrypt。在这篇文章,我将演示 Hashcat的组合及混合 两种攻击方式。这些例子将让你看到,攻击者是如何利用那些硬件设备,来对那些所谓的高强度密码,进行有效攻击的。
组合&混合 攻击背景首先快速介绍一下这些攻击方法:
组合攻击:两个字典中的所有单词都相互附加。
例如:
dictionary1.txt dictionary2.txt
pass => password, passpass, passlion
word => wordpass, wordword, wordlion
lion => lionpass, lionword, lionlion
混合攻击:字典攻击,但具有附加/前置一个暴力掩码的能力。
例如:
dictionary.txt ?u?l?l
pass => passAbc, passBcd, passCde
word => wordAbc, wordBcd, wordCde
lion => lionAbc, lionBcd, lionCde
**进一步的解释可以在 Hashcat 的网站上找到。
组合攻击让我们来看看组合攻击这种方式,是如何帮助我们组合英语单词的密码的。在这里,我推荐大家使用Google的10,000 个最常见的单词列表,作为我们组合的字典。这10000个最常见的单词列表,是由Google的Trillion单词库的n-gram 频率分析而确定。 现在让我们使用两个随机选择的英语单词,组合形成一个16个字符的密码,如shippingnovember。
如果这是一个通过 MD5 加密的密码,那么我们该如何使用 Hashcat 的组合攻击这个密码:
例如:
hashcat -a 1 -m 0 hash.txt google-10000.txt google-10000.txt
通过使 Hashcat 将该列表中的每个字词彼此组合,并结合一些性能较好的硬件设备,密码在不到 1 秒内就被破解出来。目前这种破解方法并不过时,它对那些中等较慢的哈希类型效果依然不错。
在这里也许有人会说,“我用的shippingnovember全部为小写字母,因此能成功破解出来,但是如果随意做个改动,例如增加特殊字符,字母大小写变化等,如:ShippingNovember这个形式就不一定能成功。那么,就让我们来快速测试一下吧。首先我使用Hashcat的“combinator.bin” 将google的字典列表合并成一个单独的字典。
例如:
combinator.bin google-10000.txt google-10000.txt > google-10000-combined.txt
接着我们就可以使用Hashcat结合这个新生成的,基于规则的字典文件,爆破修改大小写后密码 ShippingNovember:
例如:
hashcat -a 0 -m 0 hash.txt google-10000-combined.txt -r best64.rule
这里我们用时 28 秒,成功爆破!
3 个单词现在让我们来看看,由三个单词随机组成的短语密码,如“securityobjectivesbulletin”…看起来不错吧? 上面我们刚刚创建了新的 “google-10000-combined.txt” 字典文件,下面我们可以继续使用上面的方式,将由两个单词组合的字典同单个单词的字典列表进行组合:
例如:
hashcat -a 1 -m 0 hash.txt google-10000-combined.txt google-10000.txt
如果添加了一些字符变体,但是因为你可以看到直接的随机英语单词落在2秒钟,这可能会有点更困难。 你在这里看到一个趋势吗?
理论上来说我们添加了字符数量,破解起来也应该会更加困难耗时,但这里我们只用了2秒左右时间,就成功破解出来了!在这里,你看到什么趋势了吗?
4 个单词接着,让我们去尝试攻击下XKCD介绍的使用4个随机英语单词,来生成一个新密码“sourceinterfacesgatheredartists”。在这里我们多增加了一个单词,这也意味着我们的破解范围更加庞大。它的组合大概在键盘有10,000,000,000,000,000多种的可能性。但是即便如此,它的强度也会大打折扣。因为,在这里我们使用的为MD5散列函数。下面,我将使用 Hashcat 并结合新创建的 “combined” 字典,再次执行组合攻击:
例如:
hashcat -a 1 -m 0 hash.txt google-10000-combined.txt google-10000-combined.txt
这个破解尝试,可能需要4天左右的时间才能完成。但幸运的是,我们发现我们只用了5小时35分钟就成功爆破了出来。如果对这个密码做简单的修改,例如:添加数字或特殊字符,都会使这个密码超出我们的范围,但是再次随机的通用词是不匹配的。
混合攻击Google-10000 + 掩码对于第一个示例,我将使用之前在组合攻击演示中的 google-10000.txt 字典表,来作为我们爆破的基本单词列表。然后我将使用 PACK(密码分析和破解工具包)和来自weakpass.com网站上的hashesorg251015.txt字典做演示。
我之所以选择使用hashesorg字典,是因为它的效率相对较高评级为 65.9,并且字典的体积也相对较小。我们需要做的是分析hashesorg的数据集,并根据一定的字符长度,来创建基于最流行的密码模式的掩码。这些掩码将被 附加/添加 到我们的google-10000.txt单词列表,并形成一个有效的混合攻击。
PACK 示例生成5-6个字符长度的混合掩码密码,并输出到掩码文件。(注意这可能需要等待一段时间)
python statsgen.py hashesorg251015.txt –minlength=5 –maxlength=6 –hiderare -o hashesorg_5or6.masks
接着,让我们将生成的掩码文件格式,转换为 Hashcat 可以无缝使用的 .hcmasks 格式文件。
PACK 示例python maskgen.py hashesorg_5or6.masks –optindex -o hashesorg_5or6.hcmask
现在我们就可以使用Hashcat中的攻击模式6,并结合新创建的hashesorg掩码文件,来进行混合攻击了。这将启动一个有序的攻击,从第一个掩码开始,并沿着列表向下逐一尝试。有的攻击可能会进行的很快,有些则可能需要一段时间。为了达到我们测试的目的,我们这里将使用一个随机密码 “environmentsqaz472” 我们知道最终我们将会成功爆破!
例如:
hashcat -a 6 -m 0 hash.txt google-1000.txt hashesorg_5or6.hcmask
这次攻击花了将近 20 分钟的时间。前面的格式转换占用了我们大部分时间,而从攻击开始到成功爆破,却只用 14 秒。
Rockyou + Rockyou-1-60.hcmask现在,让我们使用从 Rockyou 密码数据集派生的 Hashcat 的内置掩码。 Hashcat 中的 rockyou 掩码,已经被分割成更小的块,其大小基于编号而不断增加。我将使用最小的 .hcmask 文件 rockyou-1-60,因为它包含较高的概率掩码,非常适用于这种混合攻击模式。我们还将把这个与实际的 Rockyou 密码配对,可以在 Skullsecurity 上找到。当你将掩码与字典配对时,请务必确保字典体积不会过于庞大,否则你的攻击将会话费很长的时间。就我个人而言,我喜欢将我的混合攻击字典大小控制在 500M 以内,甚至更小。
让我们从 Rockyou 字典随机抽取密码 “sophia **!”,然后我们再添加一个任意日期 “1996”,密这样就产生了一个码 1996sophia **! 前面好比是用户名,后面则是出生年份。下面我们就可以开始尝试攻击了,这次攻击我将把 rockyou-1-60 数据集中顺序包含的掩码列表,附加给 Rockyou 字典中包含的所有密码。
例如:
hashcat -a 7 -m 0 hash.txt rockyou-1-60.hcmask rockyou.txt
这种攻击,用不到几分钟就会命中一个?d?d?d?d 的掩码。这也是为了演示目的,但其充分展示了混合攻击的攻击过程及威力。rockyou-1-60.hcmask 中共包含了 836 个不同的掩码,如果你觉得依然不够,则 Hashcat 将会自动包含 rockyou 数据集中的的所有掩码。
Cut First 5 Chars + 掩码让我们来创建一个自己的字典和掩码,来配合我们的混合攻击。在文章开头我们已经知道了,平均英语单词为 4.79 个字符 长。因此,我们创建的字典将最多包含 5 个字符长度。在这个例子中,我们将再次使用 rockyou.txt 字典。我们将使用 cut 命令,将截取字典中的前 5 个字符,并按顺序将其追加到一个名为 first5_dict.txt 的文件内。根据你硬件的性能,将决定你字典的生成时间。你可能会注意到,这个新生成的字典文件体积非常的小,只有 18MB。但是对于非快速散列算法,这是一个非常完美的字典文件。
例如:
cut -c 1-5 rockyou.txt | sort -u > first5_dict.txt
下面,让我们将新生成的 first5_dict.txt 字典与 Hashcat 中的 rockyou-1-60 掩码配对。现在,我们来随机生成一个密码。这里我在 first5_dict.txt 字典文件中,随机选择了 Alty5 和 随机数字 9402847 的组合,来作为我的密码,即 Alty59402847 。
例如:
hashcat -a 6 -m 0 hash.txt first5_dict.txt rockyou-1-60.hcmask
这种攻击,对于那些喜欢使用相同的基本单词或数字作为密码,并且将账户作为附加或预置 “随机” 码的用户,尤为有效!从结果我们可以看到,在30分钟内,我们就成功破解出了密码。
直接通过掩码攻击 12+ 字符密码让我们再次使用 rockyou.txt 字典,来作为例子生成这些掩码。但在此之前,先让我们先来测试下我们的机器,对 md5 哈希爆破的速度。
例如(MD5):
hashcat -b -m 0
从以上测试结果得知,我们的机器破解速度为 760亿每秒(76,000,000,000 c / s),让我们使用 PACK 从 rockyou.txt 字典,来创建新的掩码。
例如:
python statsgen.py rockyou.txt -o rockyou.masks
下面我们就可以来生成我们的 Hashcat hcmask 文件了,我们设定攻击速度为 1 天(86400秒),攻击范围涵盖 12-15 的字符长度。
例如:
pythong maskgen.py rockyou.masks –optindex –minlength=12 –maxlength=15 –targettime=86400 –pps=76000000000 -o rockyou_12-15.hcmask
当成功生成掩码文件后,我们就可以使用 rockyou_12-15.hcmask 文件,来对md5哈希进行爆破了。如果顺利的话,那么我们将会在一天内爆破出结果。
例如:
hashcat -a 3 -m 0 hash.txt rockyou_12-15.hcmask
总结:通过以上的介绍及演示,相信你已经意识到,密码的安全与否,并不是单单取决于字符的长短的。如果想要更好的保护你的账户,不被他人窃取。那么,你必须摒弃一些你的坏习惯。例如:使用一些常见的单词或短语组合,或者全部采用小写字母或纯数字等来构建你的密码。这些都有可能,给你账号带来安全隐患!因此,在这里我强烈建议大家,尽可能的使用一些密码管理器,例如像 1Password 和 Keepass 这类的应用。