拿到了一个被加密的Excel,要求输入密码才能打开,于是尝试了下密码破解方法。
AROP破解
AROP(ADVANCED OFFICEPASSWORD RECOVERY)好像是比较主流的Office的破解工具,有收费版和免费版,区别在于密码长度是否超过4字节。
用了一个虚拟机跑了一下,字典查询没有,于是暴力破解,嗯,破解速度比较令人绝望,毕竟是CPU在跑。
将该Excel文件解压之后,可以发现里面包含DataSpace、EncryptedPackage以及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看一下帮助:
可以看到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
|
冒号后面的就是密码。