本文环境:所有命令在 Kali Linux 下执行。
昨天的确是一个 tough day 。由于记性不好,四天前设置的 Keepass 主密码终于“如愿以偿”地被我遗忘了,而其中,保存了对于我来说极其重要的东西。16 位的密码中,我依稀地记得前 7 位和后 5 位“应该”、“似乎”是什么样子的,第十一位也记得,不过有些不确定。第八位我“幻想”出了一个答案。也就是说,我至少要再想出 2 位密码,至多则是 4 位,其中可能包含了大小写字母、数字,和特殊符号。
本着由易到难的想法,我先假定我模糊的记忆和幻想都是真实的。步骤是:先猜测 2 位,无果后,猜测 3 位,无果后,猜测 4 位。
出于减小范围的考虑,我先根据记忆筛掉完全不可能的字符,如没有穷举成功,方则使用全集。
本次操作有几个不确定因素:
我无法保证,已经记得的密码是绝对正确的。可能无功而返。
在减小范围时,我可能根据记忆错误地减掉了一些字符。
准备
生成字典
2 位:
1 | crunch 2 2 字符集 -o dic2.txt |
3 位:
1 | crunch 3 3 字符集 -d 2@ -o dic3.txt |
4 位:
1 | crunch 4 4 字符集 -d 2@ -o dic4.txt |
注:这里指定的字符集的顺序应该是:大写字母,小写字母,数字,特殊符号。
提取 hash
1 | keepass2john keepass.kdbx > keepass.hash |
开始破解
1 | hashcat -m 13400 -a 0 -w 1 keepass.hash dic2.txt --force |
注:由于本例是在虚拟机中运行 Kali Linux,故因显卡问题加了 --force
参数。
运行结果
2 位的很快 Exhausted,3 位的大概 1 分钟就跑完了,4 位的要跑一个多小时。
结果:没有破解成功。
原因可能是本文提到的那些不确定因素。
而自己单独另外做了一个中间猜测 3 位的测试文件,那个结果是成功的。
成功后会出现类似如下的输出:
1 | Session..........: hashcat |
密码在 Hash.Target
的最后的冒号后面。
感想
以后不能对自己的脑子太自信了,这种关键的东西还是要熟背一周,再销毁原记录。
Kali Linux 好用,这些工具是系统打包自带的。
但愿会梦到密码。
后续
后来我又把磁盘的 LUKS 密码忘记了,简直又是灾难,但好在只忘记了最后两位,生成字典的方法类似,在破解时,可以挂载磁盘但不解密,执行这样的操作:
1 | dd if=/dev/XXXX of=header.luks bs=512 count=4097 |
会在当前目录下生成 header.luks
文件。
然后使用 hashcat 穷举:
1 | hashcat -m 14600 -a 0 -w 1 header.luks dic.txt |
注意此时要求 hashcat 版本大于 3.4.0 ,并且系统中具有 Opencl 驱动。对于在虚拟机中的 Kali Linux ,可在此处下载 Intel 的 Opencl-CPU 。具体可见参考链接。
本次的结果是成功的。