为单词列表应用规则以进行高级破解

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索 John the Ripper (JtR) 强大的基于规则的破解能力。虽然简单的字典攻击很有效,但现实世界中的密码通常包含变体,例如大小写变化、数字附加或特殊字符。JtR 的规则引擎允许你定义复杂的转换规则,应用于字典中的单词,从而显著提高破解不在字典中的密码的成功率。你将学习 JtR 规则的基本语法,创建自己的自定义规则,并将它们应用于字典,以观察其效果。

理解 John the Ripper 规则语法

在此步骤中,你将学习 John the Ripper (JtR) 规则的基本语法。JtR 规则定义在配置文件中,通常是 john.conf,或者在简单情况下可以直接通过命令行传递。每条规则都是一系列单字符命令,用于修改单词。

常见的规则命令包括:

  • c: 将首字母大写。
  • C: 将所有字母大写。
  • l: 将首字母小写。
  • L: 将所有字母小写。
  • t: 切换首字母的大小写。
  • T: 切换所有字母的大小写。
  • p<N>: 在前面添加字符 <N>
  • a<N>: 在后面添加字符 <N>
  • s<old><new>: 将 <old> 的第一次出现替换为 <new>
  • S<old><new>: 将 <old> 的所有出现替换为 <new>
  • x<N>: 从开头提取长度为 N 的子字符串。
  • z<N>: 从结尾提取长度为 N 的子字符串。
  • D: 删除首字符。
  • M: 删除尾字符。
  • r: 反转单词。

让我们首先查看默认的 john.conf 文件,了解一些内置规则的示例。

使用 nano 打开 john.conf 文件:

nano /etc/john/john.conf

滚动浏览文件,找到 [List.Rules:Wordlist] 部分。你会在那里看到定义的各种规则集。例如,你可能会看到像 c(首字母大写)或 a[0-9](附加一个数字)这样的规则。

Ctrl+X 退出 nano

现在,让我们尝试直接从命令行使用 JtR 的 --stdout 选项来应用一个简单的规则。--stdout 选项会将规则应用于字典,并将结果打印到标准输出,而无需尝试破解哈希。这对于测试规则非常有用。

执行以下命令,将 c(首字母大写)规则应用于你的 wordlist.txt

john --wordlist=~/project/wordlist.txt --rules=single --stdout

你应该会看到 wordlist.txt 中的单词,其首字母被大写了。例如,“password”变成了“Password”。

Password
Secret
Labex
Test

这演示了一个简单的规则如何转换单词。在接下来的步骤中,你将创建和组合更复杂的规则。

创建一个简单的规则用于大小写转换

在此步骤中,你将创建一个自定义规则文件来应用大小写转换规则。虽然 JtR 中的 single 规则集包含基本的大小写转换,但创建自己的规则文件可以让你拥有更多控制权,并实现更具体的转换。

首先,在你的 ~/project 目录中创建一个名为 my_rules.rule 的新文件。此文件将包含你的自定义规则。

nano ~/project/my_rules.rule

将以下行添加到 my_rules.rule 文件中。这些规则将:

  • c: 将首字母大写。
  • C: 将所有字母大写。
  • t: 切换首字母的大小写(例如,“password” -> “Password”,“Password” -> “password”)。
c
C
t

Ctrl+O 保存文件,然后按 Enter 确认,最后按 Ctrl+X 退出 nano

现在,使用 --rules 选项将这些自定义规则应用于你的 wordlist.txt,并指定你的新规则文件。

john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout

观察输出。你应该会看到 wordlist.txt 中的每个单词都经过了你定义的每个规则的转换。例如,“password”将会显示为“Password”、“PASSWORD”和“Password”(由于 t 规则应用于原始的“password”)。

Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test

这演示了如何定义和使用自定义规则文件。文件中的每条规则都会按顺序应用于字典中的每个单词。

应用数字追加规则

在此步骤中,你将学习如何使用 JtR 规则向单词追加数字。追加数字是非常常见的密码变体,JtR 提供了强大的命令来高效地生成这些变体。

a<N> 命令用于在末尾添加字符 <N>。要追加数字,你可以使用字符范围,如 a[0-9] 来追加一个从 0 到 9 的单个数字。你也可以将此与其他规则结合使用。

让我们向 my_rules.rule 添加规则来追加数字。再次打开你的规则文件:

nano ~/project/my_rules.rule

将以下行添加到文件末尾。这些规则将:

  • a[0-9]: 在单词末尾追加一个数字(0-9)。
  • a[0-9][0-9]: 在单词末尾追加两个数字(00-99)。此规则将为每个单词生成 100 种变体。
a[0-9]
a[0-9][0-9]

