针对 CVE-2021-31796 的漏洞利用工具
用于解码 C-Ark 凭证文件的工具
作者:Aaron Mizrachi - https://twitter.com/unmanarc/
Enrique Vaamonde - https://twitter.com/_ejvm
首次发布:2019年9月2日
公开披露:2021年10月11日
此漏洞自2019年9月起一直在等待发布。
以下是时间线:
在渗透测试中,如果有人足够聪明能够接触到 PSM 并偶然获得 CredFile 的访问权限,那么就有可能利用该文件建立与 Vault 的连接,从而控制整个系统……
作为对策,大多数凭证文件会设置一些“限制”,以防止密码在不同环境/计算机(例如,黑客自己的 PSM)中使用。
然而,这些限制可以被修改,如果你逆向并获取原始密钥部分。这个解密后的密钥部分可用于重新创建具有不同“安全”参数(例如,另一台主机、另一个应用程序、另一个操作系统用户)的文件。
为了生成 AES-256(32 字节)原始解密密钥,我们从凭证字段 "AdditionalInformation" 中取一对 SHA1SUM,每个哈希附加 "0x00000000" 和 "0x00000001";第一个哈希提供密钥的前 20 字节,第二个哈希仅提供后 12 字节。
如果存在任何环境限制(如 IP/主机/执行路径/...),我们会在计算两个 SHA1SUM 之前,将每个明文值前置到 AdditionalInformation。
重要的是要提到,"ClientApp" 字段是通过 BASE64(SHA1SUM(strlower(ClientApp))) 进行转换的,然后才前置到 "AdditionalInformation" 并生成两个 SHA1SUM。
解密是使用 AES-256-CBC OpenSSL 函数进行的,使用 Password 或 NewPassword 字段。(https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)
我们使用 (verificationflags-16) 来确定启用了哪些验证/限制:
usingClientApp = ((uVerificationsFlag&0x1) != 0);
usingAppPath = ((uVerificationsFlag&0x2) != 0);
usingClientIP = ((uVerificationsFlag&0x4) != 0);
usingOSUser = ((uVerificationsFlag&0x8) != 0);
usingClientHostname = ((uVerificationsFlag&0x20) != 0);
并且如果某些限制未在输出的凭证文件中显示,你始终可以手动引入它们。我想我们都同意,“应用路径”和“客户端 IP”都不是真正随机的值。
使用 HSM \o/,不要将解密密钥存储在 cred 文件中。
qmake .
make -j8