NativeBypassCredGuard 是一款旨在通过仅使用 NTAPI 函数(由 ntdll.dll 导出)修补 WDigest.dll 来绕过 Credential Guard 的工具。它有两种版本:C# 和 C++。
该工具在磁盘上的 WDigest.dll 文件中定位模式“39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00”(如参考部分第一篇文章所述,该模式存在于所有 Windows 版本的此文件中),然后计算必要的内存地址,最后修补 WDigest.dll 中两个变量的值:g_fParameter_UseLogonCredential(为 1)和g_IsCredGuardEnabled(为 0)。
这会强制将纯文本凭证存储在内存中,确保从那时起,每当用户登录时,凭证都以明文形式存储。因此,下次转储 LSASS 进程时,它可能包含纯文本密码。
使用的NTAPI函数是:
NtOpenProcessToken 和 NtAdjustPrivilegesToken 启用 SeDebugPrivilege 特权
NtCreateFile 和 NtReadFile 打开磁盘上的 DLL 文件的句柄并读取其字节
NtGetNextProcess 和 NtQueryInformationProcess 获取 lsass 进程的句柄
NtReadVirtualMemory 和 NtQueryInformationProcess 获取 WDigest.dll 基地址
NtReadVirtualMemory 读取变量的值
NtWriteProcessMemory 将新值写入变量
仅使用 NTAPI 函数,就可以重新映射 ntdll.dll 库以绕过用户模式挂钩和安全机制,这是该工具的可选功能。如果使用,则会从在调试模式下创建的进程中获取干净版本的 ntdll.dll。
用法
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
选项(必填):
check:读取当前值
patch:写入新值
重新映射 ntdll (可选):
true:重新映射 ntdll 库
false(或省略):不重新映射 ntdll 库
示例
读取值(无需ntdll 重新映射):
NativeBypassCredGuard.exe check
补丁值(使用ntdll 重新映射):
NativeBypassCredGuard.exe patch true
笔记
该工具专为 64 位系统设计,因此必须编译为 64 位二进制文件
如果无法打开 lsass 的句柄或 PEB 结构不可读,它将无法工作。对于后者,您可以选择使用 kernel32!LoadLibrary 在您的进程中加载 WDigest.dll 以获取其基址,而不是使用 ntdll!NtReadVirtualMemory 和 ntdll!NtQueryInformationProcess 从 lsass 进程中获取它(您有 C 版本中对此代码的注释)。但您将使用不是由 ntdll.dll 导出的函数,而是由 kernel32.dll 导出的函数,进程加载该 DLL 可能很奇怪 :)
0x3rhy基于此项目创建了一个 BOF 文件:BypassCredGuard-BOF-https://github.com/0x3rhy/BypassCredGuard-BOF
项目地址:
https://github.com/ricardojoserf/NativeBypassCredGuard
参考
itm4n撰写的《重新审视 Credential Guard 绕过》 - 一篇出色的分析文章,我从中找到了搜索 DLL 的 .text 部分的模式
https://itm4n.github.io/credential-guard-bypass/
WDigest:从坟墓中挖掘死者,作者:neuralhax - 一个很棒的博客,证明了可以使用其他值作为g_fParameter_UseLogonCredential,我还没有测试过,但你可以使用变量useLogonCredential_Value
https://neuralhax.github.io/wdigest-digging-the-dead-from-the-grave
探索 Mimikatz - 第 1 部分 - xpn的WDigest - 精彩的博客文章逆向工程和解释 WDigest 凭证缓存
https://blog.xpnsec.com/exploring-mimikatz-part-1/
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里