排查常见的 John the Ripper 问题

Kali LinuxBeginner
立即练习

引言

John the Ripper (JtR) 是一个强大且广泛使用的开源密码破解工具。虽然它非常有效,但用户,尤其是初学者,可能会遇到一些常见的阻碍其进展的问题。这些问题可能包括难以理解的错误消息或性能下降。

在本实验中,你将学习如何排查使用 John the Ripper 时遇到的一些最常见的问题。我们将涵盖诸如“No hashes loaded”(未加载哈希)之类的错误,处理无效的哈希格式,解决性能瓶颈,处理损坏的会话文件,以及学习在遇到困难时在哪里寻求帮助。通过本实验的结束,你将能更有效地诊断和解决 JtR 问题。

解决“No hashes loaded”错误

在此步骤中,我们将排查 John the Ripper 中最常见的错误之一:“No password hashes loaded”(未加载密码哈希)。此错误通常由两个主要原因引起:John 已经破解了提供的文件中的所有哈希,或者该文件格式不被 John 理解。

首先,让我们在一个有效的哈希文件上运行 John。设置脚本已在你的当前目录(~/project)中创建了一个名为 shadow.txt 的文件,其中包含一个 John 能够识别格式的用户密码哈希。

让我们尝试使用一个简单的单词列表来破解它。

john --wordlist=pass.list shadow.txt

