PACK(密码分析与破解工具包)是一套实用程序集合,旨在帮助分析密码列表,通过检测密码的掩码、规则、字符集及其他特征来增强密码破解效率。该工具包生成的输入文件可直接用于 Hashcat 系列密码破解工具。
注意:该工具包本身无法破解密码,而是旨在让密码破解工具的操作更高效。
在开始使用工具包之前,我们需要确定密码列表的选择标准。由于我们希望分析人们创建密码的方式,我们必须尽可能获取大量的泄露密码样本。一个极好的样本是基于 RockYou.com 泄露事件的列表。该列表提供了足够大且多样化的集合,能够很好地反映类似网站(如社交网络)的常用密码。但基于此列表的分析结果可能不适用于具有特定密码策略的组织。因此,选取的样本输入应尽可能接近你的目标。此外,尽量避免使用基于已破解密码的列表,因为这会引入统计偏差——这些规则和掩码反映的是破解者的行为,而非实际用户。
你能进行的最基本分析,是获取所提供列表中密码最常见的长度、字符集及其他特征。在下面的示例中,我们将使用包含约 1400 万个密码的 'rockyou.txt' 文件。使用以下命令行启动 statsgen.py:
$ python statsgen.py rockyou.txt
以下是上述命令的输出:
_
StatsGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected]
[*] 正在分析 [rockyou.txt] 中的密码
[+] 分析进度 100% (14344390/14344390) 的密码
注意:以下统计数据均基于已分析的密码数量,而非总密码数
[*] 长度:
[+] 8: 20% (2966037)
[+] 7: 17% (2506271)
[+] 9: 15% (2191039)
[+] 10: 14% (2013695)
[+] 6: 13% (1947798)
...
[*] 字符集:
[+] loweralphanum: 42% (6074867)
[+] loweralpha: 25% (3726129)
[+] numeric: 16% (2346744)
[+] loweralphaspecialnum: 02% (426353)
[+] upperalphanum: 02% (407431)
...
[*] 密码复杂度:
[+] 数字: 最小值(0) 最大值(255)
[+] 小写: 最小值(0) 最大值(255)
[+] 大写: 最小值(0) 最大值(187)
[+] 特殊字符: 最小值(0) 最大值(255)
[*] 简单掩码:
[+] stringdigit: 37% (5339556)
[+] string: 28% (4115314)
[+] digit: 16% (2346744)
[+] digitstring: 04% (663951)
[+] othermask: 04% (576324)
...
[*] 高级掩码:
[+] ?l?l?l?l?l?l?l?l: 04% (687991)
[+] ?l?l?l?l?l?l: 04% (601152)
[+] ?l?l?l?l?l?l?l: 04% (585013)
[+] ?l?l?l?l?l?l?l?l?l: 03% (516830)
[+] ?d?d?d?d?d?d?d: 03% (487429)
...
注意:你可以使用 --hiderare 标志减少异常值显示,该标志不会显示出现次数低于 1% 的项目。
从以上列表中我们可以立即了解以下信息:
最后一部分“高级掩码”列出了最常出现的掩码,采用 Hashcat 格式。各个符号的含义如下:
?l - 单个小写字母
?u - 单个大写字母
?d - 单个数字
?s - 单个特殊字符
例如,第一个掩码 "?l?l?l?l?l?l?l?l" 将匹配所有小写字母密码。根据样本量,你将能够破解大约 4% 的密码。不过,在生成初始输出后,你可能会想使用过滤器来缩小密码数据的范围。
让我们看看 RockYou 用户在使用 "stringdigit" 简单掩码(字符串后跟数字)时如何选择密码:
$ python statsgen.py ../PACK-0.0.3/archive/rockyou.txt --simplemask stringdigit -q --hiderare
[*] 正在分析 [rockyou.txt] 中的密码
[+] 分析进度 37% (5339556/14344390) 的密码
注意:以下统计数据均基于已分析的密码数量,而非总密码数
[*] 长度:
[+] 8: 23% (1267260)
[+] 7: 18% (981432)
[+] 9: 17% (939971)
[+] 10: 14% (750938)
[+] 6: 11% (618983)
[+] 11: 05% (294869)
[+] 12: 03% (175875)
[+] 13: 01% (103047)
[+] 14: 01% (65958)
[*] 字符集:
[+] loweralphanum: 88% (4720184)
[+] upperalphanum: 06% (325941)
[+] mixedalphanum: 05% (293431)
[*] 密码复杂度:
[+] 数字: 最小值(1) 最大值(252)
[+] 小写: 最小值(0) 最大值(46)
[+] 大写: 最小值(0) 最大值(31)
[+] 特殊字符: 最小值(0) 最大值(0)
[*] 简单掩码:
[+] stringdigit: 100% (5339556)
[*] 高级掩码:
[+] ?l?l?l?l?l?l?d?d: 07% (420318)
[+] ?l?l?l?l?l?d?d: 05% (292306)
[+] ?l?l?l?l?l?l?l?d?d: 05% (273624)
[+] ?l?l?l?l?d?d?d?d: 04% (235360)
[+] ?l?l?l?l?d?d: 04% (215074)
...
输出顶部指明了总密码中被分析的百分比。在本例中,只破解匹配 "stringdigit" 掩码的密码,仅能恢复总集合的大约 37%,与原始输出一致。接着,似乎只有 11% 的这种密码类型使用了小写以外的字符。因此,明智的做法是只关注匹配该掩码的小写字符串。最后,在“高级掩码”部分,我们可以看到大多数 "stringdigit" 密码由字符串后跟两个或四个数字组成。根据从上述输出中获得的信息,我们可以开始形成目标用户密码生成模式的心理图景。
还有几个针对密码长度、掩码和字符集的过滤器可用:
长度: --minlength 和/或 --maxlength
简单掩码: --simplemask [numeric, loweralpha, upperalpha, mixedalpha, loweralphanum 等]
字符集: --charset [digit, string, stringdigit, digitstring, digitstringdigit 等]
注意:同一类别的多个过滤器可以通过逗号分隔列表指定:
--simplemask="stringdigit,digitstring"
虽然“高级掩码”部分只显示匹配超过 1% 密码的模式,但你可以通过以下命令获取并保存与给定字典匹配的完整密码掩码列表:
$ python statsgen.py rockyou.txt -o rockyou.masks
所有密码掩码及其频率将以 CSV 格式保存到指定文件中。当然,你可以提供过滤器,只生成符合指定参数的掩码文件。输出文件可作为下节介绍的 MaskGen 工具的输入。
MaskGen 允许你为 Hashcat 系列密码破解工具制作基于模式的掩码攻击。该工具使用上面 statsgen 通过 '-o' 标志生成的输出,以产生最优的掩码攻击,并按掩码复杂度、掩码出现次数或两者之比(最优指数)排序。
我们用 StatGen 的输出作为参数运行 MaskGen:
$ python maskgen.py rockyou.masks
_
MaskGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected]
[*] 正在分析 [rockyou.masks] 中的掩码
[*] 计算时使用 1,000,000,000 keys/sec 速度。
[*] 按 [optindex] 对掩码排序。
[*] 掩码生成完成:
生成的掩码数量:146578
掩码覆盖率:100% (14344390/14344390)
掩码总运行时间:>1 年
你应该注意以下几点信息:
由于你通常受限于执行和策划攻击的时间,maskgen 允许你指定可用于掩码攻击的时间,并将根据排序模式生成最有效的掩码集合。让我们尝试不同的排序模式和目标时间:
$ python maskgen.py rockyou.masks --targettime 600 --optindex -q
[*] 正在分析 [rockyou.masks] 中的掩码
[*] 计算时使用 1,000,000,000 keys/sec 速度。
[*] 按 [optindex] 对掩码排序。
[!] 超出目标时间。
[*] 掩码生成完成:
生成的掩码数量:779
掩码覆盖率:56% (8116195/14344390)
掩码总运行时间:0:11:36
$ python maskgen.py rockyou.masks --targettime 600 --complexity -q
[*] 正在分析 [rockyou.masks] 中的掩码
[*] 计算时使用 1,000,000,000 keys/sec 速度。
[*] 按 [complexity] 对掩码排序。
[!] 超出目标时间。
[*] 掩码生成完成:
生成的掩码数量:5163
掩码覆盖率:31% (4572346/14344390)
掩码总运行时间:0:10:01
$ python maskgen.py rockyou.masks --targettime 600 --occurrence -q
[*] 正在分析 [rockyou.masks] 中的掩码
[*] 计算时使用 1,000,000,000 keys/sec 速度。
[*] 按 [occurrence] 对掩码排序。
[!] 超出目标时间。
[*] 掩码生成完成:
生成的掩码数量:4
掩码覆盖率:16% (2390986/14344390)
掩码总运行时间:1:34:05
以上所有运行的目标时间均为 600 秒(10 分钟),使用不同的排序模式。根据我们的实验,使用 OptIndex 排序模式生成的掩码可以在大约 10 分钟内破解 56% 的 RockYou 密码。而使用 Occurrence 排序模式生成的掩码覆盖率仅为 16%,并且超出了指定的目标时间超过一小时。
注意:按复杂度排序的掩码在攻击基于策略的列表时可能非常有效。
让我们使用 --showmasks 标志查看 maskgen 在 optindex 模式下生成的某些掩码: