Adam Chester (@_xpn_) 写了一篇名为 "探索 Mimikatz - 第 1 部分 - WDigest" 的文章,其中介绍了通过内存修补来启用 UseLogonCredential 并使 Wdigest 缓存明文凭据的方法,这引起了我的兴趣。
LSASS 进程加载的 wdigest.dll 模块有两个有趣的全局变量:g_fParameter_useLogonCredential 和 g_IsCredGuardEnabled,它们的作用从名字上就一目了然,前者用于判断是否应将明文密码存储在内存中,后者保存了模块内 Windows Defender Credential Guard 的状态,通过修补这两个全局变量在内存中的值,可以在启用了 Credential Guard 的系统上启用 Wdigest 明文密码缓存。
更详细的分析请阅读我的博客:"重新审视来自 Wdigest 的 Credential Guard 绕过"
在启用了 Credential Guard 保护的系统上运行我们编写的 POC。当用户再次输入用户名和密码登录时,我们会再次获取他的明文密码,如下图所示。
BypassCredGuard.exe

事实上,早在 2020 年 8 月,Team Hydra (@N4k3dTurtl3) 就在博客上发表了一篇题为"绕过 Credential Guard"的文章,讨论了这一非常巧妙且简单的技巧,并简要发布了一个概念验证 CredGuard_PoC,但它并不能在所有 Windows 系统上运行。
Team Hydra 就此事向微软提交了一份报告,并收到了以下回复:
"经过对此问题的调查,我们认为这并不是对 Credential Guard 的绕过。Credential Guard 旨在保护在该功能启用期间缓存的凭据。如果特权用户禁用了 Credential Guard,则该功能无法保护后续的登录。我们将更新公开文档以澄清这一行为"
鉴于这一回复,我怀疑在可预见的未来,这将是获取启用了 Credential Guard 的系统上明文凭据的一种可靠方法。