在掩码攻击中使用自定义字符集

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索 Hashcat 的一项高级功能:掩码攻击中的自定义字符集。虽然 Hashcat 内置的字符集(?l?u?d?s)功能强大,但如果你对密码中使用的字符有特定信息,它们可能会效率低下。例如,如果你知道一个密码只包含字符 'a'、'b'、'c'、'1'、'2'、'3',使用标准的 ?l?d 字符集将测试许多不必要的字符。

自定义字符集允许你定义一个精确的字符集,从而显著减小搜索空间并加快破解过程。你将学习如何定义自定义字符集、创建使用它的掩码,以及执行有针对性的攻击来破解遵循独特模式的密码哈希。

理解内置字符集的局限性

在本步骤中,你将了解 Hashcat 的内置字符集以及它们为何并非总是最高效的工具。

Hashcat 在掩码攻击中使用占位符,称为字符集,来表示不同类型的字符:

  • ?l = abcdefghijklmnopqrstuvwxyz
  • ?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • ?d = 0123456789
  • ?s = !"#$%&'()*+,-./:;<=>?@[]^_`{|}~
  • ?a = 以上所有字符的组合

这些对于一般情况很有用,但如果我们知道密码是由一个非常特定、有限的字符集组成的,使用这些广泛的字符集就会效率低下。

首先,让我们检查需要破解的目标哈希。设置脚本已在你的当前目录(~/project)中创建了一个名为 hash.txt 的文件。

查看其内容:

cat hash.txt

你应该会看到以下 MD5 哈希:

2a5c3a657a73613391a8e58f1a43161e

此哈希对应一个 8 个字符的密码,该密码仅由字符 l, a, b, e, x, 1, 2, 3 组成。如果我们使用内置的 ?l?d 字符集,Hashcat 将会浪费时间尝试所有 26 个小写字母和 10 个数字,而不是仅尝试已知的 8 个字符。在下一步中,我们将创建一个自定义字符集来解决这个问题。

使用 --custom-charset1 定义自定义字符集

在本步骤中,你将定义一个自定义字符集,该字符集精确匹配已知存在于密码中的字符。

Hashcat 允许你使用命令行选项 --custom-charset1--custom-charset2--custom-charset3--custom-charset4 来定义最多四个自定义字符集。

在我们的场景中,已知密码仅包含 labex123 集合中的字符。我们可以将其定义为我们的第一个自定义字符集。

让我们构建一个命令来演示其工作原理。我们将使用 --stdout 选项将生成的密码候选输出到屏幕,而不是执行实际攻击。我们还将使用 head 来仅查看前几个结果。

运行以下命令以使用我们的自定义字符集生成 3 个字符的密码:

hashcat --stdout -a 3 --custom-charset1 labex123 ?1?1?1 | head -n 5

让我们分解一下这个命令:

  • --stdout: 将生成的候选密码输出到控制台。
  • -a 3: 指定掩码攻击。
  • --custom-charset1 labex123: 将 ?1 定义为我们的自定义字符集。
  • ?1?1?1: 掩码,它告诉 Hashcat 生成 3 个字符的候选密码,其中每个字符都来自 ?1 中定义的集合。

你将看到类似以下的输出,表明只使用了我们指定的字符:

lll
lla
llb
lle
llx

现在你已经了解了如何为有针对性的攻击定义自定义字符集。

创建一个利用自定义字符集 ?1 的掩码

在本步骤中,你将构建一个使用你在上一步定义的自定义字符集的掩码。

自定义字符集在掩码中通过占位符 ?1?2?3?4 来引用,这些占位符对应于使用的 --custom-charset<N> 选项。由于我们使用了 --custom-charset1,因此将在掩码中使用 ?1

我们知道目标密码是 8 个字符长,并且每个字符都来自我们的自定义集合。因此,正确的掩码是重复八次的 ?1

为了清晰和可重用性,将掩码保存在文件中是一个好习惯。让我们创建一个名为 mask.txt 的文件,并将我们的掩码放入其中。

执行以下命令来创建文件:

echo "?1?1?1?1?1?1?1?1" > mask.txt

现在,验证文件内容以确保其正确性:

cat mask.txt

输出应该与你输入的内容完全一致:

?1?1?1?1?1?1?1?1

准备好掩码文件后,你现在可以启动攻击了。

执行带有自定义字符集的掩码攻击

现在你将整合所有内容,使用你的自定义字符集和掩码文件来启动掩码攻击。

你已经有了 hash.txt 中的哈希值,定义了自定义字符集,并且掩码在 mask.txt 中。让我们组装最终的 Hashcat 命令。

在你的终端中运行以下命令来开始攻击:

hashcat -m 0 -a 3 hash.txt --custom-charset1 labex123 mask.txt

以下是对完整命令的分解:

  • -m 0: 指定哈希类型为 MD5。
  • -a 3: 选择掩码攻击模式。
  • hash.txt: 包含目标哈希的输入文件。
  • --custom-charset1 labex123: 定义我们的自定义字符集 ?1
  • mask.txt: 包含掩码 ?1?1?1?1?1?1?1?1 的文件。

Hashcat 将开始攻击。由于我们的自定义字符集非常具体,密钥空间很小,因此攻击应该会非常快速地完成。你将看到指示进度的输出,最后是 Cracked 状态。

...
Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: 2a5c3a657a73613391a8e58f1a43161e
Time.Started.....: ...
Time.Estimated...: 0 secs (0.00ms)
Guess.Mask.......: ?1?1?1?1?1?1?1?1 [8]
Guess.Charset....: Custom Charset 1: 'labex123', len=8
Speed.#1.........:  ... H/s (0.00ms) @ Accel:1 Loops:1 Thr:1 Vec:1
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 16777216/16777216 (100.00%)
Rejected.........: 0/16777216 (0.00%)
Restore.Point....: 1/1 (100.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: labex123 -> labex123
Hardware.Mon.#1..: Util:  0%

Started: ...
Stopped: ...

攻击已完成且成功。在下一步中,你将验证破解出的密码。

验证破解出的密码是否匹配自定义模式

在最后一步中,你将查看破解出的密码,并确认它是否符合预期的模式。

Hashcat 会自动将成功破解的密码保存到一个名为“potfile”的文件中(因为它将哈希值和密码“装入”其中)。这可以防止将来重复破解相同的哈希值。查看给定哈希文件的破解密码的最简单方法是使用 --show 选项。

执行以下命令来显示 hash.txt 中哈希值的破解密码:

hashcat -m 0 --show hash.txt

此命令指示 Hashcat 在其 potfile 中查找 hash.txt 中的哈希值,并显示相应的明文密码。

输出将清晰简洁:

2a5c3a657a73613391a8e58f1a43161e:labex123

如你所见,破解出的密码是 labex123。请注意,它有 8 个字符长,并且只包含你定义的自定义字符集 labex123 中的字符。这证实了你的目标掩码攻击是成功且高效的。

总结

在本实验中,你学习了使用 Hashcat 进行强大而高效的密码破解技术。

你首先了解了 Hashcat 内置字符集在处理具有特定已知字符集的密码时的局限性。然后,你学习了如何使用 --custom-charset1 选项定义自己的字符集,并在掩码中使用 ?1 来引用它。通过创建掩码文件并启动目标攻击,你能够在几秒钟内破解 MD5 哈希值。

这种使用自定义字符集的方法对于高效的密码审计和恢复至关重要,尤其是在你掌握了密码结构的情报时,它能显著减少攻击所需的时间和计算资源。