这是我对 CVE-2023-32784 的概念验证实现。
我的版本是 @vdohney 的 PoC 的 Python 移植,并做了一些更改和额外功能。
一项变更是使用转储文件中可找到的已知字符串,以便更准确地跳转至主密钥字符所在位置。这减少了假阳性字符,并大大缩短了扫描文件所需的时间。如果转储文件中未找到这些字符串,扫描将从文件开头开始。此选项默认启用,但若希望执行完整扫描,可使用 --full-scan。对于此类情况,我还添加了 --skip 标志以加快扫描速度。原理是通过偏移指针跳过接下来的 1000 个字节,因为这些位置通常只包含重复出现的相同字符。例如,若在转储文件中找到字符 ●e,其呈现方式如下:
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
使用 --skip 标志可以跳过这些重复字节以加速扫描,但在使用跳转点时并非必需。
[*] 15567777 | 发现: ●e
[*] 15568797 | 发现: ●e
[*] 15570355 | 发现: ●●c
[*] 15571375 | 发现: ●●c
[*] 15572925 | 发现: ●●●r
[*] 15573973 | 发现: ●●●r

此版本包含恢复功能,尝试找出密钥中任何剩余的未知字符。通过定位转储文件中找到的字符的不同可能组合来实现:若找到匹配项,则从转储文件中提取后续字符,直到遇到下一个非 ASCII 字符。
此功能在转储文件中存储了完整明文密码时有效(当用户通过停用星号隐藏功能来显示主密钥时,似乎会发生这种情况)。
可以使用 --recover 标志启用此行为。

还可以使用 -o 指定输出文件,以导出找到的不同组合。如下图所示,即使在转储文件中找到的是另一个主密钥的字符,且明文密码并未存储在转储中,在组合列表中我们仍能获得最终组合中密钥的 23/24 个字符。

在此例中,第一个条目实际上也显示了转储中第二个密钥 ducks 的 4/5 个字符,但它与另一个密钥的字符组合在一起,结果为 ucks|tMasterPassword123!。似乎有可能存在解决方法,但仍在开发中。
我还添加了通过 -w 提供字典文件在转储文件中搜索可能密码的功能。此标志将根据字典中的单词生成包含字符的字符串,然后在转储文件中搜索。还可以使用 -p 或 --padding 标志为创建的字符串指定填充。
示例:--padding 2 => ●●a | --padding 3 => ●●●a

对于以上示例,密码以明文形式存储在转储中。因此可以匹配找到的字符串以提取额外字符。但是,如果明文密码未以明文形式存储在转储中,仍然可以提取剩余的字符:

在这种情况下,即使未能在转储中找到明文匹配,仍然提取了所有额外字符。
CVE 详情:CVE-2023-32784