使用 John the Ripper 进行 Kali 密码破解

Kali LinuxBeginner
立即练习

简介

在本实验中,你将学习使用 Kali Linux 进行密码破解的基础知识,重点介绍强大的工具 John the Ripper。本实验的主要目标是了解如何破解 Linux 密码哈希,这些哈希通常存储在 /etc/shadow 文件中,是密码的加密表示形式。这项技能在渗透测试中至关重要,有助于识别弱密码并提升系统安全性。

当你打开终端时,你将自动进入一个 Kali Linux 容器 shell。本实验中的所有命令都应在此环境中执行。通过循序渐进的指导,你将处理示例哈希文件、创建并使用自定义字典、对比 John the RipperHashcat 等破解工具,并保存分析结果。本实验专为初学者设计,旨在受控环境中提供清晰、实用的学习体验。

环境设置与工具安装

在第一步中,我们将通过安装密码破解所需的工具来准备 Kali Linux 环境。如前所述,你的终端会话已在 Kali Linux 容器中运行。

我们将使用两个主要工具:John the Ripper(一款功能多样且广泛使用的密码破解器)和 Hashcat(另一款以速度和灵活性著称的强大工具)。由于 Hashcat 需要 OpenCL 运行时,我们还将在此容器中安装 CPU OpenCL 软件包。

首先,更新软件包列表,确保能够获取最新的软件版本。

apt update

接下来,使用以下命令安装 John the RipperHashcat 和 CPU OpenCL 运行时。-y 标志会自动确认安装。

apt install -y john hashcat pocl-opencl-icd

安装过程可能需要几分钟。完成后,你可以通过直接运行 john 命令来验证 John the Ripper 是否安装正确。

john

你应该会看到帮助和版本信息,这表明该工具已准备就绪。输出内容应类似于:

John the Ripper 1.9.0-jumbo-1+bleeding-aec1328d6c 2021-11-02 10:45:52 +0100 OMP [linux-gnu 64-bit x86_64 AVX512BW AC]
Copyright (c) 1996-2021 by Solar Designer and others
Homepage: https://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]
...

接下来,通过查看版本号来验证 Hashcat 的安装。

hashcat --version

预期的输出将显示版本号,例如:

v6.2.5

至此,两个工具均已安装并验证完毕,你的环境已为后续步骤中的密码破解练习做好了准备。

创建示例哈希文件

工具安装完成后,我们需要一些数据来进行操作。在这一步中,你将创建一个包含真实 Linux 密码哈希的文件,以便 John the Ripper 进行处理。这些哈希的格式模仿了 /etc/shadow 文件,该文件在 Linux 系统中安全地存储用户密码信息。这能让你在安全、受控的环境中练习破解。

所有操作将在 Kali 容器的 /root 目录下执行。我们将直接使用预生成的真实哈希创建哈希文件,这些哈希对应简单且常见的密码,可以快速破解。

使用以下命令直接创建示例哈希文件:

cd /root
echo -e "user1:\$6\$randomsalt\$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:18234:0:99999:7:::\nuser2:\$6\$anothersalt\$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:18234:0:99999:7:::" > sample_hashes.txt

或者,你也可以通过复制粘贴以下内容手动创建该文件:

cd /root
cat > sample_hashes.txt << 'EOF'
user1:$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:18234:0:99999:7:::
user2:$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:18234:0:99999:7:::
EOF

每行开头的 $6$ 表示该哈希为 SHA-512 crypt 哈希,这是现代 Linux 系统的通用标准。其格式遵循 shadow 文件结构:用户名:加密密码:最后修改日期:最小有效期:最大有效期:警告期:不活动期:过期日期:保留字段

使用 cat 命令显示文件内容,确认文件创建正确:

cat /root/sample_hashes.txt

输出应显示包含真实哈希值的两个用户条目:

user1:$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:18234:0:99999:7:::
user2:$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:18234:0:99999:7:::

重要提示:

  • 这些是 John the Ripper 可以处理的真实且格式正确的 SHA-512 哈希。
  • 对应的密码分别为 password123456 —— 这些是非常简单且常见的密码,肯定包含在 John 的默认字典中。
  • 这确保了演示目的下的快速破解,通常在几秒钟内即可完成。

准备好此示例数据文件后,你现在就有了密码破解练习的目标。在下一步中,你将使用 John the Ripper 尝试破解这些哈希。

使用 John the Ripper 的默认模式破解哈希

有了示例哈希文件,现在是时候开始使用 John the Ripper 进行破解了。默认情况下,John 使用多种模式,包括一种利用用户名和其他信息来猜测密码的“单一破解(single crack)”模式,随后是使用内置密码列表的字典模式。这是识别弱密码和常见密码的绝佳起点。

运行以下命令,开始对 sample_hashes.txt 文件进行破解。

john /root/sample_hashes.txt

