使用Hashcat破解ZIP压缩包密码探索记录

本文最后更新于 2025年8月6日 上午

Hashcat 被誉为世界上最快的密码破解工具,本文只是一个入门探索,通过一个破解 ZIP 压缩包密码的示例,展示如何使用Hashcat。

1 什么是密码哈希

Hashcat的输入不是什么压缩包,而是需要密码哈希。简单来说,哈希是一种将任意长度的数据(如你的密码 “kuon.ilove”)通过一个数学算法转换成一个固定长度的、独一无二的字符串的过程。 你可以把它想象成一个数字指纹生成器,它具备:

  • 单向性: 从你的密码生成哈希很容易,但从哈希反推出原始密码在数学上是极其困难的,近乎不可能。
  • 唯一性: 即使密码只有微小的改变(例如 “kuon123” 和 “kuoN123”),生成的哈希值也会截然不同。
  • 固定长度: 无论你的密码是 “123” 还是 “111112222233333”,生成的哈希值长度都是固定的。

当你在 ZIP 文件上设置密码时,ZIP 程序并不是直接存储你的密码原文,而是存储其哈希值。当你尝试解压时,程序会把你输入的密码进行哈希运算,然后将结果与存储的哈希值进行比较。如果两个“数字指纹”匹配,文件就会被解开。

那为什么需要破解哈希,而不是直接破解ZIP?

因为直接对 ZIP 文件进行密码尝试效率极低。而将密码哈希提取出来后,我们可以利用 Hashcat 和强大的 GPU 资源,以惊人的速度进行数十亿次的“哈希比较”操作,这正是密码破解的核心所在。

2 从ZIP中提取哈希

Hashcat没办法从ZIP中获取哈希,得使用另一个工具:John the Ripper,它其实也是个密码破解工具,只是速度没Hashcat快。所有这里只用它来获取哈希值。

官网中下载对应系统的软件,我这里用的是john-1.9.0-jumbo-1-win64,这个就是软件主体,而我们需要的工具在john-1.9.0-jumbo-1-win64\run下,名为zip2john.exe

现在,我们需要破解的ZIP文件为:E:\test1.zip
然后创建一个保存bash的文件:E:\zip.bash

执行zip2john.exe

1
2
zip2john.exe E:\test1.zip > E:\zip.hash
ver 2.0 test1.zip/1.srt PKZIP Encr: cmplen=2858, decmplen=7007, crc=63342C41

如果你只想控制台打印,手动复制,就删除> E:\zip.hash

1
2
3
4
5
(base) PS E:\john-1.9.0-jumbo-1-win64\run> zip2john.exe E:\test1.zip
ver 2.0 test1.zip/1.srt PKZIP Encr: cmplen=2858, decmplen=7007, crc=63342C41
test1.zip/1.srt:$pkzip2$1*1*2*0*b2a*1b5f*63342c41*0*23*8*b2a*6334*83c5*e5bcb35c3711c5d53237c40ed463e0a53c857ca519a656643c57cb74715bd3a0fc2f747e8c262b426cdd287e731ecc3c34a7fdd1b2
省略
82096973a559362a2a8d22ec8e9b21d0fc0bac233e11ae1bbfd3f07abb7d7a94f4db3353b2328823b94903b8800a385304d59c45a34ef1307d7aabd489170703d2e15c62c064587b226*$/pkzip2$:1.srt:test1.zip::E:\test1.zip

这串看起来复杂的字符就是我们需要的哈希。其中 $pkzip2$ 是一个重要的标识符,它告诉我们这是何种类型的哈希。最终字符串只能被$/pkzip2$包裹,所有需要手动删除下抬头的test1.zip/1.srt:和结尾的:1.srt:test1.zip::E:\test1.zip

john还有个GUI,johnny,需要额外下载和安装,就没用。

现在,我们已经准备好将它交给 Hashcat 处理了。

