引言
在本实验中,你将深入探索 John the Ripper 规则引擎的高级功能。John the Ripper 是一个强大的密码破解工具,其规则引擎支持高度定制化和高效的攻击。理解如何创建有效的规则对于最大化其潜力至关重要。你将学习规则链(rule chaining)、创建用于常见转换(如 Leet Speak)的规则、为典型密码模式开发规则、测试复杂的规则集以及优化规则性能。完成本实验后,你将对如何利用 John the Ripper 的规则引擎进行更复杂的密码破解场景有扎实的理解。
理解规则链
在本步骤中,你将学习 John the Ripper 中的规则链。规则链允许你组合多个规则来创建更复杂的转换。当你需要对单词列表(wordlist)条目应用一系列修改时,这尤其有用。
首先,请确保 John the Ripper 已安装。如果未安装,你可以使用 apt 进行安装。
sudo apt update
sudo apt install -y john
接下来,我们将在你的 ~/project 目录下创建一个名为 wordlist.txt 的简单单词列表文件。
echo "password" > ~/project/wordlist.txt
echo "secret" >> ~/project/wordlist.txt
现在,让我们在 ~/project 目录下创建一个名为 chain_rules.rule 的规则文件,以演示基本的规则链。此规则将首先在单词末尾追加 "123",然后将首字母大写。
nano ~/project/chain_rules.rule
向 chain_rules.rule 文件添加以下内容:
: A123 c
:(冒号)表示规则的开始。A123在单词末尾追加 "123"。c将单词的首字母大写。
按 Ctrl+X,然后按 Y,最后按 Enter 保存文件。
现在,让我们使用此规则文件来运行 John the Ripper。我们将使用 --stdout 选项来查看转换后的单词,而无需实际破解密码。
john --wordlist=~/project/wordlist.txt --rules=~/project/chain_rules.rule --stdout
你应该会看到类似以下的输出:
Password123
Secret123
这演示了规则是如何链式应用的:首先应用 A123,然后对结果应用 c。
创建 Leet Speak 转换规则
在本步骤中,你将创建用于执行 Leet Speak 转换的规则。Leet Speak(或称 "1337 Speak")是一种常见的做法,其中字母被替换为看起来相似的数字或符号(例如,'a' 变为 '4','e' 变为 '3','s' 变为 '5')。这是密码中常用的技巧。
我们将在你的 ~/project 目录下创建一个名为 leet_rules.rule 的新规则文件。此文件将包含将常见字母转换为其 Leet Speak 等效项的规则。
nano ~/project/leet_rules.rule
向 leet_rules.rule 文件添加以下内容:
: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5
s/old/new是一个替换规则。它将old的第一次出现替换为new。- 我们正在链式应用多个替换规则来执行多种 Leet Speak 转换。
按 Ctrl+X,然后按 Y,最后按 Enter 保存文件。
现在,让我们使用我们的 wordlist.txt 来测试这些规则。
john --wordlist=~/project/wordlist.txt --rules=~/project/leet_rules.rule --stdout
你应该会看到类似以下的输出:
p4ssw0rd
s3cr3t
这演示了如何创建规则来处理常见的 Leet Speak 变体,这可以显著提高你针对使用这些替换的用户进行密码破解的有效性。
开发常见密码模式规则
在本步骤中,你将开发针对常见密码模式的规则,例如追加年份或常见数字,或者将首字母大写。用户经常使用这些模式来使他们的密码“更强”,但实际上并未增加其熵(entropy)。
让我们在你的 ~/project 目录下创建一个名为 pattern_rules.rule 的新规则文件。此文件将组合几种常见的转换。
nano ~/project/pattern_rules.rule
向 pattern_rules.rule 文件添加以下内容:
: c A2023
: c A!
: c A@
c将首字母大写。A2023追加年份 "2023"。A!追加感叹号。A@追加 at 符号。
每一行代表一个独立的规则。John the Ripper 将独立地将每个规则应用于单词列表中的每个单词。
按 Ctrl+X,然后按 Y,最后按 Enter 保存文件。
现在,让我们使用我们的 wordlist.txt 来测试这些规则。
john --wordlist=~/project/wordlist.txt --rules=~/project/pattern_rules.rule --stdout
你应该会看到类似以下的输出:
Password2023
Secret2023
Password!
Secret!
Password@
Secret@
这演示了如何创建一组规则来覆盖常见的密码模式,从而极大地扩展了你的攻击面,使其超越简单的字典单词。
测试复杂规则集
在本步骤中,你将结合迄今为止学到的概念来测试一个更复杂的规则集。这包括创建一个规则文件,该文件同时包含 Leet Speak 转换和常见的模式添加,展示了如何将多种规则类型结合使用。
让我们在你的 ~/project 目录下创建一个名为 complex_rules.rule 的综合规则文件。此文件将包含 Leet Speak 替换,然后追加常见的数字或符号。
nano ~/project/complex_rules.rule
向 complex_rules.rule 文件添加以下内容:
: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5 A123
: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5 A!
- 第一个规则应用 Leet Speak,然后追加 "123"。
- 第二个规则应用 Leet Speak,然后追加 "!"。
按 Ctrl+X,然后按 Y,最后按 Enter 保存文件。
现在,让我们使用我们的 wordlist.txt 来测试这些复杂规则。
john --wordlist=~/project/wordlist.txt --rules=~/project/complex_rules.rule --stdout
你应该会看到类似以下的输出:
p4ssw0rd123
s3cr3t123
p4ssw0rd!
s3cr3t!
这展示了组合不同规则类型以生成广泛的潜在密码候选词的强大功能,这对于有效的密码破解至关重要。
优化规则性能
在本步骤中,你将学习如何优化规则性能。虽然复杂规则功能强大,但它们也可能非常消耗计算资源。John the Ripper 提供了优化规则应用机制,主要通过理解操作顺序和避免冗余规则来实现。
一种优化方法是确保你的规则尽可能具体,并避免生成不必要的候选词。例如,如果你知道一个密码总是以大写字母开头,那么应用一个将所有字母都大写的规则就是低效的。
考虑前一个步骤中的 complex_rules.rule。每个规则在追加之前都会应用所有 Leet Speak 替换。如果你有许多类似的规则,重复进行替换可能不如一次性应用然后分支效率高。然而,对于简单的情况,在单个规则内进行链式操作通常足够高效。
对于非常大的规则集或特定场景,John the Ripper 允许使用更高级的规则语法和外部规则文件。在本实验中,我们将专注于对优化进行概念性理解。
一种常见的优化技术是过滤你的单词列表,或者使用单独的、更小的规则集来针对特定模式,而不是使用一个庞大、包罗万象的规则集。
让我们通过创建一个规则来演示一个简单的优化概念,该规则仅在单词长度小于特定值时应用,使用 l (length) 规则。这可以防止将复杂规则应用于已经太长而不太可能是常见密码的单词。
在你的 ~/project 目录下创建一个名为 optimized_rules.rule 的新规则文件。
nano ~/project/optimized_rules.rule
向 optimized_rules.rule 文件添加以下内容:
: l<10 s/e/3 A!
l<10表示“仅当单词长度小于 10 个字符时才应用此规则”。s/e/3将 'e' 替换为 '3'。A!追加感叹号。
按 Ctrl+X,然后按 Y,最后按 Enter 保存文件。
现在,让我们使用我们的 wordlist.txt 来测试此规则。
john --wordlist=~/project/wordlist.txt --rules=~/project/optimized_rules.rule --stdout
你应该会看到类似以下的输出:
s3cr3t!
p4ssw0rd!
"password"(8 个字符)和 "secret"(6 个字符)都小于 10 个字符,因此规则适用。如果你有一个像 "superlongpassword"(17 个字符)这样的单词,此规则将不适用于它,从而节省了计算资源。
理解如何根据长度等条件选择性地应用规则,可以通过减少生成不必要候选词的数量来显著提高你的破解尝试的性能。
总结
在本实验中,你对 John the Ripper 的高级规则创建有了全面的了解。你首先探索了规则链式操作,它允许进行顺序转换。然后,你学习了如何为常见的 Leet Speak 转换创建特定规则,并开发了针对普遍密码模式的规则。此外,你还通过组合不同类型的规则练习了测试复杂规则集。最后,你了解了优化规则性能的概念,例如使用条件规则来减少不必要的计算。这些技能对于在实际密码审计和破解场景中有效利用 John the Ripper 至关重要。


