从 John the Ripper Potfile 中破解哈希

Kali LinuxBeginner
立即练习

引言

John the Ripper (JtR) 是一个流行的密码破解工具。当它成功破解密码时,会将结果存储在一个名为 john.pot 的文件中,通常被称为“potfile”。这可以防止 JtR 在未来浪费时间尝试重新破解相同的哈希。

在这个实验中,你将面临一个场景,其中 John the Ripper 已经部分完成了密码破解尝试。你的任务是找出哪些哈希未被破解,然后使用另一个强大的工具 Hashcat 来尝试破解剩余的哈希。这种工作流程在渗透测试和安全审计中很常见,因为会使用多种工具来最大化结果。

你将学会:

  • 定位和理解 JtR potfile。
  • 使用命令行工具提取和比较哈希列表。
  • 使用 Hashcat 对剩余的哈希执行字典攻击。

定位现有的 John the Ripper Potfile

在此步骤中,你将定位并检查 john.pot 文件。此文件由 John the Ripper 自动创建,用于存储它已成功破解的哈希以及对应的明文密码。该文件的默认位置在用户主目录下的一个名为 .john 的隐藏目录中。

我们的实验环境已预先配置了一个 john.pot 文件,该文件来自模拟的先前破解会话。让我们查看其内容。

使用 cat 命令显示 potfile 的内容。你所有的工作都将在默认的 ~/project 目录中进行,但 potfile 位于 /home/labex/.john/

cat ~/.john/john.pot

你应该会看到以下输出,其中显示了 JtR 已找到的哈希以及对应的密码。

$1$abc$gqNud23o1vjR/pYd9gH7k/:password123
$1$def$H9g2s3kLd/fG1hJkLpQ9r/:labex
$1$ghi$aB4c5dE6fG7hI8jK9lM0n/:secret

理解 JtR Potfile 的格式

在此步骤中,我们将分析 john.pot 文件的结构。理解这种格式对于处理其数据至关重要。

正如你在上一步中看到的,potfile 中的每一行都有特定的格式:

HASH:PLAINTEXT_PASSWORD

让我们来解析一下我们文件中的第一行:

$1$abc$gqNud23o1vjR/pYd9gH7k/:password123

  • $1$abc$gqNud23o1vjR/pYd9gH7k/: 这是已破解的完整哈希字符串。这种格式(以 $1$ 开头)表明它是一个 MD5-crypt 哈希,常用于较旧的 Linux 系统。
  • :: 冒号用作分隔符,将哈希与密码分开。
  • password123: 这是与哈希对应的明文密码。

我们的目标是找出原始列表 (all_hashes.txt) 中的哪些哈希 存在于此 potfile 中。为此,我们首先需要从 john.pot 的每一行中仅提取哈希部分。我们将在下一步进行此操作。此步骤仅用于概念理解,因此没有需要执行的命令。

从 JtR Potfile 中提取哈希

在此步骤中,你将仅从 john.pot 文件中提取哈希值。我们可以使用 cut 命令,这是一个标准的 Linux 工具,用于从文件的每一行中截取部分内容。

我们将指示 cut 使用冒号 (:) 作为分隔符,并提取第一个字段 (-f1)。我们将输出重定向到一个名为 cracked_hashes.txt 的新文件中,该文件位于你当前目录 (~/project) 中。

在你的终端中执行以下命令:

cut -d: -f1 ~/.john/john.pot > cracked_hashes.txt

现在,通过查看其内容来验证文件是否已正确创建:

cat cracked_hashes.txt

输出应该只包含哈希字符串:

$1$abc$gqNud23o1vjR/pYd9gH7k/
$1$def$H9g2s3kLd/fG1hJkLpQ9r/
$1$ghi$aB4c5dE6fG7hI8jK9lM0n/

为 Hashcat 攻击重构哈希格式

在此步骤中,你将识别 JtR 未能破解的哈希。你有一个包含所有原始哈希的文件 (all_hashes.txt) 和一个包含已破解哈希的文件 (cracked_hashes.txt)。通过比较这两个文件,你可以创建一个新列表,其中仅包含未破解的哈希。

我们将使用 grep 命令来完成此操作。我们将使用的标志是:

  • -v: 反转匹配,选择不匹配的行。
  • -F: 将模式视为固定字符串,而不是正则表达式。
  • -f file: 从指定文件中获取模式。

此命令将从 cracked_hashes.txt 读取模式,并从 all_hashes.txt 中删除任何匹配的行,将结果保存到 uncracked_hashes.txt

grep -v -F -f cracked_hashes.txt all_hashes.txt > uncracked_hashes.txt

现在,检查你的新文件的内容。它应该包含不在 potfile 中的三个哈希。

cat uncracked_hashes.txt

你应该看到以下输出:

user4:$1$jkl$oP1qR2sT3uV4wX5yZ6a7b/
user5:$1$mno$c8d9e0f1g2h3i4j5k6l7m/
user6:$1$pqr$n9o8p7q6r5s4t3u2v1w0x/

此文件现在已准备好与 Hashcat 一起使用。

使用 Hashcat 尝试破解 JtR 遗漏的哈希

在最后这个步骤中,你将使用 Hashcat 来攻击剩余的哈希。Hashcat 是一个非常快速且功能强大的密码破解器,它可以利用 GPU 来获得巨大的性能提升。

Hashcat 进行字典攻击的基本语法是 hashcat -m <mode> <hash_file> <wordlist_file>

  • -m 500: 这指定了哈希类型。500 对应于 MD5-crypt,这是我们正在处理的哈希类型。
  • --force: 在此实验(lab)等虚拟化或容器化环境中,通常需要此选项来绕过警告并强制 Hashcat 运行。

现在,使用提供的 wordlist.txt 文件,针对 uncracked_hashes.txt 文件运行 Hashcat。

hashcat -m 500 --force uncracked_hashes.txt wordlist.txt

Hashcat 将开始运行。你将看到它运行时显示的状态信息。由于我们的 wordlist 很小并且包含正确的密码,因此过程会非常快。

...
Session..........: hashcat
Status...........: Running
Hash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)
Hash.Target......: uncracked_hashes.txt
...
Approaching final keyspace - workload adjusted.

Session..........: hashcat
Status...........: Cracked
...

一旦 Hashcat 完成,它会将破解出的密码存储在其自己的 potfile 中。要查看新破解出的密码,你可以使用 --show 选项。

hashcat -m 500 --force --show uncracked_hashes.txt

输出将显示哈希及其新发现的明文密码。

$1$jkl$oP1qR2sT3uV4wX5yZ6a7b/:dragon
$1$mno$c8d9e0f1g2h3i4j5k6l7m/:qwerty
$1$pqr$n9o8p7q6r5s4t3u2v1w0x/:sunshine

恭喜你,你已成功地将一个破解工具的输出用作另一个工具的输入!

总结

在此实验(lab)中,你学习了一个实用的工作流程,该流程结合了不同密码破解工具的优势。你从一个预先存在的 John the Ripper potfile 开始,它代表了之前破解会话的结果。

你成功地:

  • 定位并解释了 john.pot 文件的内容。
  • 使用 cut 命令提取了特定的数据字段。
  • 使用 grep 命令比较了两个列表并隔离了未破解的哈希。
  • 对剩余的哈希发起了 Hashcat 字典攻击并成功破解了它们。

这个识别剩余工作并将之传递给另一个工具的过程,在实际的安全评估中是一种非常高效的策略,它能让你覆盖更广的范围并增加成功的几率。