你应该会看到输出表明 John 已加载一个哈希并正在尝试破解它。它应该能很快找到密码。

Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2-16])
Cost 1 (algorithm [1:descrypt]...
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (dummyuser)
1g 0:00:00:00 DONE (2023-10-27 10:30) 100.0g/s 100.0p/s 100.0c/s 100.0C/s password123
Use the "--show" option to display all of the cracked passwords reliably
Session completed

现在密码已被破解,John 将其存储在名为 john.pot 的文件中。让我们再次尝试运行完全相同的命令。

john --wordlist=pass.list shadow.txt

这次,你将看到错误。

Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

这是因为 John 在开始之前会检查 john.pot 文件,并忽略所有已被破解的哈希。你可以查看 john.pot 文件的内容来确认。

cat ~/.john/john.pot

输出将显示哈希和已破解的密码。

$1$notarealhash$b5gQ1P2kPiyP2t.OqI0kS1:password123

导致此错误的另一个原因是文件格式无效。让我们创建一个不包含任何哈希的文件。

echo "this is just a text file" > plain.txt

现在,尝试在上面运行 John。

john plain.txt

你将看到相同的“No password hashes loaded”错误,因为 John 在文件中找不到任何看起来像密码哈希的数据。请务必确保你的目标文件包含受支持格式的哈希。

调试“Invalid hash type”错误

在此步骤中,我们将解决与哈希类型相关的问题。有时 John 无法自动检测哈希类型,或者用户可能使用 --format 标志指定了错误的类型,从而导致错误或破解尝试失败。

首先,让我们看看当 John 遇到一个包含格式错误的哈希字符串的文件时会发生什么。为此,我们有一个名为 invalid_hashes.txt 的文件。

john invalid_hashes.txt

John 将分析文件并报告它未能加载任何有效的哈希,这与上一步中的错误类似。

Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

现在,让我们使用一个包含有效哈希但指定了错误格式的文件。我们的文件 hashes_md5.txt 包含一个标准的 raw-MD5 哈希,但我们将告知 John 它是 NT 哈希。

john --wordlist=pass.list --format=nt hashes_md5.txt

由于哈希数据与指定的格式不匹配,John 将产生一个警告或错误。

Warning: invalid ciphertext ignored: user1:5d41402abc4b2a76b9719d911017c592
No password hashes loaded (see FAQ)

要解决此问题,你必须提供正确的哈希格式。如果你知道格式是 raw-MD5,你可以直接指定它。这通常比让 John 自动检测它更快。

让我们使用正确的格式运行命令。

john --wordlist=pass.list --format=raw-md5 hashes_md5.txt

这次,命令成功并破解了密码。

Using default input encoding: UTF-8
Loaded 1 password hash (raw-MD5 [MD5 128/128 SSE2-16])
Cost 1 (iteration count) is 1 for all loaded hashes
Press 'q' or Ctrl-C to abort, almost any other key for status
labex            (user1)
1g 0:00:00:00 DONE (2023-10-27 10:35) 100.0g/s 1234Kp/s 1234Kc/s 1234KC/s 123..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed

如果你不确定哈希类型,可以省略 --format 标志,让 John 尝试自动检测。但是,对于模糊或非标准的哈希,指定格式是确保成功的最佳方法。

解决性能瓶颈

在此步骤中,我们将探讨如何识别和解决性能问题。密码破解可能是一项非常消耗资源的任务,缓慢的性能会使其变得不切实际。

John the Ripper 中性能的一个关键指标是“每秒候选数”(c/s)。你可以运行基准测试,以了解你的系统在不同哈希算法上的表现。

john --test

此命令将运行一系列基准测试。查看输出中各种算法的 c/s 速率。

Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... DONE
Many salts:	1234K c/s real, 1234K c/s virtual
Only one salt:	1111K c/s real, 1111K c/s virtual

... (many other algorithms) ...

Benchmarking: raw-MD5 [MD5 128/128 SSE2-16]... DONE
Raw:	45678K c/s real, 45678K c/s virtual

在多核系统上提高性能最有效的方法之一是使用并行处理。John 可以通过 --fork=N 选项来实现这一点,其中 N 是要生成的进程数。

在测试此功能之前,让我们清空 john.pot 文件,以便我们可以重新破解第 1 步中的哈希。

rm ~/.john/john.pot

现在,让我们在 shadow.txt 上运行一个单核破解会话。在运行过程中,按任意键(例如 Enter)查看状态。注意 c/s 速率。

john --wordlist=pass.list shadow.txt

片刻之后,按 Enter。你将看到状态行。然后按 Ctrl+C 停止它。

现在,让我们尝试使用两个并行进程再次运行。

john --fork=2 --wordlist=pass.list shadow.txt

这次,John 将使用两个 CPU 核心来处理任务。如果你检查状态,总体 c/s 速率应该会显著提高,接近单核速率的两倍。这可以大大缩短破解会话所需的时间。

其他性能提示包括:

  • 使用有针对性的单词列表: 一个更小、更相关的单词列表比一个庞大、通用的单词列表更快。
  • 指定格式: 如第 2 步所示,使用 --format 可以避免自动检测的开销。

处理损坏的会话文件

在此步骤中,我们将学习如何处理损坏的会话文件。John the Ripper 会自动将其进度保存在位于 ~/.john/ 目录下的会话文件中(扩展名为 .rec)。这允许你暂停和恢复长时间运行的破解会话。但是,如果此文件损坏,你将无法恢复你的会话。

让我们开始一个新的会话。我们将它命名为 my_session

john --session=my_session --wordlist=pass.list corrupt_me.txt

让命令运行几秒钟,然后按 Ctrl+C 优雅地停止它。John 将保存其进度。

Session aborted

你可以看到已创建的会话文件。

ls ~/.john/
john.log  john.pot  my_session.rec

现在,让我们通过向其追加一些垃圾数据来模拟一个损坏的文件。

echo "THIS IS CORRUPTED DATA" >> ~/.john/my_session.rec

在会话文件损坏的情况下,让我们尝试恢复我们的工作。

john --restore=my_session

John 将无法解析恢复文件,并很可能以错误消息退出。确切的错误可能会有所不同,但它会指示 .rec 文件存在问题。

Error in recovery file: ~/.john/my_session.rec

发生这种情况时,唯一的解决方案是删除损坏的会话文件。这意味着你将丢失该特定会话的进度,并且必须从头开始。但是,任何已成功破解的密码都安全地保存在 john.pot 文件中。

让我们删除损坏的文件。

rm ~/.john/my_session.rec

现在你可以从头开始重新启动会话。这是从破解尝试期间意外崩溃或系统关机中恢复的关键故障排除步骤。

寻求 John the Ripper 社区的帮助

在此步骤中,我们将介绍当你尝试了所有方法但仍然卡住时该怎么做。John the Ripper 社区是一个极好的资源,但要获得有效的帮助,你需要提供正确的信息。

社区支持的主要场所是 john-users 邮件列表。在发帖之前,搜索邮件列表存档以查看你的问题是否已被解答是一个好习惯。

当你需要寻求帮助时,提供清晰完整的信息是关键。以下是你应始终包含在请求中的内容:

  1. John the Ripper 版本: 不同版本具有不同的功能和 bug。
  2. 确切的命令: 你用于运行 John 的完整命令。
  3. 完整输出: 命令的所有输出,包括任何错误消息。
  4. 操作系统: 你正在使用的操作系统(例如,Ubuntu 22.04,Windows 10)。
  5. 哈希样本: 你尝试破解的哈希示例(如果它不敏感)。

你可以使用 --version 标志获取你的 John the Ripper 版本。让我们现在运行它。

john --version

输出将类似于:

John the Ripper 1.9.0-jumbo-1 [linux-gnu 64-bit x86_64 AVX2 AC]

了解如何收集这些信息将使社区成员更容易理解你的问题并提供有用的解决方案。请记住,在向开源社区寻求帮助时,要保持礼貌和耐心。

总结

在本实验中,你获得了排除 John the Ripper 一些最常见问题的实践经验。

你学会了如何:

  • 通过检查 john.pot 文件中已破解的密码以及验证输入文件格式来诊断 No hashes loaded 错误。
  • 使用 --format 标志指定正确的算法来解决哈希类型问题。
  • 通过运行基准测试和使用 --fork 选项进行并行处理来解决性能瓶颈。
  • 通过删除损坏的会话(.rec)文件来从失败的破解尝试中恢复。
  • 收集必要的信息,例如 JtR 版本和命令输出,以便有效地向社区寻求帮助。

掌握了这些技能,你现在可以更有效地使用 John the Ripper 并解决出现的问题。