保存文件(Ctrl+OEnter)并退出 nanoCtrl+X)。

现在,将这些更新的规则应用于你的 wordlist.txt。由于 a[0-9][0-9] 会生成大量变体,我们将使用 head 来限制输出,以便演示。

john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout | head -n 50

你将看到类似“password0”、“password1”……“password00”、“password01”等的单词。head -n 50 命令将输出限制为前 50 行,因为完整的输出会非常长。

Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test
password0
password1
password2
password3
password4
password5
password6
password7
password8
password9
secret0
secret1
secret2
secret3
secret4
secret5
secret6
secret7
secret8
secret9
labex0
labex1
labex2
labex3
labex4
labex5
labex6
labex7
labex8
labex9
test0
test1
test2
test3
test4
test5

这展示了如何有效地生成数字追加变体,这对于破解常见密码模式至关重要。

组合多个规则以实现复杂转换

在此步骤中,你将组合多个规则命令来创建更复杂的密码转换。JtR 允许你在单行上链接规则命令,将它们按顺序应用于每个单词。

让我们创建一个规则,该规则将首字母大写,然后追加一个数字。

再次打开你的 my_rules.rule 文件:

nano ~/project/my_rules.rule

将以下规则添加到文件末尾。此规则 ca[0-9] 意味着:

  1. c: 将首字母大写。
  2. a[0-9]: 追加一个数字(0-9)。
ca[0-9]

保存文件(Ctrl+OEnter)并退出 nanoCtrl+X)。

现在,将这些更新的规则应用于你的 wordlist.txt 并观察输出。同样,我们将使用 head 来限制输出。

john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout | head -n 50

你应该会看到类似“Password0”、“Password1”、“Secret0”、“Secret1”等的变体。

Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test
password0
password1
password2
password3
password4
password5
password6
password7
password8
password9
secret0
secret1
secret2
secret3
secret4
secret5
secret6
secret7
secret8
secret9
labex0
labex1
labex2
labex3
labex4
labex5
labex6
labexex7
labex8
labex9
test0
test1
test2
test3
test4
test5
Password0
Password1
Password2
Password3
Password4
Password5
Password6
Password7
Password8
Password9

这展示了组合规则的强大功能。通过链接命令,你可以创建非常具体且有效的规则集。例如,s@a!ca[0-9] 将会用 '!' 替换 '@',将首字母大写,然后追加一个数字。

在单词列表上测试自定义规则

在最后一步中,你将使用自定义规则来尝试破解一个模拟哈希。这将模拟一个真实的密码破解场景。

回想一下,在设置中,一个针对单词 "password" 的哈希已被创建并保存在 ~/project/hashes.txt 中。该哈希是 user1:5f4dcc3b5aa765d61d8327deb882cf99("password" 的 MD5 哈希)。

首先,让我们确保你的 my_rules.rule 文件包含一个能够生成 "password" 或其变体的规则,该变体能匹配哈希。在本例中,我们将假设哈希是针对原始单词 "password" 的。如果你有一个针对 "Password0" 的哈希,那么你的 ca[0-9] 规则将很有用。

本次演示中,我们将使用原始的 wordlist.txt 和你的 my_rules.rule 来尝试破解哈希。

使用你的哈希文件、单词列表和自定义规则执行 John the Ripper:

john ~/project/hashes.txt --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule

John the Ripper 将开始处理单词列表,应用你的规则,并将生成的单词与哈希进行比较。如果找到匹配项,它将显示已破解的密码。

你应该会看到类似以下的输出,表明密码已被破解:

Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ [MD5 SSSP])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
1g 0:00:00:00 DONE (2023-10-27 10:30) 100% (ETA: 00:00:00)
Session completed.

要再次查看已破解的密码,你可以使用 --show 选项:

john --show ~/project/hashes.txt

此命令将显示 JtR 已成功破解并存储在其 pot 文件中的任何密码。

user1:password

1 password hash cracked, 0 left

最后一步展示了自定义规则在密码破解中的实际应用。通过智能地构建规则,你可以显著提高字典攻击针对各种密码模式的有效性。

总结

在本实验中,你已成功学会如何利用 John the Ripper 强大的规则引擎进行高级密码破解。你首先了解了 JtR 规则的基本语法,包括用于大写和切换大小写的命令。然后,你创建了自己的自定义规则文件,并添加了用于追加数字的规则,这是常见的密码变体。最后,你组合了多个规则命令来创建更复杂的转换,并将自定义规则应用于破解一个模拟真实场景的模拟哈希。这次实践经验使你掌握了定义和应用复杂规则集的方法,显著增强了你破解不在标准单词列表中的密码的能力。