Appearance
使用 hashcat 破解密码
1. 简介
hashcat 号称世界上最快的密码破解,多平台(OpenCL 和 CUDA 支持)、多算法、资源利用率低、基于字典攻击、支持分布式破解等等。hashcat 目前市面上面公开的密码加密算法基本都支持。hashcat 在硬件上支持使用 CPU、NVIDIA GPU、ATI GPU 来进行密码破解。在操作系统上支持 Windows、Linux 平台,并且需要安装官方指定版本的显卡驱动程序,如果驱动程序版本不对,可能导致程序无法运行。
2. 前期准备
2.1. hashcat 驱动要求
- AMD GPUs on Linux require "AMDGPU" (21.50 or later) and "ROCm" (5.0 or later)
- AMD GPUs on Windows require "AMD Adrenalin Edition" (Adrenalin 22.5.1 exactly)
- Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later)
- NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or later)
2.2. GPU 驱动安装
如果用的是 N 卡,则需要同时安装 NVIDIA 驱动和 CUDA,需要特别注意的是,在安装 CUDA 的时候需要选择与 NVIDIA 驱动兼容的版本,兼容性列表可以在这里查。
2.3. CPU 驱动安装
如果机器上没有安装 GPU 或 GPU 性能不高则也可以考虑使用 CPU 执行 hashcat:Intel OpenCL 下载地址。

实际上这里选择下载 SDK 或 Runtime 都行,因为目前我们只需要 OpenCL 的 Runtime 支持即可,所以我们选择下载 Runtime 就行了。
根据自己的需要下载 Linux 或 Windows 版本的驱动:

2.3.1. Linux
直接选择适合自己的包管理器进行下载安装:

Intel oneAPI Base Toolkit 的默认安装路径在 /opt/intel/oneapi 或 ~/intel/oneapi(具体取决于是否是系统范围内安装)。
在安装完 oneAPI 之后,我们还需要安装下 cmake、pkg-config、make、gcc、g++,以 Debian 为例:
Bash
$ sudo apt updateBash
$ sudo apt -y install cmake pkg-config build-essentialNote:在 Debian 中可以通过安装
build-essential来安装 GCC 编译器。
在 oneAPI 的安装路径下,有一个 setvars.sh 的文件,这个文件包含了你所安装的所有 oneAPI 工具包的环境变量。如果只是临时使用 oneAPI,则只需要在每次使用之前执行命令 source /opt/intel/oneapi/setvars.sh 即可;若需要长期生效也不难,咱们只需要在 /etc/profile 或者 ~/.bashrc 里面 source 它即可。如下图为我在 ~/.bashrc 文件中设置 oneAPI 的环境变量的步骤:
修改用户环境变量文件,在
~/.bashrc的末尾加入如下语句:Bash$ source /opt/intel/oneapi/setvars.sh使环境变量立即生效:
Bash$ source ~/.bashrc
2.3.2. Windows
Intel oneAPI Base Toolkit 包含了 OpenCL CPU runtime。但是在安装它之前我们需要先安装它的依赖,也就是 Visual Studio/Visual Studio Build Tools。
这里我们选择安装 Visual Studio Build Tools:

