0. 背景&结局
最近在做一些过往情况的排查工作,然后有一些老 Excel 表以前负责的同事忘记密码打不开了。虽然说挖坟这件事做的多了,但这回给你水泥封坟确实比较麻烦。
总之整个研究过程还是有意思的,老规矩都写下来,我相信未来肯定还有其他需要挖坟的人。
0.1. 一些关于 Excel 加密的分类情况
- worksheet 被加密/保护: 可以通过改后缀名为 zip 搞定;
- 宏被加密:还是改后缀,然后通过 Notepad++ 找 DPB ,改成 DPx 这样;
- workbook 被加密:只能暴力破解。
总之就是前两种随便搜大把解决方案,咱这次就是第三种情况,必须爆破。
1. 密码爆破步骤
整体思路是这样的:
- 使用 John The Ripper 获得对应需要解密的 Excel 文件 hash 值;
- 使用 Hashcat 来暴力撞这个 hash 值。
1.1. 获取需要解密文件的 Hash 值
1.1.1. 下载 office2john.py 文件
John The Ripper 其实是个比较大的项目,因为我们是要获取 Excel 文件的 Hash 值,只需要用到其中 office2john.py 就行。注意 github 里直接下载的跑起来可能会报错,后来在这个 Need help! about john the ripper commands word. 才找到个能用的。
1.1.2. 运行获取 hash 值
运行命令为:
python office2john.py "需要解密文件的完整路径\test.xlsx" > hash.txt
1.1.3. 清理多余前缀
生成之后记得到 hash.txt 里把前缀 test.xlsx:
删掉。注意后面的字串里会包含 Office 的具体版本(比如我这个就显示是 2010 ,这个跟你电脑里具体安装的什么版本的 Office 是没有关系的),记下来一会儿 Hashcat 里还会用到。
1.2. 利用 Hashcat 解密
1.2.1. 下载 Hashcat
在 Hashcat 官网 下载,直接解压找个地方放好就能用了。
1.2.2. 查询 Hash mode
进入你存放 Hashcat 的路径,运行:
hashcat.exe --help
会显示一大串内容,找到其中 Hash Mode
内容,根据刚刚记下来的 Office 版本,查找对应的 mode 值。比如我是 2010 版本,则对应的 Hash mode 值为 9500 ,这个也要记下来。
1.2.3. 设置字符集和掩码(可选步骤,但建议要做)
设置字符集和掩码的主要目的是缩小需要测试的密码范围,不然暴力撞这么多密码组合时间成本太高。 Hashcat 有内置的一些字符集,写掩码可以参考这个 Mask Attack wiki ,如果想设置的掩码规则比较多,可以写在后缀名为 .hcmask
的文件里,一行为一个掩码,可以参考 Hashcat 项目下文件夹 mask
里写的一些范例。
比如我根据过往密码情况,推测写的 mymask.hcmask
内容是:
?u?u?d?d?d
?l?l?d?d?d
?u?l?d?d?d
?d?d?d?u?u
?d?d?d?u?l
?d?d?d?l?l
(省略)
当然如果知道密码里大致会包含哪些字符,也可以自定义字符集,但是要注意自定义字符集必须跟掩码写在同一行,比如我加了一些自定义字符集之后修改的 mymask1.hcmask
内容是:
0123456789,ABCDJKSWZ,abcdjkswz,?2?2?1?1?1
0123456789,ABCDJKSWZ,abcdjkswz,?3?3?1?1?1
0123456789,ABCDJKSWZ,abcdjkswz,?2?3?1?1?1
0123456789,ABCDJKSWZ,abcdjkswz,?1?1?1?2?2
(省略)
1.2.4. 开始解密
所谓解密无非就是用密码组合暴力碰撞,运行命令为:
hashcat.exe -m 9500 hash.txt -a 3 mymask1.hcmask -o out.txt
-a 3
就是选择 3-暴力破解,然后 Hashcat 就会根据先前设置的字符集和掩码开始碰撞,如果成功就会将解密结果放入 out.txt 。
当然如果不设置自定义的字符集和掩码也是可以的, Hashcat 会根据内置的掩码和字符集来跑,但是这就比较庞大了。也可以通过加上 --increment --increment-min 1 --increment-max 8 ?d?d?d?d?d?d?d?d
来稍微限制密码长度,同时 Hashcat 自动递增碰撞。