hashcat 暴力破解 RAR 压缩包密码

RAR被加密了不要扔,裹上鸡蛋液面包糠…

如何破解加密RAR文件?

尝试绕过或删除密码?不好意思,任何宣称此类方法的大概率为骗子

目前想要破解加密RAR只有暴力破解这一条路

关于暴力破解

密码从来都不是以明文方式储存的——储存并用来验证的是由明文密码生成的哈希值

通过特定算法可以将明文字符串转换为定长哈希值,该过程通常是不可逆的,因此无法通过哈希逆向计算出明文

举一个简单的例子,现在有几个明文密码如下:

1
2
3
4
5
6
7
abcd

andy2020

1234

+ouHfgeoY8+/M7wtzzgj

通过SHA256加密后,他们分别为:

1
2
3
4
5
6
7
88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589

0285c86bb5f5b7e7828b18328bd0fe79da92b9f3cc89f296392a4fbeac6bd748

03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4

774eb56fda08df64bf8006e53fd69f8a82e615cfa61bc17fb1ef2fd4d9984e1a

仅从加密后定长的密文来说,是无法分辨明文密码的复杂度的

想要破解这些定长哈希?只有暴力破解一条路可以走

强密码与弱密码

在尝试暴力破解之前,我们先来做一个简单的数学计算

每一位字符可能出现以下几种情况:

字符集 内容 数量
小写字母 a-z 26
大写字母 A-Z 26
数字 0-9 10
符号 «空格»!“#$%&’()*+,-。/:;<=>?@[\]^_`{|}〜 35

综上所述,一个密码的破解难度根据长度不同呈指数级上升。如果密码中还包括中文/日文/阿拉伯文等语言,可以直接放弃了,算到next big bang都算不出来

那么,方法呢?

社工

最有效的破解办法就是从设置密码的人下手

云破解

如果你想要尝试破解一个强密码,很不幸这是几乎不可能的

但你仍然可以去云解密网站(通常是收费的)碰碰运气,这些网站拥有比你本地更强大的算力和也许有用的逆解密库

本地破解

这是本文的重点,目前市面上破解RAR的软件非常多:

  • BandZip
  • PassFab for RAR
  • TrueCrack

然而这些不是收费就是年久失修,并且效果远远不如目前主流的开源破解工具hashcat

hashcat可以调用CUDA运算,是世界上最快最高级的密码破解工具,目前社区非常活跃,文档详细,更新维护及时。下面就简单介绍一下如何使用这套工具链破解加密RAR文件

CUDA

CUDA (Compute Unified Device Architecture) 是NVIDIA推出的基于GPU的并行计算平台,玩过机器学习的一定对CUDA不陌生,两个字“牛逼”就对了

由于我的电脑是2年前安装的CUDA,具体安装细节不记得了,请自行谷歌

john + hashcat

hashcat用于撞哈希,那么如何找到加密RAR的哈希值呢?

这里就要用到john中提供的一个小工具rar2john,它可以将RAR中的密码哈希提取出来

你可以在下面找到这两个工具

rar2john

以下流程在Windows 10平台进行~

下载john的release,找到run\rar2john.exe

对加密RAR文件执行(密码:abcd):

1
.\rar2john.exe "D:\Users\Desktop\1.rar"

程序会提取出哈希值并输出下面的内容:

1
D:\Users\Desktop\1.rar:$rar5$16$36fe9da24ec2f10020ba8a989370c697$15$7d2ce8243b92cc889393233fdba54896$8$72203c88592c67e4

hashcat

有了哈希值,我们便可以使用hashcat进行暴力破解了

先说几个常用参数的意义(更高级的玩法请参考hashcat wiki):

  • -a

    选择攻击方式,一般使用参数 -a 3掩码攻击(有规则约束的暴力穷举)

  • -m

    选择攻击模式,针对不同的hash算法选择规定的值,参见Example hashes

    对于RAR,我们选择:

    • RAR3-hp: 12500
    • RAR5: 13000

    可以由rar2john提取出的hash值分辨出

  • 字符集

    • ?l: abcdefghijklmnopqrstuvwxyz
    • ?u: ABCDEFGHIJKLMNOPQRSTUVWXYZ
    • ?d: 0123456789
    • ?h: 0123456789abcdef
    • ?H: 0123456789ABCDEF
    • ?s: «space»!"#$%&'()*+,-./:;<=>?@[\]^_{|}~
    • ?a: ?l?u?d?s
    • ?b: 0x00 - 0xff

    除此之外,还可以自定义字符集,参见Mask Attack

    例:?a?l?l?l?d?d?d?d 代表第一位为任意字符,第二到第四位为小写字母,后四位为数字

  • --increment

    自增遍历模式(不确定密码长度的情况)

  • --increment-min

    规定自增模式密码最短的长度

  • --increment-max

    规定自增模式密码最长的长度

