当你看到这个标题时,你可能会怀疑。在理论上,破解一个12个字符以上的密码是不可能的。根据安全专家的说法,要破解一个12个字符以上的高强度密码,可能需要17134年的时间。然而,如果我们利用一些现代硬件设备,如“预算”裂解装置,我们就能在相对合理的时间范围内,穷举出像MD5、NTLM、SHA1等这些标准快速散列算法。通常情况下,对于超过8个字符的标准快速散列算法加密的密码,采用暴力破解方式被认为是无法破解的。例如,当我们分析一种语言的特点和不同人的习惯时,我们发现英语单词的平均长度为4.79个字符,而人们通常习惯于使用多个单词组合来构建密码。如果您想了解更多关于破解工具及其使用的内容,请参考Amazon上的Hash Crack。
那么为什么12个字符以上的超强密码容易受到攻击呢?事实上,通常人们在创建大于10个字符以上的密码时,会习惯性地使用一些常见的单词或短语组合来构建。这种行为并不是一个“漏洞”,而是人类思维和行为习惯的自然结果。因此,这个问题将一直存在于我们周围。我当然赞同使用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个最常见的单词列表作为我们的组合字典。这个列表是根据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 dictionary1.txt dictionary2.txt > combined_dict.txt
接下来,我们可以使用Hashcat结合这个新生成的基于规则的字典文件,对大小写修改后的密码ShippingNovember进行爆破。
例如:
hashcat -a 0 -m 0 hash.txt combined_dict.txt
在这个示例中,我们用时28秒成功破解了密码。
3个单词
现在让我们来看看由三个单词随机组成的短语密码,比如”securityobjectivesbulletin”。看起来不错吧?我们刚刚创建了一个新的”google-10000-combined.txt”字典文件,现在我们可以继续使用上述方法,将由两个单词组合的字典与单个单词的字典列表进行组合。
例如:
hashcat -a 1 -m 0 hash.txt google-10000-combined.txt google-10000.txt
如果添加了一些字符变体,由于直接的随机英语单词落在2秒钟内,这可能会更加困难。您是否注意到了一个趋势?
4个单词
接下来,让我们尝试攻击XKCD介绍的使用四个随机英语单词生成的密码,比如”sourceinterfacesgatheredartists”。在这个例子中,我们增加了一个单词,这意味着我们的破解范围更大。它的组合大约有10,000,000,000,000,000种可能性。然而,即使如此,它的强度也会大打折扣,因为我们使用的是MD5散列函数。现在,我将使用Hashcat结合新创建的”combined”字典文件,再次执行组合攻击。
例如:
hashcat -a 1 -m 0 hash.txt combined_dict.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 maskgen.py hashesorg5or6.masks -o hashesorg5or6.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的内置掩码。Rockyou中的掩码已经被分割成更小的块,其大小基于编号不断增加。我将使用最小的.hcmask文件rockyou-1-60,因为它包含较高概率的掩码,非常适用于混合攻击模式。我们还将将其与实际的Rockyou密码配对,可以在Skullsecurity上找到。在配对掩码和字典时,请确保字典的大小不会过大,否则攻击将需要很长时间。个人而言,我喜欢将混合攻击字典的大小控制在500MB以内,甚至更小。
让我们从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
接下来,让我们将新生成的first5dict.txt字典与Hashcat中的rockyou-1-60掩码配对。现在,让我们随机生成一个密码。在这个例子中,我在first5dict.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个字符长度。
例如:
python maskgen.py rockyou.masks -l 12-15 -o rockyou_12-15.hcmask
当成功生成掩码文件后,我们就可以使用rockyou_12-15.hcmask文件对MD5哈希进行爆破了。如果一切顺利,我们将在一天内爆破出结果。
例如:
hashcat -a 3 -m 0 hash.txt rockyou_12-15.hcmask
总结:
通过以上介绍和演示,相信您已经意识到密码的安全性并不仅仅取决于字符的长度。如果您想更好地保护您的账户不被他人窃取,那么您必须摒弃一些坏习惯,例如使用一些常见的单词或短语组合,或者全部采用小写字母或纯数字等来构建密码。这些行为可能会给您的账户带来安全隐患。因此,我强烈建议您尽可能使用密码管理器,例如1Password和Keepass等应用程序。