前言
在一台 Windows 机器上立足后,利用 DPAPI 获取本地存储的凭据是一种常见且高效的横向移动手段。尤其是在工作组环境中,每台 Windows 主机都是独立的,横向移动难度较大,此时可以尝试通过 DPAPI 解密凭据,获取更多有效凭据,从而扩大内网控制范围。
DPAPI
DPAPI(数据保护 API)是 Windows 系统的一个内部组件。它允许各种应用程序存储敏感数据。这些数据存储在用户目录中,并由基于用户密码派生的用户专用主密钥进行保护;
通俗的来解释就是:DPAPI 会为每个用户生成一个随机的 Master Key(主密钥),它是用来加解密各种凭据文件(如浏览器保存的密码、RDP 凭据、Credential Manager 条目等)的核心密钥。
由于 Master Key 本身非常敏感,系统会用基于用户登录密码派生出的密钥(也叫 用户加密密钥 或 派生密钥)对 Master Key 进行加密,然后把它安全地存储在Master Key File 的文件里。
因此,如果攻击者获取了用户的明文密码或者 NTLM Hash,就能解锁 Master Key File,从而拿到 Master Key,再进一步解密各种 DPAPI 加密的 Windows 凭据文件,完成横向移动或敏感数据窃取。
1 | master key file存放路径: |
通过凭据管理器或者以命令”cmdkey /list”的方式,可以查看当前机器存在的凭据
利用
在攻防演练中,最常见的场景之一就是已立足的 Windows 主机存储了 RDP 凭据。当用户在使用远程桌面连接(RDP)时,如果勾选了“记住我的凭据”,系统就会将登录凭据以 DPAPI 加密的形式保存在本地。
无论是用于存放已加密凭据的文件,还是保存 Master Key 的文件,默认都属于系统隐藏文件。只有在资源管理器中取消勾选“隐藏受保护的操作系统文件”,或通过命令行使用 dir /a
这类带有显示隐藏文件参数的命令,才能看到它们。
在一次典型的攻防演练场景中,当已立足的 Windows 主机保存了远程桌面连接(RDP)凭据时,可以借助 impacket-dpapi
工具,结合用户密码或 NTLM Hash 对 DPAPI 加密的数据进行解密。下面演示完整流程:
先解析凭据文件,找到所需的 Master Key 标识:
可以看到,该凭据文件使用的 Master Key GUID 是:FD75E2CC-8580-4FD9-B290-386D3873FB54
1 | ┌──(kali㉿kali)-[~/dpapi] |
有了 Master Key GUID,就去对应的 Protect\<SID>\
路径下找到该 Master Key File,解密需要提供用户 SID 和密码(或 Hash):
1 | ┌──(kali㉿kali)-[~/dpapi] |
最后使用已解密的 Master Key,对原始凭据文件进行解密:成功拿到账户密码
1 | ┌──(kali㉿kali)-[~/dpapi] |
更多利用方式见参考。
参考
https://www.thehacker.recipes/ad/movement/credentials/dumping/dpapi-protected-secrets#dpapi-secrets