Kali Linux下使用Hashcat与Rockyou字典破解ZIP密码实战指南
1. 项目概述与核心价值
手头有个加密的ZIP压缩包,密码却怎么也想不起来,这种场景估计不少人都遇到过。无论是多年前备份的老照片,还是同事交接工作时留下的加密文档,一个被遗忘的密码就能让重要文件瞬间变成“数字砖头”。作为一名长期在安全领域摸爬滚打的从业者,我处理过太多类似的求助。今天,我就来分享一个在Kali Linux环境下,利用hashcat这款“密码恢复瑞士军刀”和著名的rockyou.txt字典,来尝试破解ZIP密码的完整流程。这个方法并非万能钥匙,它的成功率高度依赖于密码的复杂度和字典的质量,但对于常见的弱密码、常用单词组合,往往有奇效。整个过程就像是用一把精心打造的“撞匙”去尝试打开一把锁,核心在于将ZIP文件的加密哈希提取出来,然后用海量的密码候选词去碰撞匹配。如果你对Linux命令行有基本了解,并且手头有一个合法的、属于自己的加密ZIP文件需要恢复访问,那么这篇手把手的指南将为你提供一个清晰、可操作的路径。记住,技术工具的使用必须严格遵守法律法规,仅用于测试自己拥有所有权的资产或获得明确授权的测试。
2. 环境准备与核心工具解析
2.1 Kali Linux:为何是首选平台
Kali Linux并非破解密码的必需品,任何能安装hashcat的Linux系统甚至Windows都可以。但选择Kali作为演示环境,原因在于其“开箱即用”的便利性。它是一个为渗透测试和安全研究量身定制的Linux发行版,预装了海量的安全工具,包括我们今天要用到的hashcat和rockyou.txt字典。这省去了我们四处寻找、安装和配置的麻烦,可以让我们把精力完全集中在破解流程本身。对于新手来说,在虚拟机(如VMware或VirtualBox)中安装一个Kali Linux是最快上手的方案,它能提供一个干净、隔离的测试环境。
注意:请务必在你自己完全控制的虚拟机或物理机上操作。未经授权对他人的加密文件进行密码破解是非法行为。
2.2 Hashcat:原理与工作模式剖析
hashcat是目前世界上最快的密码恢复工具之一,支持多种哈希算法(MD5, SHA家族, NTLM等)和加密格式(包括ZIP, RAR, PDF等)。它之所以强大,核心在于其利用GPU(显卡)进行并行计算的暴力破解能力,速度远超单纯依靠CPU的工具。
它的工作原理可以概括为“提取-碰撞”:
- 提取哈希:加密的ZIP文件本身不直接存储密码,而是用密码通过特定算法(如AES-256或传统的ZipCrypto)生成一个密钥,并用这个密钥加密文件。我们需要先用工具(如
zip2john或zip2hashcat)从这个ZIP文件中提取出代表其加密状态的“哈希值”。这个哈希值就像是这把锁唯一的“指纹”。 - 碰撞匹配:
hashcat读取我们提供的密码字典(如rockyou.txt),将字典中的每一个候选密码,用同样的加密算法进行计算,生成一个临时哈希,然后与第一步提取出的目标哈希进行比对。如果两者一致,就说明找到了正确的密码。
hashcat支持多种攻击模式,对于我们这个场景最相关的是:
- 字典攻击(-a 0):直接使用给定的密码字典文件进行尝试。这是我们本次主要使用的方法,前提是密码可能存在于字典中。
- 组合攻击(-a 1):将两个字典中的词进行组合。
- 掩码攻击(-a 3):当我们对密码格式有大概了解时(例如知道是8位数字,或“单词+两位数字”),可以用掩码来大幅缩小尝试范围,提高效率。
2.3 Rockyou.txt:传奇密码字典的来历与使用
rockyou.txt可能是网络安全领域最著名的密码字典之一。它源于2009年社交应用平台RockYou的一次数据泄露,其中包含超过3200万个用户的明文密码。正因为这些是真实用户使用过的密码,它成为了一个反映普通人密码设置习惯的“黄金标准”测试集。在Kali Linux中,它通常以压缩形式存放在/usr/share/wordlists/目录下。这个字典包含了从“123456”、“password”这类极其简单的密码,到一些常见的单词、名字、简单变体等,对于破解弱密码效果显著。
然而,必须清醒认识到它的局限性:对于复杂的、随机生成的、长度足够的密码(例如Tr0ub4dor&3或correct horse battery staple这类由多个单词组成的密码),仅靠rockyou.txt是几乎不可能破解的。它的价值在于快速覆盖那些最常用的、最薄弱的密码设置。
3. 完整实操流程分步详解
下面,我们假设你已经在虚拟机中启动了一个Kali Linux,并且拥有一个待破解的、名为secret_files.zip的加密ZIP文件。
3.1 第一步:提取ZIP文件的哈希值
hashcat不能直接处理ZIP文件,它需要的是从ZIP文件中提取出的特定格式的哈希字符串。我们需要借助一个辅助工具。在Kali中,通常使用zip2john(来自John the Ripper工具套件)来完成这一步。
- 打开终端:在Kali Linux中,打开一个终端窗口。
- 定位文件:使用
cd命令切换到你的ZIP文件所在的目录。例如,如果文件在桌面,可以输入:cd ~/Desktop - 提取哈希:运行以下命令:
zip2john secret_files.zip > zip_hash.txtzip2john:是提取哈希的工具。secret_files.zip:是你的加密ZIP文件名,请替换为实际文件名。>:是重定向符,将命令的输出结果保存到文件。zip_hash.txt:是保存提取出的哈希值的文本文件,名字可以自定。
执行后,如果ZIP文件加密方式受支持,你会在当前目录下得到一个zip_hash.txt文件。用cat命令查看一下:
cat zip_hash.txt你会看到一串类似secret_files.zip:$pkzip2$1*2*2*0*10*8*a4f8c6fe*0*45*0*10*a4f8c6fe*5f7b*$/pkzip2$的字符串。$pkzip2$开头到结尾的这一长串,就是hashcat能够识别的哈希值。我们需要复制这一整行(从secret_files.zip:开始到行尾)。
3.2 第二步:准备Rockyou密码字典
在Kali中,rockyou.txt.gz通常已经存在,但我们需要解压它。
- 进入字典目录:
cd /usr/share/wordlists - 解压字典:
rockyou.txt通常以gzip压缩格式存放。解压命令如下:sudo gzip -d rockyou.txt.gz- 需要
sudo权限,因为/usr/share是系统目录。 -d参数代表解压(decompress)。- 解压后,你会得到一个约130MB的
rockyou.txt文件,里面一行一个密码。
- 需要
- (可选)查看字典:你可以用
head或wc命令简单查看一下:head -20 rockyou.txt # 查看前20行 wc -l rockyou.txt # 统计总行数(超过1400万行)
3.3 第三步:使用Hashcat执行字典攻击
现在,核心材料(目标哈希和密码字典)都已就位,可以开始“碰撞”了。
回到工作目录:假设你的
zip_hash.txt在桌面。cd ~/Desktop构造并执行Hashcat命令:这是最关键的一步。基本命令格式如下:
hashcat -m 13600 -a 0 -o found_password.txt zip_hash.txt /usr/share/wordlists/rockyou.txt让我们拆解这个命令的每一个部分:
hashcat:调用主程序。-m 13600:指定哈希类型(hash-mode)。13600对应的是 PKZIP (Zip Crypto)。这是传统ZIP加密(ZipCrypto)的模式号。如果你的ZIP使用的是更新的AES-256加密,模式号是17210或17220(分别对应不同密钥长度)。你可以先用zip2john提取,如果哈希串以$pkzip2$开头,通常用13600;如果以$zip2$开头,可能需要尝试17200系列。这是最容易出错的地方之一。-a 0:指定攻击模式为字典攻击(Straight)。-o found_password.txt:指定一个输出文件。如果破解成功,找到的密码会保存在这个文件里。zip_hash.txt:包含目标哈希的文件。注意,这里不是ZIP文件本身,而是上一步生成的文本文件。但更常见的做法是直接粘贴哈希值,我们稍后说明。/usr/share/wordlists/rockyou.txt:密码字典的完整路径。
然而,更高效、更常见的做法是直接将哈希值作为参数,而不是通过文件。首先,从
zip_hash.txt中复制出完整的哈希字符串(例如$pkzip2$1*2*2*0*10*8*a4f8c6fe*0*45*0*10*a4f8c6fe*5f7b*$/pkzip2$)。然后使用如下命令格式:hashcat -m 13600 -a 0 -o found_password.txt '$pkzip2$1*2*2*0*10*8*a4f8c6fe*0*45*0*10*a4f8c6fe*5f7b*$/pkzip2$' /usr/share/wordlists/rockyou.txt务必用单引号将哈希值包裹起来,因为其中的
$符号在Bash shell中有特殊含义(表示变量),引号可以防止其被解析。命令执行与监控:按下回车后,
hashcat会开始工作。如果你的系统有性能较强的独立显卡(NVIDIA或AMD),并且安装了正确的驱动(在Kali中通常已集成或可通过nvidia-detect等工具安装),hashcat会自动调用GPU进行运算,速度会非常快。你会在终端看到滚动的状态信息,包括当前速度(H/s,每秒尝试多少次哈希)、进度、预计剩余时间等。- Status:显示为
Running。 - Speed:根据你的硬件,可能从几千到几十亿H/s不等。GPU破解速度远超CPU。
- Recovered:如果找到密码,这里会从0/1变为1/1。
- Status:显示为
破解成功:当
hashcat在字典中找到了匹配的密码,它会停止运行,并在终端用绿色高亮显示Status: Cracked。同时,密码会按照-o参数指定,写入found_password.txt文件。你可以用cat found_password.txt查看结果,格式通常是哈希值:密码。破解失败:如果
rockyou.txt字典跑完都没有匹配,Status会显示为Exhausted,表示字典耗尽,攻击失败。这时就需要考虑其他更大的字典、组合攻击、掩码攻击或者基于规则的变形攻击了。
4. 高级技巧与疑难问题排查
4.1 模式(-m)选择:ZipCrypto vs AES-256
这是新手最常卡住的地方。如何判断ZIP文件用的是哪种加密?
- 简单方法:在Windows或macOS上,用右键查看ZIP文件属性,在加密方式一栏可能会注明“AES-256”或“传统加密”(即ZipCrypto)。
- 技术方法:用
zip2john提取哈希后观察。- 哈希值以
$pkzip2$开头:这是传统的ZipCrypto,使用-m 13600。 - 哈希值以
$zip2$开头:这通常是WinZip的AES加密,模式可能是-m 17200(WinZip, AES-128),-m 17210(WinZip, AES-192),-m 17220(WinZip, AES-256)。但更常见的是PKZIP的AES加密。 - 对于现代软件(如7-Zip, macOS归档工具)创建的AES-256加密ZIP,
zip2john提取的哈希可能以$zip2$开头,并需要尝试-m 17225、-m 17230等模式。一个更稳妥的方法是使用hashcat的示例哈希功能来识别。你可以去hashcat的官方Wiki页面查找“example hashes”,那里有所有模式对应的示例哈希,对比一下就能确定。
- 哈希值以
实操心得:如果不确定模式,一个笨办法但有效的方法是,先用最常见的
-m 13600(ZipCrypto)尝试。如果hashcat报错“Token length exception”或“Line-length exception”,说明哈希格式不对。这时再去研究哈希串的特征,或者用hashcat --example-hashes | grep -A5 -B5 zip命令在本地查看示例,对比确定正确的-m值。
4.2 提升破解效率的策略
如果rockyou.txt失败了,不要轻易放弃。除了换用更大的字典(如crackstation.txt),还可以尝试以下策略:
规则攻击(-a 0 with -r):这是字典攻击的威力增强版。规则文件可以定义对字典中的每个单词进行一系列变换,如首字母大写、尾部添加数字(123)、符号替换(a->@, s->$)等。Kali自带了大量规则文件在
/usr/share/hashcat/rules/目录下。例如:hashcat -m 13600 -a 0 -o found_password.txt zip_hash.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule这条命令会用
best64.rule规则对rockyou.txt里的每个密码进行64种常见变形后再尝试,极大增加了命中率。掩码攻击(-a 3)的针对性尝试:如果你对密码有一些模糊的记忆(比如“好像是名字加出生年份”),掩码攻击能极大缩小范围。例如,假设密码是8位纯数字:
hashcat -m 13600 -a 3 -o found_password.txt zip_hash.txt ?d?d?d?d?d?d?d?d?d代表一位数字。?l代表小写字母,?u代表大写字母,?s代表特殊符号。掩码攻击在已知部分密码结构时效率极高。组合攻击(-a 1):如果你有两个相关的单词列表,可以尝试组合。例如,一个常见姓氏列表和一个常见数字列表组合。
4.3 常见错误与解决方案速查表
| 错误现象或问题 | 可能原因 | 解决方案 |
|---|---|---|
hashcat (n) is not an NVIDIA GPU | 未正确识别或使用NVIDIA GPU。 | 1. 运行nvidia-smi检查驱动和GPU状态。2. 安装NVIDIA驱动: sudo apt install nvidia-driver。3. 使用 -D 2强制使用CPU(慢):hashcat -D 2 ...。 |
Token length exception | 哈希模式 (-m) 选择错误,或者哈希字符串格式不对、不完整。 | 1. 确认ZIP加密类型,选择正确的-m值。2. 检查复制的哈希字符串是否完整,特别是开头和结尾的 $符号。3. 确保哈希值用单引号包裹。 |
No hashes loaded | hashcat无法从提供的文件或参数中解析出有效哈希。 | 1. 如果从文件加载,检查文件路径和内容。 2. 如果直接粘贴哈希,检查格式,并用单引号包裹。 3. 使用 hashcat --example-hashes对比正确格式。 |
Exhausted | 字典攻击完成,未找到匹配密码。 | 1. 尝试更大的密码字典。 2. 结合规则攻击 ( -r)。3. 如果对密码有印象,尝试掩码攻击 ( -a 3)。4. 考虑密码可能不在常用字典内,需要其他线索。 |
| 破解速度极慢(仅几百H/s) | hashcat可能运行在CPU模式,或者GPU未发挥性能。 | 1. 运行hashcat -I查看可用的硬件设备。2. 确保使用了正确的GPU驱动。 3. 尝试在命令中添加 -w 3或-w 4以提高工作负载,但会增加系统负荷。 |
zip2john执行报错或提取的哈希为空 | ZIP文件可能使用了不受支持的强加密(如某些AES-256变体),或者文件已损坏。 | 1. 尝试使用其他工具,如fcrackzip(仅限ZipCrypto)先做简单测试。2. 确认ZIP文件没有损坏。 3. 搜索针对特定加密软件(如7-Zip特定版本)的哈希提取工具。 |
4.4 资源管理与优化建议
- 字典管理:
rockyou.txt只是起点。可以收集或生成针对特定目标(如公司名、产品名、本地常见词汇)的定制字典,这比盲目使用超大通用字典更有效。 - 利用硬件:密码破解是计算密集型任务。一块好的显卡(尤其是NVIDIA RTX系列)能带来数量级的速度提升。确保你的Kali虚拟机有足够的CPU核心数和内存分配给主机GPU。
- 会话恢复:
hashcat支持会话恢复。如果破解过程被中断,可以使用--session参数命名一个会话,之后用--restore恢复。例如:hashcat -m 13600 -a 0 --session myzipcrack -o found.txt hash.txt rockyou.txt # 中断后... hashcat --session myzipcrack --restore - 基准测试:在开始真正的破解前,可以用
hashcat -b对你的硬件(CPU/GPU)进行基准测试,了解其大致性能。
整个流程走下来,你会发现技术本身并不神秘,核心在于对工具原理的理解、对细节的把握(尤其是哈希模式的选择),以及耐心和策略。对于自己设置的简单密码,这个方法很可能在几分钟甚至几秒钟内就帮你找回访问权限。但对于真正复杂的密码,它更像是一个提醒:重要的文件,要么用强密码并妥善保管,要么就考虑使用无需密码的加密方式(如通过加密容器Veracrypt),并将密码提示或备份密钥存放在安全的地方。技术是解决问题的钥匙,但良好的安全习惯才是避免问题的根本。
