Mimikatz与Bypass Credential Guard的记录
字数 1621 2025-08-25 22:58:29
Mimikatz与Bypass Credential Guard技术分析
1. 背景介绍
Windows系统在Windows 10之前,Lsass进程将操作系统使用的密码存储在其进程内存中。攻击者获取机器权限后,常使用Mimikatz工具从LSASS进程内存中转储凭据,包括明文密码、NTLM哈希和Kerberos票证。
微软引入了Windows Defender Credential Guard机制,通过LSASS进程内存隔离来保护这些凭证。Credential Guard启动后,传统的Mimikatz方法无法直接提取内存凭证。
2. 技术原理分析
2.1 WDigest凭据缓存机制
WDigest是Mimikatz最著名的功能:
- Windows Server 2008 R2之前,wdigest凭据缓存默认启用
- 后续更新中,纯文本凭据缓存被默认禁用
- 可通过注册表键值控制:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential
2.2 Mimikatz工作原理
Mimikatz通过以下方式获取凭据:
- 扫描LSASS进程内存中的特定签名
- 针对不同Windows版本和架构使用不同的特征码
- 计算偏移量定位关键数据结构
关键特征码示例(x64架构):
BYTE PTRN_WIN5_PasswdSet[] = {0x48, 0x3b, 0xda, 0x74};
BYTE PTRN_WIN6_PasswdSet[] = {0x48, 0x3b, 0xd9, 0x74};
2.3 凭据加密流程分析
凭据处理的关键函数调用链:
SpAcceptCredentials(Wdigest.dll导出函数) - 接收明文凭据lsasrv!LsapUpdateNamesAndCredentials- 处理凭据更新LsaProtectMemory→LsaEncryptMemory- 加密内存BCryptEncrypt(bcrypt.dll导出) - 实际加密实现
加密关键参数:
hKey- 加密密钥句柄pbInput- 明文存放地址cbInput- 加密字节数pbIV- 初始化向量
3. Bypass Credential Guard技术
3.1 关键变量分析
Wdigest.dll中两个关键变量:
g_fParameter_UseLogonCredential- 控制是否缓存凭据g_IsCredGuardEnabled- 指示Credential Guard状态
3.2 绕过技术实现步骤
-
获取系统版本信息
RtlGetNtVersionNumbers(&NT_MAJOR_VERSION, &NT_MINOR_VERSION, &NT_BUILD_NUMBER); -
提升进程权限
- 使用
AdjustTokenPrivileges开启SeDebugPrivilege - 获取LSASS进程访问权限
- 使用
-
定位wdigest.dll模块
- 通过PEB结构遍历获取模块基址和大小
- 关键函数:
GetProcessPeb和GetVeryBasicModuleInformations
-
搜索关键变量地址
- 使用特征码匹配技术定位变量
- 计算偏移量获取实际地址
*genericPtr = ((PBYTE)lsassMemory.address + sizeof(LONG) + offset); -
修改内存变量值
DWORD UseLogonCredential = 1; DWORD IsCredGuardEnabled = 0; WriteProcessMemory(cLsass.hProcess, g_fParameter_UseLogonCredential, (PVOID)&UseLogonCredential, sizeof(DWORD), NULL);
3.3 完整绕过流程
- 获取LSASS进程PID
- 打开进程获取句柄
- 读取PEB获取模块信息
- 搜索特征码定位关键变量
- 修改变量值:
g_fParameter_UseLogonCredential = 1g_IsCredGuardEnabled = 0
- 使用Mimikatz提取凭据
4. 防御措施
- 启用Credential Guard
- 限制调试权限
- 监控LSASS进程内存修改
- 使用受保护的进程轻量级(LSA Protection)
- 定期审核特权账户
5. 总结
通过分析Wdigest.dll内部机制,发现可以通过修改内存中关键变量的值来绕过Credential Guard的保护。这种技术依赖于:
- 对LSASS进程的内存访问权限
- 准确的变量地址定位
- 内存写入能力
防御方应实施多层防护措施,而不仅仅是依赖Credential Guard单一机制。