Crack Start!

复制rar2john得到的哈希值,执行:

1
.\hashcat.exe -m 13000 -a 3 '$rar5$16$36fe9da24ec2f10020ba8a989370c697$15$7d2ce8243b92cc889393233fdba54896$8$72203c88592c67e4' ?a?a?a?a

即对应 RAR5 进行掩码攻击,寻找4位长度随机字符的密码

注意在 Bash 和 Powershell 中,$ 的含义为变量,需要用单引号括起来才可以使用

查看输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
hashcat (v6.1.1) starting...

* Device #1: WARNING! Kernel exec timeout is not disabled.
This may cause "CL_OUT_OF_RESOURCES" or related errors.
To disable the timeout, see: https://hashcat.net/q/timeoutpatch
* Device #2: WARNING! Kernel exec timeout is not disabled.
This may cause "CL_OUT_OF_RESOURCES" or related errors.
To disable the timeout, see: https://hashcat.net/q/timeoutpatch
* Device #3: Unstable OpenCL driver detected!

This OpenCL driver has been marked as likely to fail kernel compilation or to produce false negatives.
You can use --force to override this, but do not report related errors.

nvmlDeviceGetFanSpeed(): Not Supported

CUDA API (CUDA 10.2)
====================
* Device #1: GeForce GTX 1050 Ti, 3376/4096 MB, 6MCU

OpenCL API (OpenCL 1.2 CUDA 10.2.150) - Platform #1 [NVIDIA Corporation]
========================================================================
* Device #2: GeForce GTX 1050 Ti, skipped

OpenCL API (OpenCL 2.1 ) - Platform #2 [Intel(R) Corporation]
=============================================================
* Device #3: Intel(R) HD Graphics 630, skipped
* Device #4: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz, skipped

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates

Applicable optimizers applied:
* Zero-Byte
* Single-Hash
* Single-Salt
* Brute-Force
* Slow-Hash-SIMD-LOOP

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 169 MB

注意第18行,设备 #1 没有skip,即使用了CUDA进行运算

我使用的17年款游戏本,配置为GTX1050Ti,使用CUDA进行运算约为11000个密码每秒

查看当前运行状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Session..........: hashcat
Status...........: Running
Hash.Name........: RAR5
Hash.Target......: $rar5$16$36fe9da24ec2f10020ba8a989370c697$15$7d2ce8...2c67e4
Time.Started.....: Fri Aug 28 17:02:51 2020 (42 secs)
Time.Estimated...: Fri Aug 28 19:05:54 2020 (2 hours, 2 mins)
Guess.Mask.......: ?a?a?a?a [4]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 11034 H/s (8.51ms) @ Accel:4 Loops:128 Thr:1024 Vec:1
Recovered........: 0/1 (0.00%) Digests
Progress.........: 442368/81450625 (0.54%)
Rejected.........: 0/442368 (0.00%)
Restore.Point....: 0/857375 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:18-19 Iteration:13696-13824
Candidates.#1....: nari -> n!^s
Hardware.Mon.#1..: Temp: 71c Util: 99% Core:1733MHz Mem:3504MHz Bus:8

注意到4位长度密码暴力破解需要尝试 $81450625(95^4)$ 次,按照我这块显卡的性能需要破解2个小时

由此可得:

  • 5位随机:8天
  • 6位随机:25个月
  • 7位随机:198年
  • 8位随机:18.6个世纪

如果知道密码的线索来约束随机范围的话,耗费的时间会少很多

而且这是最坏的情况,万一运气好呢?

比如这个预计2小时的密码 abcd,我用了14分钟就跑出来了…

关于如何加强密码强度

破解说完了,来说说反破解

目前流行的密码管理解决方案为随机生成强密码 + 密码管理软件(如 Bitwarden,1Password 等),基于此方案,我不知道我有账号的几百个网站任何一个的密码(就算绑架我也没用

一个简单的生成随机密码的方法:

1
2
# 生成16位随机密码
openssl rand -base64 16

除此之外:

  • 一定要包含一个符号,这可以让解密难度提升NNNN倍
  • 8位数以上,只有量子计算机可破
  • 不同网站设置不同密码,防止某些网站泄露数据库
  • 万物 over TLS

需要注意的是,某些本地加密软件(如WD Security)

如果忘记了密码真的是神仙也救不了…