拿到了一个被加密的Excel,要求输入密码才能打开,于是尝试了下密码破解方法。

AROP破解

AROP(ADVANCED OFFICEPASSWORD RECOVERY)好像是比较主流的Office的破解工具,有收费版和免费版,区别在于密码长度是否超过4字节。
用了一个虚拟机跑了一下,字典查询没有,于是暴力破解,嗯,破解速度比较令人绝望,毕竟是CPU在跑。
将该Excel文件解压之后,可以发现里面包含DataSpaceEncryptedPackage以及EncryptionInfo等文件,打开EncryptionInfo文件,可以看到里面加密的一些信息:

1

2

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<encryption xmlns="http://schemas.microsoft.com/office/2006/encryption" xmlns:p="http://schemas.microsoft.com/office/2006/keyEncryptor/password" xmlns:c="http://schemas.microsoft.com/office/2006/keyEncryptor/certificate"><keyData saltSize="16" blockSize="16" keyBits="256" hashSize="64" cipherAlgorithm="AES" cipherChaining="ChainingModeCBC" hashAlgorithm="SHA512" saltValue="tLnK9YHGccHAgMyj9Nuwmg=="/><dataIntegrity encryptedHmacKey="wF7fTyyf/qhB8Vg+8fvQcspTyuR7cc2+yjIyuEAF0O8avnv0LxYhw+DaVmikzCbFDjLgFCAj6+C6m6iJdhuknA==" encryptedHmacValue="IK7Xc7/e0AVLERogsLvFl912xsbhw+oRKd/ABUwE5vw5iQtcAkM0K0rjz+gB8UlDDJlGbQx0HOKWypF3EDbqcA=="/><keyEncryptors><keyEncryptor uri="http://schemas.microsoft.com/office/2006/keyEncryptor/password"><p:encryptedKey spinCount="100000" saltSize="16" blockSize="16" keyBits="256" hashSize="64" cipherAlgorithm="AES" cipherChaining="ChainingModeCBC" hashAlgorithm="SHA512" saltValue="wisEIaAFG08tJoh3tD0Bqw==" encryptedVerifierHashInput="ZMMqH6NC6xpnsH8zBXtfyA==" encryptedVerifierHashValue="mEcTV0662f/U1+nndKsBiv+L/CsAusbw+So+pA4g8TBKq70rNYy7nkZk+tYB6M/fFZdBfRH4363GRI4m8WPk6Q==" encryptedKeyValue="xUZ5hE+Tzhim5YcUf7KOA5Z1jAG+cTaOGRd859sCkPA="/></keyEncryptor></keyEncryptors></encryption>

其中,采用的是AES算法,有盐(salt,指随机的数据,加入到哈希的过程中,加大破解难度),hash算法是SHA512,spinCount=100000经过了100000次的迭代操作,想直接逆向破解,实在太难。字典尝试无效,只能暴力破解,但是随着密码长度增加,以及字母数字、特殊字符的引入,破解难度指数增长。对于纯小写字母的6位密码,复杂度为$26^6 = 308915776$次,七位则超过了80亿次,指望这个靠CPU计算的软件,实际希望不大,跑了半天后放弃了。

Hashcat破解

Hashcat号称世界上最快的密码破解,世界上第一个和唯一的基于GPGPU规则引擎,免费多GPU(高达128个GPU),多哈希,多操作系统(Linux和Windows本地二进制文件),多平台(OpenCL和CUDA支持),多算法,资源利用率低,基于字典攻击,支持分布式破解等等。

嗯,暴力破解的话,只能考虑使用GPU跑,这时,开源的hashcat就是一个不错的选择。

获取文件hash值

使用hashcat破解office,先需要获取文件的hash值,网上有现成的工具office2join.py,然后用python运行,参数加上该office文件即可。

1

2

3

python office2john.py ../test.xlsx

test.xlsx:$office$*2013*100000*256*16*c22b0421a0051b4f2d268877b43d01ab*64c32a1fa342eb1a67b07f33057b5fc8*984713574ebad9ffd4d7e9e774ab018aff8bfc2b00bac6f0f92a3ea40e20f130

可以看到,加密方式为office2013,将第一个冒号后面的字串复制到一个新文件中保存即可。

hashcat破解

知道加密方式后,需要找到对应的破解模式,首先使用--help看一下帮助:

1

./hashcat64.bin --help

可以看到office的加密模式有以下几种:

1

2

3

4

5

6

7

8

9

9700 | MS Office <= 2003 $0/$1, MD5 + RC4 | Documents

9710 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #1 | Documents

9720 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #2 | Documents

9800 | MS Office <= 2003 $3/$4, SHA1 + RC4 | Documents

9810 | MS Office <= 2003 $3, SHA1 + RC4, collider #1 | Documents

9820 | MS Office <= 2003 $3, SHA1 + RC4, collider #2 | Documents

9400 | MS Office 2007 | Documents

