介绍
在本实验中,你将学习如何使用 John the Ripper 破解受密码保护的 ZIP 文件。John the Ripper 是一款流行且功能强大的密码恢复工具。通过本练习,你将掌握密码破解过程的基础步骤,从搭建必要工具到验证破解出的密码。实验结束时,你将理解密码哈希(Hash)是如何被提取并用于字典攻击和暴力破解攻击的,从而深刻体会到使用强密码保护文件的重要性。
安装所需工具
在开始破解密码之前,我们需要安装必要的软件。在这一步中,你将安装本实验的核心工具 John the Ripper(简称 JtR),以及用于创建目标文件的 zip 工具。我们将使用 apt 软件包管理器,它是 Ubuntu 等基于 Debian 系统的标准工具。
首先,在终端运行以下命令来安装所需的依赖项和 zip 工具。-y 标志会自动确认安装。
sudo apt update
sudo apt install -y git build-essential libssl-dev zlib1g-dev zip
sudo apt install -y yasm pkg-config libgmp-dev libpcap-dev libbz2-dev
由于 apt 仓库中的标准 john 软件包不包含我们需要的 zip2john 工具,我们将从官方仓库克隆并编译 John the Ripper,以获取完整的工具集。
cd ~/project
git clone --depth 1 https://github.com/openwall/john -b bleeding-jumbo john
cd john/src
./configure && make -s clean && make -sj4
警告: 编译过程可能需要 3 到 5 分钟。请耐心等待。
编译完成后,为 John the Ripper 工具创建别名,以便你在任何位置都能使用它们:
echo 'alias john="$HOME/project/john/run/john"' >> ~/.zshrc
echo 'alias zip2john="$HOME/project/john/run/zip2john"' >> ~/.zshrc
source ~/.zshrc
现在,验证 john 和 zip2john 是否可以在任何目录下正常工作:
john
你应该会看到类似以下的输出,这表明 John the Ripper 已成功安装:
John the Ripper 1.9.0-jumbo-1+bleeding-7a8c81abd9 2025-08-23 23:43:48 +0200 OMP [linux-gnu 64-bit x86_64 AVX-512 AC]
Copyright (c) 1996-2025 by Solar Designer and others
Homepage: https://www.openwall.com/john/
Usage: john [OPTIONS] [PASSWORD-FILES]
Use --help to list all available options.
同时验证 zip2john 是否可用:
zip2john
这应该会显示 zip2john 工具的使用说明信息。
现在你可以返回项目目录进行后续实验:
cd ~/project
安装好必要的工具后,你现在可以为破解练习创建一个受密码保护的文件了。
创建受密码保护的 ZIP 文件
为了练习密码破解,我们首先需要一个目标。在这一步中,你将创建一个简单的文本文件,然后将其归档到一个受密码保护的 ZIP 文件中。这将模拟现实世界中敏感文件被密码保护的场景。
首先,确保你处于项目目录中。默认情况下,你的终端应该已经在该目录。
cd ~/project
接下来,创建一个名为 secret.txt 的简单文本文件。该文件将被放入我们受保护的 ZIP 压缩包中。
echo "my secret data" > secret.txt
现在,使用带有 -e 标志(代表加密)的 zip 命令创建一个名为 secret.zip 的加密压缩包,其中包含 secret.txt。
zip -e secret.zip secret.txt
运行命令后,系统会提示你输入并验证密码。在本实验中,请使用弱密码 password123。为了演示目的,这会使破解过程更快。
注意: 输入密码时,屏幕上不会显示任何字符——这是正常的安全特性,并非系统卡死。只需输入密码并按回车键即可。
Enter password:
Verify password:
adding: secret.txt (stored 0%)
最后,你可以列出目录中的文件,确认 secret.zip 已经创建。
ls -l
你应该在输出中看到 secret.txt 和 secret.zip。
total 8
-rw-rw-r-- 1 labex labex 15 Aug 29 09:57 secret.txt
-rw-rw-r-- 1 labex labex 213 Aug 29 09:57 secret.zip
你现在已成功创建了一个受密码保护的 ZIP 文件,它将在接下来的步骤中作为我们的破解目标。
从 ZIP 文件中提取哈希值
John the Ripper 并不直接对 ZIP 文件本身进行操作。相反,它处理的是文件的密码哈希(Hash)。哈希是代表密码的唯一字符序列。在这一步中,你将使用 John the Ripper 附带的名为 zip2john 的工具来提取此哈希。
对你的 secret.zip 文件运行 zip2john 命令。我们将使用 > 运算符重定向输出,将哈希值保存到名为 zip_hash.txt 的新文件中:
zip2john secret.zip > zip_hash.txt
运行此命令时,你会在终端看到一些详细输出,显示有关 ZIP 文件结构的信息:
ver 1.0 efh 5455 efh 7875 secret.zip/secret.txt PKZIP Encr: 2b chk, TS_chk, cmplen=27, decmplen=15, crc=AF1563E8 ts=4F26 cs=4f26 type=0
这些信息展示了加密文件的细节,包括压缩和加密参数。
要查看提取的哈希值是什么样子,请使用 cat 命令显示 zip_hash.txt 的内容:
cat zip_hash.txt
输出将是一行文本,看起来类似于:
secret.zip/secret.txt:$pkzip$1*2*2*0*1b*f*af1563e8*0*44*0*1b*4f26*50dbe9bcf15eafdb00ef774e1eaffef116bf5e0597fa55bb8b364c*$/pkzip$:secret.txt:secret.zip::secret.zip
哈希字符串包含了原始文件名、加密类型($pkzip$)以及加密数据。创建好这个哈希文件后,你就可以准备使用 John the Ripper 来破解密码了。
破解密码
现在你已经有了密码哈希,可以使用 John the Ripper 来破解它。JtR 将使用其默认设置,其中包括一个常用密码字典和一系列规则,以寻找与哈希匹配的项。
要开始破解过程,只需运行 john 命令并将你的哈希文件 zip_hash.txt 作为输入:
john zip_hash.txt
因为我们使用了非常简单的密码,John the Ripper 应该能很快破解它。输出将显示进度和结果。John 会尝试不同的攻击模式——首先是「单一」(Single)模式,然后是词典(Wordlist)模式:
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 4 OpenMP threads
Note: Passwords longer than 21 [worst case UTF-8] to 63 [ASCII] rejected
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
0g 0:00:00:00 DONE 1/3 (2025-08-29 10:24) 0g/s 2619Kp/s 2619Kc/s 2619KC/s Txtsecret1900..Tzip1900
Proceeding with wordlist:/home/labex/project/john/run/password.lst
Enabling duplicate candidate password suppressor using 256 MiB
password123 (secret.zip/secret.txt)
1g 0:00:00:00 DONE 2/3 (2025-08-29 10:24) 8.333g/s 286541p/s 286541c/s 286541C/s 123456..nelly1
Use the "--show" option to display all of the cracked passwords reliably
Session completed
password123 (secret.zip/secret.txt) 这一行表明密码已成功破解。请注意,John 首先尝试了「单一」模式(未找到密码),然后转入词典模式并成功找到了密码。
一旦密码被破解,John 会将其存储在一个文件中。要查看给定哈希文件的任何已破解密码,可以使用 --show 选项。
john --show zip_hash.txt
此命令将以清晰的格式显示破解出的密码,并将其与源文件关联。
secret.zip/secret.txt:password123:secret.txt:secret.zip::secret.zip
1 password hash cracked, 0 left
你已成功使用 John the Ripper 从 ZIP 文件的哈希中恢复了密码。最后一步是验证这个密码是否有效。
使用破解出的密码验证访问
此过程的最后一步是确认你破解的密码是否正确。你将通过使用该密码提取 secret.zip 压缩包的内容来进行验证。这一步将验证你密码破解工作的成果。
使用 unzip 命令解压压缩包。
unzip secret.zip
该命令会提示你输入密码。输入 password123,即 John the Ripper 恢复出的密码。
Archive: secret.zip
[secret.zip] secret.txt password:
replace secret.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: yes
extracting: secret.txt
你可能会看到一个提示,询问是否要替换现有的 secret.txt 文件(如果它在步骤 2 中已存在)。输入 yes 确认替换。如果密码正确,unzip 命令会将 secret.txt 提取到当前目录,且不会报错。
为了完成验证,显示提取出的文件内容,确保数据完整。
cat secret.txt
输出应与我们在步骤 2 中创建的原始文本一致。
my secret data
通过成功提取文件并查看其原始内容,你已确认 John the Ripper 恢复的密码是正确的。这完成了一个完整的循环:创建受保护文件、破解其密码并验证结果。
总结
在本实验中,你获得了使用 John the Ripper 进行密码破解的动手经验。你学习了如何安装必要的工具、创建受密码保护的 ZIP 文件,并使用 zip2john 提取其密码哈希。随后,你成功使用 John the Ripper 从哈希中破解了密码,并最终通过访问受保护文件验证了破解出的密码。本练习演示了安全测试中的一项基本技术,并强调了弱密码的脆弱性。