等待其安装完成后,再安装 oneAPI 即可。
2.4. 安装 hashcat
2.4.1. Linux
这里我们选择编译源码的方式进行安装,
安装编译 hashcat 所需的工具依赖:
make、gcc、g++:Debian 命令参考:
Bash$ apt install -y make gcc g++下载
hashcat sources:Bash$ cd ~Bash$ wget https://hashcat.net/files/hashcat-6.2.6.tar.gz解压
Bash$ tar -xf hashcat-6.2.6.tar.gz -C /usr/local/src编译 & 安装
Bash$ cd /usr/local/src/hashcat-6.2.6/Bash$ makeBash$ make install
安装好的 hashcat 在 /usr/local/bin/hashcat 目录下。
2.4.2. Windows
直接选择 hashcat binaries 下载就行,直接解压无需安装。
2.5. 安装 john
john 实际上是非必须的,但是如果需要破解 RAR 或 ZIP 之类的压缩文件时,我们需要通过它先获取文件的 hash。
3. hashcat 使用说明
3.1. 参数
下面是常见的参数,想了解更多的参数可以使用 hashcat --help 命令查看:
| 参数 | 说明 |
|---|---|
-a | 指定要使用的破解模式,其值参考后面对参数,-a 0 字典攻击、-a 1 组合攻击、-a 3 掩码攻击 |
-m | 指定要破解的 hash 类型,如果不指定类型,则默认是 MD5 |
-o | 指定破解成功后的 hash 及所对应的明文密码的存放位置,可以用它把破解成功的 hash 写到指定的文件中 |
--force | 忽略破解过程中的警告信息,跑单条 hash 可能需要加上此选项 |
--show | 显示已经破解的 hash 及该 hash 所对应的明文 |
--increment | 启用增量破解模式,你可以利用此模式让 hashcat 在指定的密码长度范围内执行破解过程 |
--increment-min | 密码最小长度,后面直接等于一个整数即可,配和 increment 模式一起使用 |
--increment-max | 密码最大长度,后面直接等于一个整数即可,配和 increment 模式一起使用 |
--outfile-format | 指定破解结果的输出格式 id,默认是 3 |
--username | 忽略 hash 文件中的指定的用户名,在破解 linux 系统用户密码 hash 可能会用到 |
--remove | 删除已被破解成功的 hash |
-r | 使用自定义破解规则 |
3.1.1. 破解模式
| 参数 | 说明 |
|---|---|
0 | Straight(字段破解) |
1 | Combination(组合破解) |
3 | Brute-force(掩码暴力破解) |
6 | Hybrid Wordlist + Mask(字典 + 掩码破解) |
7 | Hybrid Mask + Wordlist(掩码 + 字典破解) |
3.1.2. hash 类型对照表
在 hashcat wiki 板块中,找到 Example hashes,这里我们可以看到所有的 hash 类型。