9500 | MS Office 2010 | Documents

9600 | MS Office 2013 | Documents

所以,office2013选择-m 9600,然后开始破解:

1

./hashcat64.bin -a 3 -m 9600 --session test -o found.txt hash.txt ?l?l?l?l?l?l?l

其中,-a表示破解模式,3是暴力破解,--session test是将该次破解进程命名,可有可无,但之后如果要中断再恢复,则可以使用进程名恢复。-o found.txt是将找到的结果输出到指定文件中,hash.txt是之前保存hash码的文件,最后是一串正则表达式,有?l?u?d?s,分别表示小写字母、大写字母、数字、和特殊字符。该例子表示暴力破解七位小写字母的密码。

但由于不确定位数,先从简单的开始,破解从1到8位的小写字母:

1

./hashcat64.bin -a 3 -m 9600 -o found.txt hash.txt --increment --increment-min 1 --increment-max 8 ?l?l?l?l?l?l?l?l

其中,--increment-min 1 --increment-max 8即如本身含义。
然后查看一下显卡运行情况:

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

Tue Mar 12 14:57:13 2019

+-----------------------------------------------------------------------------+

| NVIDIA-SMI 410.78 Driver Version: 410.78 CUDA Version: 10.0 |

|-------------------------------+----------------------+----------------------+

| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |

| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |

|===============================+======================+======================|

| 0 GeForce RTX 208... Off | 00000000:18:00.0 Off | N/A |

| 90% 80C P2 247W / 250W | 2341MiB / 10989MiB | 94% Default |

+-------------------------------+----------------------+----------------------+

| 1 GeForce RTX 208... Off | 00000000:3B:00.0 Off | N/A |

| 90% 80C P2 248W / 250W | 2341MiB / 10989MiB | 95% Default |

+-------------------------------+----------------------+----------------------+

| 2 GeForce RTX 208... Off | 00000000:86:00.0 Off | N/A |

| 91% 81C P2 247W / 250W | 2341MiB / 10989MiB | 95% Default |

+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+

| Processes: GPU Memory |

| GPU PID Type Process name Usage |

|=============================================================================|

| 0 1852 C ./hashcat64.bin 2331MiB |

| 1 1852 C ./hashcat64.bin 2331MiB |

| 2 1852 C ./hashcat64.bin 2331MiB |

+-----------------------------------------------------------------------------+

如果中途有事,可以先暂停一下,然后跑完后再过来继续破解:

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

./hashcat64.bin --restore

Session..........: test

Status...........: Cracked

Hash.Type........: MS Office 2013

Hash.Target......: $office$*2013*100000*256*16*c22b0421a0051b4f2d26887...20f130

Time.Started.....: Wed Mar 13 14:28:19 2019 (9 hours, 37 mins)

Time.Estimated...: Thu Mar 14 00:05:48 2019 (0 secs)

Guess.Mask.......: ?l?l?l?l?l?l?l [7]

Guess.Queue......: 1/1 (100.00%)

Speed.#1.........: 19777 H/s (8.49ms) @ Accel:64 Loops:16 Thr:256 Vec:1

Speed.#2.........: 19260 H/s (8.66ms) @ Accel:64 Loops:16 Thr:256 Vec:1

Speed.#3.........: 19438 H/s (8.60ms) @ Accel:64 Loops:16 Thr:256 Vec:1

Speed.#*.........: 58475 H/s

Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts

Progress.........: 2025455616/8031810176 (25.22%)

Rejected.........: 0/2025455616 (0.00%)

Restore.Point....: 74645504/308915776 (24.16%)

Restore.Sub.#1...: Salt:0 Amplifier:17-18 Iteration:7520-7536

Restore.Sub.#2...: Salt:0 Amplifier:0-1 Iteration:99984-100000

Restore.Sub.#3...: Salt:0 Amplifier:6-7 Iteration:53776-53792

Candidates.#1....: efmfogr -> ehdaznt

Candidates.#2....: svtdyyl -> srhqbks

Candidates.#3....: lnkkjnt -> ljnzibl

Hardware.Mon.#1..: Temp: 77c Fan: 87% Util: 94% Core:1635MHz Mem:6800MHz Bus:16

Hardware.Mon.#2..: Temp: 77c Fan: 87% Util: 93% Core:1695MHz Mem:6800MHz Bus:16

Hardware.Mon.#3..: Temp: 77c Fan: 87% Util: 94% Core:1725MHz Mem:6800MHz Bus:16

Started: Wed Mar 13 14:27:42 2019

Stopped: Thu Mar 14 00:05:50 2019

最后大概半天吧,跑出来结果如下:

1

$office$*2013*100000*256*16*c22b0421a0051b4f2d268877b43d01ab*64c32a1fa342eb1a67b07f33057b5fc8*984713574ebad9ffd4d7e9e774ab018aff8bfc2b00bac6f0f92a3ea40e20f130:semicjj

冒号后面的就是密码。