引言
字典攻击是一种通过系统地尝试列表(字典)中的每个单词作为密码来破解受密码保护的系统的方法。然而,这种基本方法通常会失败,因为用户很少使用简单的字典单词作为密码。他们经常会添加数字、符号或更改大小写以满足复杂性要求。
这时,“变体规则”(mangling rules)就变得非常强大。变体规则是一组指令,用于在测试字典中的单词之前对其进行转换。例如,一条规则可以附加一个数字、将首字母大写,或者用符号替换字母(例如将 'a' 替换为 '@')。
在本实验(lab)中,你将使用流行的密码破解工具 John the Ripper (JtR) 来亲身体验。你将首先尝试标准的字典攻击,并看到它失败。然后,你将应用一组变体规则来增强攻击,并成功破解更复杂的密码。
理解变体规则的威力
在本步骤中,你将首先执行一次标准的字典攻击,以了解其局限性。我们准备了一个名为 shadow.txt 的文件,其中包含用户的哈希密码,以及一个名为 wordlist.txt 的文件,其中包含密码的潜在基础单词。
让我们使用 wordlist 对哈希文件运行 John the Ripper。此命令指示 john 尝试 wordlist.txt 中的每个单词作为密码。
john --wordlist=wordlist.txt shadow.txt
你将看到类似以下的输出,表明攻击正在进行。
Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2])
Cost 1 (algorithm [1:descrypt]...[3:DES]) is 50400 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:00 DONE (2023-10-27 10:30) 0g/s 1845Kp/s 1845Kc/s 1845KC/s secdec..secret
Session completed
请注意最后一条消息:“Session completed”。John the Ripper 尝试了单词 "secret" 及其常见变体,但未能破解密码。这是因为实际密码比简单的字典单词更复杂。这证明了需要更高级的技术。
定位 /rules/ 目录中的内置规则文件
在本步骤中,我们将探索 John the Ripper 将其强大的变体规则存储在哪里。在大多数 Linux 系统(包括本系统)上,规则并不存在于单独的 /rules/ 目录中,而是定义在主配置文件 john.conf 中。
让我们列出 /etc/john/ 目录的内容来查找此配置文件。
ls -l /etc/john/
你将在输出中看到 john.conf 文件。
total 148
-rw-r--r-- 1 root root 148233 Jan 20 2022 john.conf
这个 john.conf 文件包含许多预定义的规则集,例如 KoreLogic、best64 和 all。这些规则集是单个变体指令的集合,可以应用于字典攻击。在下一步中,我们将更仔细地检查其中一个规则集。
选择一个常用的规则文件,例如 best64.rule
在本步骤中,你将检查一组特定的规则。为了方便你,我们已将 john.conf 中一个流行且有效的规则集 best64 提取出来,并将其保存在你当前的项目目录(~/project)中,文件名为 best64.rule。
让我们检查该文件的前 10 行,以了解规则的格式。使用 head 命令:
head -n 10 best64.rule
你将看到类似以下的输出:
#
## best64.rule, a selection of the best 64 rules from the over 14,000
## rules in all.rule.
#
## Rule syntax:
## http://www.openwall.com/john/doc/RULES.shtml
#
## The following rules are commented out because they are slow.
#
:
l
u
以 # 开头的行是注释。像 :, l, 和 u 这样的单字符行是实际的规则。
:是一个无操作(no-op)规则,表示“按原样尝试单词”。l将单词转换为小写。u将单词转换为大写。
在文件的更下方,你会找到更复杂的规则,例如 c(首字母大写)和 $1(附加数字 '1')。这些简单的转换极大地增加了密码候选的数量。
使用 -r 标志将规则文件应用于字典攻击
现在是时候释放变体规则的威力了。在本步骤中,你将再次运行字典攻击,但这次你将指示 John the Ripper 使用 best64.rule 文件。
你可以通过向命令添加 -r 标志(--rules 的缩写)来实现这一点。这告诉 john 将指定文件中的每个规则应用于 wordlist.txt 中的每个单词。
在你的终端中执行以下命令:
john --wordlist=wordlist.txt -r=./best64.rule shadow.txt
这次,攻击应该会很快成功。输出将有所不同。
Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2])
Cost 1 (algorithm [1:descrypt]...[3:DES]) is 50400 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Secret123 (testuser)
1g 0:00:00:00 DONE (2023-10-27 10:35) 10.00g/s 61538p/s 61538c/s 61538C/s Secret12..Secret123
Use the "--show" option to display all of the cracked passwords reliably
Session completed
成功!Secret123 (testuser) 这一行表明密码已被破解。John the Ripper 通过将 best64.rule 中的规则应用于单词 "secret" 来找到了正确的密码。
比较有规则和无规则的攻击结果
在最后一步,你将正式查看破解的密码,并反思规则所带来的差异。
尽管密码在上一阶段的输出中已经显示,但查看给定哈希文件所有已破解密码的标准方法是使用 --show 标志。
运行以下命令:
john --show shadow.txt
此命令将显示 John 已成功破解 shadow.txt 文件所有密码。
testuser:Secret123:17119:0:99999:7:::
1 password hash cracked, 0 left
输出清晰地显示了 testuser:Secret123。这证实了破解的密码。
通过比较结果,结论很明确:
- 无规则(步骤 1): 攻击失败,因为“secret”不是密码。
- 有规则(步骤 4): 攻击成功。John 取单词“secret”,应用首字母大写规则得到“Secret”,然后应用附加数字规则得到“Secret123”,这匹配成功。
这表明变体规则不仅仅是一个有用的功能;它们对于使字典攻击能够有效应对现实世界的密码习惯至关重要。
总结
在本实验中,你体验了简单字典攻击与增强规则字典攻击之间的实际区别。
你学会了如何:
- 使用 John the Ripper 运行基本的字典攻击并了解其局限性。
- 理解变体规则的概念并找到它们的存储位置。
- 检查规则文件的结构。
- 使用
-r标志将规则集应用于字典攻击,从而大大提高其有效性。 - 查看破解的密码并确认基于规则的攻击的成功。
通过将简单的字典单词转换为数千种潜在的变体,变体规则成为任何密码审计师或安全专业人员工具箱中的基本工具。


