“秘密” DPAPI。 看驴子

除了上一篇有关解码DPAPI Blob的文章之外,我们还将讨论我们必须面对的另外两种情况。 这将与在MS IE11和Edge浏览器中保存的密码有关。

策略保持不变-我们将离线解密所有内容。 为此,您需要选择必要的文件。

根据操作系统(Windows 7或更高版本)的不同,应在两个位置查找保存的密码:

对于Windows 7,这是一个注册表分支

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2 

对于Windows 8及更高版本,请使用Windows Vault存储。

还应注意,在Windows 7上,http基本授权密码也存储在Windows Vault中,因此在任何情况下都不会受到伤害。

好吧,根据良好的传统-当然,所有这些都是通过DPAPI机制加密的。

现在更详细地考虑解密算法。

Windows 7 + IE11(边缘)


如上所述,密码存储在当前用户的注册表中,并且是使用用户的主密钥加密的DPAPI Blob。

但是有一个重要的区别-加密密码时使用熵。 熵是以("https://url"+"\x00").lower().encode("utf-16-le")的格式输入密码的URL。

要解密密码,您需要知道完整的URL! 否则什么也没有。

但是,为了使IE自己知道如何解密密码,此URL被散列并使用DPAPI-blob作为键名存储在注册表中。

考虑一个小例子。 对于https://rdot.org/forum/网站https://rdot.org/forum/保存的密码如下所示:

 A88E21329B5372B856CE238B79D1F28D8EA1FD359D REG_BINARY 01000000D08C9DDF0115D1118C7A00C......BC310C51EE0F9B05D 

在哪里
A88 ...是哈希网址https://rdot.org/forum/
01000000D08C ...-包含用户名和密码的DPAPI Blob

URL哈希算法很简单。 在基于CIA的Vault7开发中可以找到有关他的更多信息。

在python中,它看起来像这样:

 import hashlib url = "https://rdot.org/Forum/".lower() + "\x00" url_utf_16_le = url.encode("utf-16-le") sha1obj = hashlib.sha1(url_utf_16_le) urldigest = sha1obj.digest() checksum = 0 len(urldigest) for abyte in urldigest: checksum = (checksum + (ord(abyte))) & 0xFF hash = sha1obj.hexdigest().upper() cksum = "%02X" % checksum reg_value_name = "%s%s" % (hash, cksum) print reg_value_name 

您还可以在注册表中找到最后输入的50个URL的列表:

  HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\typedurls 

让我们回到示例。 假设我们需要从注册表中的https://rdot.org/forum/中找到保存的密码。

将网址值替换为转换脚本-我们获得了该值

 A88E21329B5372B856CE238B79D1F28D8EA1FD359D 

我们需要在注册表中找到具有此名称的密钥

 req query "HKEY_USERS\<SID>\Software\Microsoft\Internet Explorer\IntelliForms\Storage2" 

如果找到了这样的密钥,则必须将其作为十六进制值(即,将该密钥的值解释为十六进制blob)复制到文件中,并使用熵将其解密为DPAPI-blob:( ("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le")
("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le")


对于解密,您可以使用dpapick,进行适当的更改以考虑解密中的熵。

在示例/ filegeneric.py文件中,函数调用

  probe.try_decrypt_with_password(options.password, mkp, options.sid) 

替换为

 probe.try_decrypt_with_password(options.password, mkp, options.sid, entropy=("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le")) 

然后像往常一样调用dpapick:

  ./filegeneric.py --sid <SID> --masterkey <mk dir> --password <..> --inputfile <dpapi blob from registry> 

如果主密钥正确解密,则输出将收到保存的用户名和密码(在一定数量的服务二进制数据之后)。

Windows 8.1及更高版本


如果将密码保存在Win8及更高版本上,则来自HTTP表单的密码以及HTTP基本授权都存储在Windows Vault中。 这样做有好处-连同密码一起,还会保存该网站所访问网站的完整URL。

保管库本身分两个阶段进行加密-首先,整个数据块通过AES加密,解密用的对称密钥由DPAPI加密并保存到文件中。 Zena Forensics的文章在文章中描述了完整的加密-解密算法。

他们还为基于dpapick(dpapilab)的Windows Vault开发了特殊的解密器。 您可以将它们放在ZF git上,或从我们的github下载一个fork。

保管箱存储位于用户个人资料中:

 C:\Users\<user>\AppData\Local\Microsoft\Vault\<GUID>\ 

.vpol文件中是一个DPAPI Blob,已使用用户密钥加密并存储了用于解密.vcrd的AES密钥

要解密保险柜,您必须运行:

 ./vaultdec.py --masterkey <mk dir> --sid <SID> --password <pass> <VAULT DIR> 

如上一篇文章所示,您可以使用域密钥代替密码。 还应注意,如果域中的计算机中包括凭据漫游策略,则Windows Vault数据将存储在ldap中。 您可以在有关DPAPI的第一篇文章中阅读有关此内容的信息。

补充说明:为了使脚本正常工作,您很可能需要安装旧的Python链接:

 apt install python-construct.legacy 

备忘单


要解密IE,Edge以及Windows中存储的密码,您需要提取:

保管库目录

 c:\Users\<user>\AppData\Local\Microsoft\Vault\<GUID>\ 

具有主键的目录

 c:\Users\<user>\AppData\roaming\microsoft\Protect\<SID>\ 

注册表项内容

 HKEY_USERS\<SID>\Software\Microsoft\Internet Explorer\IntelliForms\Storage2 HKEY_USERS>\<SID>\Software\Microsoft\Internet Explorer\typedurls 

此外,您需要知道用户密码或域dpapi备份密钥,无需密码即可进行解密。

Source: https://habr.com/ru/post/zh-CN437390/


All Articles