3 攻击模式

首先下载hashcat,解压后进入文件夹hashcat-7.0.0,测试命令hashcat.exe -h,命令表可以看hashcat的wiki

Hashcat命令的-a参数用来控制攻击模式,可以理解为选择不同的战术,

  • -a 0 | 字典攻击 (Straight Attack)
    这是最基本也是最常用的模式。你提供一个包含大量潜在密码的文本文件(称为“字典”或“词典”),Hashcat 会逐一尝试其中的每一个词。
    • 适用场景: 猜测密码是常见的单词、短语、泄露过的密码等
  • -a 1 | 组合攻击 (Combination Attack)
    这个模式会取两个字典,然后将第一个字典中的每个词与第二个字典中的每个词进行组合。
    • 适用场景: 猜测密码是由两个单词组合而成,如 lovebird 或 dragonfly
  • -a 3 | 掩码攻击 (Mask Attack)
    这是后面即将使用的模式,也是最强大、最灵活的模式。它不是使用现成的词典,而是根据你定义的“掩码”(一个包含字符集和固定字符的模板)来动态生成密码候选
    • 适用场景: 当你能猜测出密码的部分结构时。
  • -a 6 | 混合攻击 (Hybrid: Wordlist + Mask)
    字典攻击和掩码攻击的结合。它会取字典中的每一个词,然后在词的末尾附加由掩码生成的字符。
    • 适用场景: 猜测密码是在一个常用词后面加了数字或符号,如 password123。
  • -a 7 | 混合攻击 (Hybrid: Mask + Wordlist)
    与 -a 6 相反,它会在字典词的前面附加掩码生成的字符。
    • 适用场景: 猜测密码是在一个常用词前面加了特殊字符或年份,如 @admin 或 2024admin。

这里懒得弄Wordlist,于是使用掩码攻击模式。
如果想要使用字典模式,可以在网上找到些:pentest-everythingPassphrase wordlist

4 掩码攻击

在密码破解的世界里,效率就是一切。当面对一个未知的密码哈希时,我们如同在浩瀚的宇宙中寻找一颗特定的星星。暴力破解,即尝试所有可能的字符组合,虽然理论上可行,但在现实中往往因为耗时过长而变得不切实际。这时,一种更智能、更高效的攻击方式——掩码攻击(Mask Attack)便应运而生。

简而言之,掩码攻击就是我们提前预判密码可能的情况,在限定的情况下进行尝试,毕竟人类在创建密码时往往会遵循一些可预测的模式。

现在我猜测这个压缩包的密码是个域名,最大只有10位,现在来编写数据集和掩码。(如果传统暴力破解,轮询所有字符,估计得跑几年)

Hashcat 为我们提供了一系列方便的内置字符集:

  • ?l = abcdefghijklmnopqrstuvwxyz
  • ?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • ?d = 0123456789
  • ?s = «空格»!”#$%&’()*+,-./:;<=>?@[]^_`{|}~
  • ?a = ?l?u?d?s (即以上所有字符的组合)
  • ?b = 0x00 - 0xff (所有可能的字节)

当内置字符集无法满足你精细化的需求时,可以使用自定义字符集。Hashcat 提供了四个参数 -1, -2, -3, -4来定义它们

例如,要定义一个只包含小写字母和数字的字符集,可以使用以下任意一种方式

1
2
3
-1 ?l?d
-1 abcdefghijklmnopqrstuvwxyz?d
-1 ?l0123456789

现在我猜测的密码是域名,那么字符集是三个:

  • 小写字符
  • 数字0-9
  • 点号

数据集则是:

1
-1 abcdefghijklmnopqrstuvwxyz0123456789.

猜测域名可能最长10字符,最短3字符,那么最后结果为:

1
-1 abcdefghijklmnopqrstuvwxyz0123456789. --increment --increment-min=4 --increment-max=10 hash.txt ?1?1?1?1?1?1?1?1?1?1

