利用 hashcat 回忆(破解)遗忘的 Keepass 密码

本文环境:所有命令在 Kali Linux 下执行。

昨天的确是一个 tough day 。由于记性不好,四天前设置的 Keepass 主密码终于“如愿以偿”地被我遗忘了,而其中,保存了对于我来说极其重要的东西。16 位的密码中,我依稀地记得前 7 位和后 5 位“应该”、“似乎”是什么样子的,第十一位也记得,不过有些不确定。第八位我“幻想”出了一个答案。也就是说,我至少要再想出 2 位密码,至多则是 4 位,其中可能包含了大小写字母、数字,和特殊符号。

本着由易到难的想法,我先假定我模糊的记忆和幻想都是真实的。步骤是:先猜测 2 位,无果后,猜测 3 位,无果后,猜测 4 位。

出于减小范围的考虑,我先根据记忆筛掉完全不可能的字符,如没有穷举成功,方则使用全集。

本次操作有几个不确定因素:

  1. 我无法保证,已经记得的密码是绝对正确的。可能无功而返。

  2. 在减小范围时,我可能根据记忆错误地减掉了一些字符。

准备

生成字典

2 位:

crunch 2 2 字符集 -o dic2.txt
sed -i 's/^/前8位/' dic2.txt
sed -i 's/$/后6位/' dic2.txt

3 位:

crunch 3 3 字符集 -d [email protected] -o dic3.txt
sed -i 's/^/前7位/' dic3.txt
sed -i 's/$/后6位/' dic3.txt

4 位:

crunch 4 4 字符集 -d [email protected] -o dic4.txt
sed -i 's/^/前7位/' dic4.txt
sed -i 's/$/后5位/' dic4.txt

注:这里指定的字符集的顺序应该是:大写字母,小写字母,数字,特殊符号。

提取 hash

keepass2john keepass.kdbx > keepass.hash

开始破解

hashcat -m 13400 -a 0 -w 1 keepass.hash dic2.txt --force
hashcat -m 13400 -a 0 -w 1 keepass.hash dic3.txt --force
hashcat -m 13400 -a 0 -w 1 keepass.hash dic4.txt --force

注:由于本例是在虚拟机中运行 Kali Linux,故因显卡问题加了 --force 参数。

运行结果

2 位的很快 Exhausted,3 位的大概 1 分钟就跑完了,4 位的要跑一个多小时。

结果:没有破解成功。

原因可能是本文提到的那些不确定因素。

而自己单独另外做了一个中间猜测 3 位的测试文件,那个结果是成功的。

成功后会出现类似如下的输出:

Session..........: hashcat
Status...........: Cracked
Hash.Type........: KeePass 1 (AES/Twofish) and KeePass 2 (AES)
Hash.Target......: $keepass$*1*6000*124*dfb86938fedd22b8235c4de4b02e5b...
Time.Started.....: Mon May 1 20:53:17 2017 (12 mins, 8 secs)
Time.Estimated...: Mon May 1 21:05:25 2017 (0 secs)
Guess.Base.......: File (cracklib-words)
Guess.Queue......: 1/1 (100.00%)
Speed.Dev.#2.....: 1463 H/s (1.85ms)
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 1064960/1671704 (63.71%)
Rejected.........: 0/1064960 (0.00%)
Restore.Point....: 1054720/1671704 (63.09%)

密码在 Hash.Target 的最后的冒号后面。

感想

  • 以后不能对自己的脑子太自信了,这种关键的东西还是要熟背一周,再销毁原记录。

  • Kali Linux 好用,这些工具是系统打包自带的。

  • 但愿会梦到密码。

后续

后来我又把磁盘的 LUKS 密码忘记了,简直又是灾难,但好在只忘记了最后两位,生成字典的方法类似,在破解时,可以挂载磁盘但不解密,执行这样的操作:

dd if=/dev/XXXX of=header.luks bs=512 count=4097

会在当前目录下生成 header.luks 文件。

然后使用 hashcat 穷举:

hashcat -m 14600 -a 0 -w 1 header.luks dic.txt

注意此时要求 hashcat 版本大于 3.4.0 ,并且系统中具有 Opencl 驱动。对于在虚拟机中的 Kali Linux ,可在此处下载 Intel 的 Opencl-CPU 。具体可见参考链接。

本次的结果是成功的。

Reference