介绍
Hashcat 是一个世界知名的密码恢复工具,能够以惊人的速度破解各种各样的哈希(hash)。虽然字典攻击很常见,但只有当密码存在于给定的词典(wordlist)中时,它们才有效。纯粹的暴力破解(brute-force attack),即尝试所有可能的字符组合,通常慢到不切实际。
这就是掩码攻击(mask attack)发挥作用的地方。掩码攻击是一种高效的暴力破解形式,当你对密码的结构有所了解时,就会使用它。例如,你可能知道密码的长度,或者它以大写字母开头并以数字结尾。
在这个 Lab 中,你将学习使用 Hashcat 执行掩码攻击的基础知识。你将从理解概念开始,学习如何使用字符集(character sets)来构建掩码,并将这些知识应用于破解具有已知模式的密码哈希。
理解掩码攻击(-a 3)的概念
在这一步,你将学习 Hashcat 中掩码攻击的基本概念。掩码攻击模式使用 -a 3 选项来指定。此模式告诉 Hashcat 根据你定义的模式("mask")来生成密码候选(password candidates)。
这与使用预制单词列表的字典攻击(-a 0)不同。掩码攻击会即时(on the fly)创建自己的候选。
让我们看看一个掩码是如何生成候选的。我们可以使用 --stdout 选项将生成的密码打印到屏幕上,而不是尝试破解哈希。我们将使用 ?d 作为数字(0-9)的简单占位符。
运行以下命令来生成所有可能的 3 位数字:
hashcat -a 3 ?d?d?d --stdout
Hashcat 将生成所有可能的 3 位组合。请注意,由于 Hashcat 的优化算法,输出顺序可能看起来是随机的,但它会生成从 000 到 999 的所有组合。
...
476
576
876
976
...
这展示了核心思想:掩码 ?d?d?d 充当一个模板,Hashcat 会用指定字符集中的所有可能组合系统地填充它。
学习内置字符集(?l, ?u, ?d, ?s)
在这一步中,你将学习掩码(masks)的基本构建块:内置字符集。它们是代表特定字符组的占位符。
Hashcat 提供了一些方便的内置字符集:
| 占位符 | 字符集 | 描述 |
|---|---|---|
?l |
abcdefghijklmnopqrstuvwxyz |
所有小写字母 |
?u |
ABCDEFGHIJKLMNOPQRSTUVWXYZ |
所有大写字母 |
?d |
0123456789 |
所有数字 |
?s |
!"#$%&'()*+,-./:;<=>?@[\]^_{}~ |
所有特殊字符(符号) |
?a |
?l?u?d?s |
所有可能的字符 |
你可以组合这些占位符来创建复杂的掩码。掩码的长度直接决定了生成的密码候选的长度。
让我们尝试为一个由一个大写字母后跟一个数字组成的密码生成候选。对应的掩码将是 ?u?d。
再次使用 --stdout 选项来查看输出:
hashcat -a 3 ?u?d --stdout
Hashcat 将生成一个大写字母后跟一个数字的所有组合。请注意,由于 Hashcat 的优化算法,输出顺序可能看起来是随机的,但它会生成从 A0 到 Z9 的所有组合。
...
B4
C7
D2
...
通过组合这些字符集,你可以为你要测试的密码定义一个精确的模式。
对 3 位 PIN 码(NTLM 哈希)发起掩码攻击
在这一步,你将把所学知识应用于一个实际场景:破解一个 3 位 PIN 码。我们有一个名为 pin_hash.txt 的文件,其中包含一个 NTLM 格式的密码哈希。我们怀疑原始密码是一个 3 位数字。
首先,我们查看哈希文件的内容:
cat pin_hash.txt
你将看到 NTLM 哈希:
D2063C28444B9B742B9B89C282395EBF
要破解它,我们需要告诉 Hashcat 三件事:
- 攻击模式是掩码攻击(
-a 3)。 - 哈希类型是 NTLM(
-m 1000)。 - 3 位 PIN 码的掩码是
?d?d?d。
现在,将这些组合成一个命令来启动攻击:
hashcat -a 3 -m 1000 pin_hash.txt ?d?d?d
Hashcat 将启动,由于密钥空间(keyspace)(000-999)非常小,它几乎会立即找到密码。
...
D2063C28444B9B742B9B89C282395EBF:137
...
Status...........: Cracked
...
Hashcat 已成功恢复密码:137。一旦密码被破解,Hashcat 会将其保存到一个称为 "potfile" 的文件中。你可以使用 --show 选项查看此哈希类型的所有已破解密码:
hashcat -m 1000 pin_hash.txt --show
输出:
D2063C28444B9B742B9B89C282395EBF:137
为已知密码模式创建自定义掩码
在这一步,你将处理一个更复杂的密码。想象一家公司的密码策略是:“密码必须恰好由 5 个小写字母组成。”一个示例密码将是 labex。
我们有一个包含此类密码 NTLM 哈希的文件 pattern_hash.txt。
首先,我们将密码策略翻译成 Hashcat 掩码:
- 所有 5 个字符都必须是小写字母:
?l?l?l?l?l
这给了我们最终的掩码:?l?l?l?l?l。
现在,我们使用这个掩码来破解 pattern_hash.txt 中的哈希。命令与上一步类似,但使用了我们的新掩码。
hashcat -a 3 -m 1000 pattern_hash.txt ?l?l?l?l?l
Hashcat 将开始测试所有符合此特定模式的组合。这比尝试所有 5 个字符组合的纯暴力破解攻击要高效得多。短时间后,它将找到密码。
...
2BF7D33EC706798E0308F5DF34BC7D2F:labex
...
Status...........: Cracked
...
你已通过创建精确匹配 5 个小写字母所需策略的自定义掩码,成功破解了一个具有特定模式的密码。
比较掩码攻击与字典攻击的性能
在最后这一步,我们将比较你刚刚执行的掩码攻击与传统的字典攻击,以了解它们各自的优势。
如果密码存在于词典中,字典攻击 (-a 0) 会非常快。我们有一个名为 dict.txt 的小词典文件,其中包含上一步中的密码。
让我们对 pattern_hash.txt 运行字典攻击:
hashcat -a 0 -m 1000 pattern_hash.txt dict.txt
因为 labex 在 dict.txt 中,Hashcat 几乎瞬间就找到了它。
hashcat (v6.2.5) starting
OpenCL API (OpenCL 2.0 pocl 1.8 Linux, None+Asserts, RELOC, LLVM 11.1.0, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=====================================================================================================================================
* Device #1: pthread-Intel(R) Xeon(R) Platinum 8575C, 6808/13680 MB (2048 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
INFO: All hashes found in potfile! Use --show to display them.
Started: Sat Oct 11 16:05:20 2025
Stopped: Sat Oct 11 16:05:20 2025
Hashcat 告知我们哈希值已被找到并存储在 potfile 中。要查看破解出的密码,我们可以使用 --show 选项:
hashcat -a 0 -m 1000 pattern_hash.txt dict.txt --show
输出:
2bf7d33ec706798e0308f5df34bc7d2f:labex
那么,掩码攻击的优势在哪里呢?字典攻击仅当确切的密码存在于词典中时才会成功。如果密码是 testx,而它不在我们的词典中,那么攻击就会失败。
然而,第四步中的掩码攻击 (?l?l?l?l?l) 仍然会成功,因为它系统地生成并测试所有符合该模式的密码,而不管它们是否在词典中。它会测试 labex、testx、hello 等等。
结论:
- 字典攻击 (
-a 0): 最适合破解常见密码或当你拥有高质量、有针对性的词典时。它速度快,但受限于词典的内容。 - 掩码攻击 (
-a 3): 当你知道密码的结构或模式(例如,来自已知的密码策略)时最有效。它比字典攻击更全面,并且比纯粹的暴力破解攻击效率高得多。
总结
在这个实验中,你获得了关于 Hashcat 最强大功能之一:掩码攻击的实践经验。
你学习了:
- 掩码攻击(
-a 3)的基本概念,以及它如何根据模式生成密码候选。 - 如何使用 Hashcat 内置的字符集(
?l、?u、?d、?s)来构建掩码。 - 如何应用一个简单的掩码来破解一个 3 位 PIN 码。
- 如何根据已知的密码策略(5 个小写字母)创建一个自定义掩码,以破解具有特定模式的密码。
- 与标准字典攻击相比,使用掩码攻击的关键区别和战略优势。
掩码攻击是任何安全专业人员的一项基本技能,它在字典攻击的速度和纯粹暴力破解攻击的全面性之间提供了完美的平衡。