3.1.3. 掩码设置
这里列一下常见的掩码字符集:
| 参数 | 示例 | 说明 |
|---|---|---|
l | abcdefghijklmnopqrstuvwxyz | 纯小写字母 |
u | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 纯大写字母 |
d | 0123456789 | 纯数字 |
h | 0123456789abcdefghijklmnopqrstuvwxyz | 常见小写子母和数字 |
H | 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ | 常见大写字母和数字 |
s | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ | 特殊字符 |
a | ?l?u?d?s | 键盘上所有可见的字符 |
b | 0x00 - 0xff | 单字节字符 |
下面举几个简单的例子来了解一下掩码的设置
| 示例 | 说明 |
|---|---|
?d?d?d?d?d?d?d?d | 八位数字密码 |
?a?a?a?a?a?a?a?a | 八位未知密码 |
?u?u?u?u?d?d?d?d | 前四位为大写字母,后面四位为数字 |
?h?h?h?h?H?H?H?H | 前四位为数字或者是小写字母,后四位为大写字母或者数字 |
?a?a?aadmin?a?a?a | 前三个字符未知,中间为 admin,后三位未知 |
--increment --increment-min 6 --increment-max 8 ?l?l?l?l?l?l?l?l | 6-8 位数字密码 |
--increment --increment-min 6 --increment-max 8 ?h?h?h?h?h?h?h?h | 6-8 位数字 + 小写字母密码 |
如果我们想设置字符集为:abcd123456!@-+,那该怎么做呢。这就需要用到自定义字符集这个参数了,hashcat 支持用户最多定义 4 组字符集:
--custom-charset1 [chars]等价于-1 [chars]--custom-charset2 [chars]等价于-2 [chars]--custom-charset3 [chars]等价于-3 [chars]--custom-charset4 [chars]等价于-4 [chars]
在掩码中用 ?1、?2、?3、?4 来表示。
再来举几个例子:
--custom-charset1 abcd123456!@-+,然后我们就可以用?1去表示这个字符集;--custom-charset2 ?l?d,这里和?2就等价于?h;-1 ?d?l?u,?1就表示数字 + 小写字母 + 大写字母;-3 abcdef -4 123456那么?3?3?3?3?4?4?4?4就表示为前四位可能是abcdef,后四位可能是123456;
3.1.4. 设备选择
使用 hashcat -I 可以查看所有的设备信息。
-d:等同于--backend-devices,指定设备 Id;-D:等同于--opencl-device-types,指定 OpenCL 设备 Id;
可以同时指定多个设备,hashcat 会自动选择其中一个最适合的设备运行。
Note:如果同时指定了
-d和-D参数,则-D参数将被忽略。
在 hashcat 的 GitHub 中有个 Issue 讲的挺清楚的。
3.2. 示例
3.2.1. 7 位数字破解
Bash
$ hashcat -a 3 25c3e88f81b4853f2a8faacad4c871b6 ?d?d?d?d?d?d?d3.2.2. 7 位小写字母破解
Bash
$ hashcat -a 3 7a47c6db227df60a6d67245d7d8063f3 ?l?l?l?l?l?l?l3.2.3. 1-8 位数字破解
Bash
$ hashcat -a 3 4488cec2aea535179e085367d8a17d75 --increment --increment-min 1 --increment-max 8 ?d?d?d?d?d?d?d?d3.2.4. 1-8 位小写字母 + 数字破解
Bash
$ hashcat -a 3 ab65d749cba1656ca11dfa1cc2383102 --increment --increment-min 1 --increment-max 8 ?h?h?h?h?h?h?h?h3.2.5. 特定字符集
这里我们假设特定字符集为 123456abcdf!@+-:
Bash
$ hashcat -a 3 -1 123456abcdf!@+- 8b78ba5089b11326290bc15cf0b9a07d ?1?1?1?1?1Note:这里的
-1和?1是数字 1,不是字母 l。
3.2.6. 1-8 位特定字符集
这里我们假设特定字符集为 123456abcdf!@+-:
Bash
$ hashcat -a 3 -1 123456abcdf!@+- 9054fa315ce16f7f0955b4af06d1aa1b --increment --increment-min 1 --increment-max 8 ?1?1?1?1?1?1?1?13.2.7. 1-8 位(数字 + 大小写字母 + 可见特殊符号)
写法一:
Bash
$ hashcat -a 3 -1 ?l?u?d?s d37fc9ee39dd45a7717e3e3e9415f65d --increment --increment-min 1 --increment-max 8 ?1?1?1?1?1?1?1?1写法二:
Bash
$ hashcat -a 3 d37fc9ee39dd45a7717e3e3e9415f65d --increment --increment-min 1 --increment-max 8 ?a?a?a?a?a?a?a?a3.2.8. 字典破解
-a 0 指定字典破解模式,-o 输出结果到文件中:
Bash
$ hashcat -a 0 ede900ac1424436b55dc3c9f20cb97a8 dic.txt -o result.txt3.2.9. 批量破解
Bash
$ hashcat -a 0 target.txt dic.txt -o result.txt3.2.10. 字典组合破解
Bash
$ hashcat -a 1 25f9e794323b453885f5181f1b624d0b dic1.txt dic2.txt3.2.11. 字典 + 掩码破解
Bash
$ hashcat -a 6 9dc9d5ed5031367d42543763423c24ee dic.txt ?l?l?l?l?l3.2.12. SHA512 破解
可以 cat /etc/shadow 获取。
Bash
$ hashcat -a 3 -m 1800 $6$mxuA5cdy$XZRk0CvnPFqOgVopqiPEFAFK72SogKVwwwp7gWaUOb7b6tVwfCpcSUsCEk64ktLLYmzyew/xd0O0hPG/yrm2X. ?l?l?l?l不用整理用户名,使用 --username:
Bash
$ hashcat -a 3 -m 1800 qiyou:$6$QDq75ki3$jsKm7qTDHz/xBob0kF1Lp170Cgg0i5Tslf3JW/sm9k9Q916mBTyilU3PoOsbRdxV8TAmzvdgNjrCuhfg3jKMY1 ?l?l?l?l?l --username3.2.13. MySQL