这个参数的意思就是使用自定义数据集,自动尝试4到10位。

5 哈希类型

-m 参数用于告诉 Hashcat 你要破解的哈希属于哪种类型。世界上有成百上千种哈希算法(MD5, SHA-256, bcrypt, PKZIP…),每一种算法的计算方式都不同。

想象一下,每种哈希类型都是一把形状独特的锁。你必须告诉 Hashcat 你要开的是哪一把锁,它才能制造出正确形状的钥匙去尝试。如果你提供了一个 PKZIP 的哈希,却告诉 Hashcat 这是 MD5 哈希(-m 0),那么 Hashcat 生成的所有“钥匙”都将是错误形状的,无论它尝试多少次、速度有多快,结果永远是失败。

我们可以在hashcat wiki中找到支持的哈希类型。

比如ZIP相关:

模式号 含义 适用情况
17200 PKZIP (Compressed) 最常用,绝大多数单文件/常规 ZIP
17220 PKZIP (Compressed Multi-File) 多文件压缩包(含多个文件/目录)
17225 PKZIP (Mixed Multi-File) 多种压缩方法混合的多文件 ZIP
17230 PKZIP (Mixed Multi-File Checksum-Only) 混合多文件且仅校验和
17210 PKZIP (Uncompressed) 未压缩的 ZIP(极少见)
20500 PKZIP Master Key 主密钥破解(极罕见场景)
20510 PKZIP Master Key (6 byte optimization) 主密钥破解特殊优化

绝大多数情况下,直接用 -m 17200 就好了。

6 开始破解吧~

根据上面的结果,组合命令,在hashcat-7.0.0目录下执行:

1
hashcat -a 3 -m 17200 -1 abcdefghijklmnopqrstuvwxyz0123456789. --increment --increment-min=4 --increment-max=10 E:\zip.hash ?1?1?1?1?1?1?1?1?1?1

在运行中有一些功能:


  1. [s]tatus
    功能: 查看当前破解进度和状态。
    用法: 直接按 s 键。
    说明: hashcat 会立即在终端输出当前的破解进度、速度、已尝试密码数量、剩余时间等详细信息。

  1. [p]ause
    功能: 暂停破解过程。
    用法: 直接按 p 键。
    说明: 程序会暂停,进入挂起状态。你可以稍后按 r(resume)键恢复破解。

  1. [b]ypass
    功能: 跳过当前任务。
    用法: 直接按 b 键。
    说明: 如果你设置了多个 hash 或任务,b 可以跳过当前的 hash 或任务,进入下一个。

  1. [c]heckpoint
    功能: 立即生成一个恢复点(checkpoint)。
    用法: 直接按 c 键。
    说明: hashcat 会立刻保存当前破解进度到恢复文件(.restore),方便你以后中断后恢复进度。

  1. [f]inish
    功能: 完成当前任务后自动退出。
    用法: 直接按 f 键。
    说明: hashcat 会在当前破解任务完成后自动退出,而不是等待所有任务都结束。

  1. [q]uit
    功能: 立即退出 hashcat。
    用法: 直接按 q 键。
    说明: 程序会立刻终止,当前进度会被保存到恢复文件(.restore),下次可以恢复。

我设备是核显Graphics 750,独显3060-8G,I7-i1700@2.5GHz。8位以下用了一小时,第九位时预估时间是34个小时,呃- -|,之前只有小写字母测试十几分钟就跑完了,现在加上数字后,数量级就爆炸了。

最终跑完用了70分钟:

最终结果会被保存到hashcat.potfile中,当然控制台也会打印

7结语

本文告诉大家,设置密码的时候尽量长一点,尽量使用不同类型的字符!


使用Hashcat破解ZIP压缩包密码探索记录
https://blog.kala.love/posts/eec74516/
作者
久远·卡拉
发布于
2025年8月6日
许可协议