John 将加载哈希并开始破解会话。你将看到显示进度的输出。由于我们创建的真实哈希对应的是非常简单、常见的密码(password123456),John 应该能够使用其默认字典模式快速破解它们。

Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (sha512crypt, crypt(3) $6$ [SHA512 512/512 AVX512BW 8x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 2 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
...

你可以让 John 运行一段时间以尝试破解,或者如果你想提前查看结果,可以使用 Ctrl-C 停止该过程。要查看已破解的密码,请使用 --show 选项。

john --show /root/sample_hashes.txt

如果密码破解成功,输出应如下所示:

user1:password:18234:0:99999:7:::
user2:123456:18234:0:99999:7:::

2 password hashes cracked, 0 left

由于我们使用了非常简单的密码(password123456),它们几乎肯定在 John 的默认字典中,因此这些哈希很快就被破解了——通常只需几秒钟。这一成功证明了 John the Ripper 可以正确处理我们的真实哈希文件,并展示了弱密码被破解的速度之快。

在下一步中,我们将探讨如何为 John 提供自定义字典并调整各种参数,以提高破解效率。

使用自定义字典进行破解

仅依赖默认设置通常是不够的。使用自定义字典进行针对性攻击往往更有效。字典只是一个文本文件,每行包含一个潜在的密码。在这一步中,你将创建一个小型自定义字典,并将其与 John the Ripper 配合使用。

/root 目录下创建一个名为 custom_wordlist.txt 的文件,其中包含几个常见密码,包括我们已知在哈希文件中存在的密码。

echo -e "password\n123456\nadmin123\ntest1234\nqwerty\npassword123" > /root/custom_wordlist.txt

验证新字典的内容。

cat /root/custom_wordlist.txt

输出应显示你刚刚添加的六个密码:

password
123456
admin123
test1234
qwerty
password123

现在,再次运行 John the Ripper,但这次使用 --wordlist 选项指定你的自定义字典。

john --wordlist=/root/custom_wordlist.txt /root/sample_hashes.txt

此命令告诉 John 使用 custom_wordlist.txt 中的每个密码来测试 sample_hashes.txt 中的哈希。由于我们的字典包含了对应的真实密码(password123456),John 应该能非常快地破解它们。

过程结束后,再次检查结果。

john --show /root/sample_hashes.txt

由于我们的字典包含了正确的密码,输出现在应显示已破解的凭据:

user1:password:18234:0:99999:7:::
user2:123456:18234:0:99999:7:::

2 password hashes cracked, 0 left

这展示了针对性字典攻击的有效性。通过在自定义字典中包含实际密码,我们能够比仅依赖 John 的默认字典更快地破解哈希。这种技术是针对性密码攻击的基础。接下来,我们将了解如何使用 Hashcat 执行类似的攻击。

使用 Hashcat 进行破解对比

虽然 John the Ripper 是一款出色的工具,但熟悉 Hashcat 等替代方案也是一种良好的实践。Hashcat 以其速度著称,尤其是在配备 GPU 的系统上。在这里,我们将使用 Hashcat 执行相同的字典攻击。

Hashcat 更倾向于处理仅包含哈希值的纯净文件。使用 awk 命令从 sample_hashes.txt 中提取第二个字段(即哈希值),并将其保存到新文件 clean_hashes.txt 中。

awk -F':' '{print $2}' /root/sample_hashes.txt > /root/clean_hashes.txt

验证新文件的内容。

cat /root/clean_hashes.txt

输出应仅包含哈希字符串:

$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0
$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/

现在,运行 Hashcat。你需要指定哈希模式(-m 1800 代表 SHA-512 crypt)和攻击模式(-a 0 代表直接字典攻击)。

hashcat -m 1800 -a 0 /root/clean_hashes.txt /root/custom_wordlist.txt
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 1800 (sha512crypt $6$, SHA512 (Unix))
Hash.Target......: /root/clean_hashes.txt
Time.Started.....: Mon Sep  1 06:33:21 2025 (0 secs)
Time.Estimated...: Mon Sep  1 06:33:21 2025 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/root/custom_wordlist.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:      226 H/s (5.08ms) @ Accel:8 Loops:1024 Thr:1 Vec:8
Recovered........: 2/2 (100.00%) Digests (total), 1/2 (50.00%) Digests (new), 2/2 (100.00%) Salts
Progress.........: 6/12 (50.00%)
Rejected.........: 0/6 (0.00%)
Restore.Point....: 0/6 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:4096-5000
Candidate.Engine.: Device Generator
Candidates.#1....: password -> password123

在运行攻击之前,请确认 Hashcat 可以检测到 OpenCL 后端:

hashcat -I

如果该命令报告没有可用的 OpenCL 平台,请安装 CPU OpenCL 运行时并再次检查:

apt update
apt install -y pocl-opencl-icd
hashcat -I

检测到 OpenCL 后,再次运行破解命令。如果 Hashcat 在此容器化环境中打印警告,请添加 --force 参数。

hashcat -m 1800 -a 0 /root/clean_hashes.txt /root/custom_wordlist.txt --force

攻击完成后,通过运行带有 --show 标志的命令来查看已破解的密码。

hashcat -m 1800 -a 0 /root/clean_hashes.txt /root/custom_wordlist.txt --show

当攻击成功时,Hashcat 会显示每个哈希及其对应的破解密码,中间用冒号分隔:

$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:password
$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:123456

这一步向你介绍了 Hashcat 作为密码破解的强大替代工具。在最后一步中,你将学习如何妥善记录你的发现。

总结

在本实验中,你在 Kali Linux 环境中获得了密码破解基础技术的实践经验。你首先设置了工作空间,安装了 John the RipperHashcat 等核心工具。随后,你学习了如何通过创建模仿 Linux /etc/shadow 格式的示例哈希文件来准备目标数据。

你练习了在默认设置和自定义字典下使用 John the Ripper,并探索了 Hashcat 这一强大的替代方案。最后,你学习了保存发现结果以进行文档记录和报告的关键步骤。这些技能为渗透测试奠定了坚实的基础,并强调了实施强密码策略以抵御此类攻击的重要性。