Bash
$ hashcat -a 3 -m 300 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 ?d?d?d?d?d?d3.2.14. MSSQL
Bash
$ hashcat -a 3 -m 132 0x01008c8006c224f71f6bf0036f78d863c3c4ff53f8c3c48edafb ?l?l?l?l?l?d?d?d3.2.15. RAR
首先用 rar2john 获取 rar 文件的 hash 值,执行命令 rar2john 1.rar,输出:
Text
rar:$rar5$16$639e9ce8344c680da12e8bdd4346a6a3$15$a2b056a21a9836d8d48c2844d171b73d$8$04a52d2224ad082e破解:
Bash
$ hashcat -a 3 -m 13000 $rar5$16$639e9ce8344c680da12e8bdd4346a6a3$15$a2b056a21a9836d8d48c2844d171b73d$8$04a52d2224ad082e ?d?d?d?d?d?dhashcat 支持 RAR3-hp 和 RAR5,官方示例如下:
-m 参数 | 类型 | 示例 hash |
|---|---|---|
12500 | RAR3-hp | $RAR3$*0*45109af8ab5f297a*adbf6c5385d7a40373e8f77d7b89d317 |
13000 | RAR5 | $rar5$16$74575567518807622265582327032280$15$f8b4064de34ac02ecabfe |
3.2.16. ZIP
首先用 zip2john 获取 zip 文件的 hash 值,执行命令 zip2john 1.zip,输出:
Text
1.zip:$zip2$*0*3*0*554bb43ff71cb0cac76326f292119dfd*ff23*5*24b28885ee*d4fe362bb1e91319ab53*$/zip2$:::::1.zip-1.txt破解:
Bash
$ hashcat -a 3 -m 13600 $zip2$*0*3*0*554bb43ff71cb0cac76326f292119dfd*ff23*5*24b28885ee*d4fe362bb1e91319ab53*$/zip2$ ?d?d?d?d?d?d3.2.17. Windows NT-hash,LM-hash 破解
可以用 saminside 获取 NT-hash,LM-hash 的值:

NT-hash:
Bash
$ hashcat -a 3 -m 1000 209C6174DA490CAEB422F3FA5A7AE634 ?l?l?l?l?lLM-hash:
Bash
$ hashcat -a 3 -m 3000 F0D412BD764FFE81AAD3B435B51404EE ?l?l?l?l?l3.2.18. wordpress 密码 hash 破解
具体加密脚本在 ./wp-includes/class-phpass.php 的 HashPassword 函数。
Bash
$ hashcat -a 3 -m 400 $P$BYEYcHEj3vDhV1lwGBv6rpxurKOEWY/ ?d?d?d?d?d?d3.2.19. discuz 用户密码 hash 破解
其密码加密方式 md5(md5($pass).$salt)。
Bash
$ hashcat -a 3 -m 2611 14e1b600b1fd579f47433b88e8d85291: ?d?d?d?d?d?d3.2.20. 破解 office 密码
获取 office 的 hash 值:python office2john.py 11.docx,输出:
Text
11.docx:$office$*2013*100000*256*16*e4a3eb62e8d3576f861f9eded75e0525*9eeb35f0849a7800d48113440b4bbb9c*577f8d8b2e1c5f60fed76e62327b38d28f25230f6c7dfd66588d9ca8097aabb9破解:
Bash
$ hashcat -a 3 -m 9600 $office$*2013*100000*256*16*e4a3eb62e8d3576f861f9eded75e0525*9eeb35f0849a7800d48113440b4bbb9c*577f8d8b2e1c5f60fed76e62327b38d28f25230f6c7dfd66588d9ca8097aabb9 ?d?d?d?d?d?d3.2.21. 破解 WIFI 密码
首先把我们的握手包转化为 hccapx 格式,现在最新版的 hashcat 只支持 hccapx 格式了,以前的 hccap 格式已经不支持了。
官方在线转化地址:https://hashcat.net/cap2hccapx/。
Bash
$ hashcat -a 3 -m 2500 1.hccapx 1391040?d?d?d?d3.3. Others
- 对于破解过的 hash 值,用
hashcat hash --show查看结果; - 所有的 hash 破解结果都在
hashcat.potfile文件中; - 如果破解的时间太长,可以按
s键可以刷新进度,p暂停、r继续、q退出破解; - 在使用 GPU 模式进行破解时,可以使用
-O参数自动进行优化; - 在实际破解中的建议,如果我们盲目的去破解,会占用我们大量的时间和资源:
- 首先走一遍常用的弱口令字典;
- 组合密码,如:zhang1999,用姓氏和出生年组合,当然也可以用其它的组合,这里举个例子而已;
- 把常用的掩码组合整理起来放在 masks 中的
.hcmask文件中,然后让它自动加载破解; - 如果实在不行,你可以尝试低位数的所有组合去跑,不过不建议太高位数的组合去破解,因为如果对方设置的密码很复杂的话,到头来你密码没有破解到,却浪费了大量的时间和资源,得不偿失;
- hashcat 参数优化,考虑到 hashcat 的破解速度以及资源的分配,我们可以对一些参数进行配置:
- Workload tuning 负载调优:该参数支持的值有
1、8、40、80、160,--gpu-accel 160可以让 GPU 发挥最大性能; - Gpu loops 负载微调:该参数支持的值的范围是
8-1024(有些算法只支持到1000),--gpu-loops 1024可以让 GPU 发挥最大性能; - Segment size 字典缓存大小:该参数是设置内存缓存的大小,作用是将字典放入内存缓存以加快字典破解速度,默认为 32MB,可以根据自身内存情况进行设置,
--segment-size 512可以提高大字典破解的速度;
- Workload tuning 负载调优:该参数支持的值有
4. 示例:破解 RAR5
首先我们自行创建一个基于 RAR5 的加密压缩文件
winrar.rar,并将放置在john-1.9.0-jumbo-1-win64\run\crack文件夹下(john-1.9.0-jumbo-1-win64是 john 压缩包解压后的文件夹,crack文件夹需要自行手动创建);打开控制台,并进入到
john-1.9.0-jumbo-1-win64\run文件夹下,执行rar2john crack/winrar.rar命令:PowerShellD:\john-1.9.0-jumbo-1-win64\run>rar2john crack/winrar.rar crack/winrar.rar:$rar5$16$d56880ce41ad8873768079adba32ec27$15$86a8ba55f889cd4ec028c97925457bdf$8$3df5048372bc6c561
2我们将
:后面的那段复制出来,也就是:Text$rar5$16$d56880ce41ad8873768079adba32ec27$15$86a8ba55f889cd4ec028c97925457bdf$8$3df5048372bc6c56Note
如果是 zip 文件,则需要使用
zip2john命令,且输出可能如下:PowerShellD:\john-1.9.0-jumbo-1-win64\run>zip2john crack/javacore.zip ver 2.0 javacore.zip/javacore.pdf PKZIP Encr: cmplen=0, decmplen=263297592, crc=5DF7A6A1 javacore.zip/javacore.pdf:$pkzip2$1*1*2*0*0*fb19a38*5df7a6a1*0*59*8*0*5df7*7f52**$/pkzip2$:javacore.pdf:javacore.zip::crack/javacore.zip1
2
3这里的输出不像 RAR 那么简洁,我们只需要
pkzip2这一段就行,也就是:Text$pkzip2$1*1*2*0*0*fb19a38*5df7a6a1*0*59*8*0*5df7*7f52**$/pkzip2$将控制台切换至
hashcat-6.2.6文件夹(hashcat 压缩包解压后的文件夹):执行:
PowerShellhashcat -a 3 -m 13000 $rar5$16$d56880ce41ad8873768079adba32ec27$15$86a8ba55f889cd4ec028c97925457bdf$8$3df5048372bc6c56等待命令执行完成之后,使用以下命令查看破解后的密码:
PowerShellhashcat -m 13000 $rar5$16$d56880ce41ad8873768079adba32ec27$15$86a8ba55f889cd4ec028c97925457bdf$8$3df5048372bc6c56 --show