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通过以下方式获取凭据:

  1. 扫描LSASS进程内存中的特定签名
  2. 针对不同Windows版本和架构使用不同的特征码
  3. 计算偏移量定位关键数据结构

关键特征码示例(x64架构):

BYTE PTRN_WIN5_PasswdSet[] = {0x48, 0x3b, 0xda, 0x74};
BYTE PTRN_WIN6_PasswdSet[] = {0x48, 0x3b, 0xd9, 0x74};

2.3 凭据加密流程分析

凭据处理的关键函数调用链:

  1. SpAcceptCredentials (Wdigest.dll导出函数) - 接收明文凭据
  2. lsasrv!LsapUpdateNamesAndCredentials - 处理凭据更新
  3. LsaProtectMemoryLsaEncryptMemory - 加密内存
  4. BCryptEncrypt (bcrypt.dll导出) - 实际加密实现

加密关键参数:

  • hKey - 加密密钥句柄
  • pbInput - 明文存放地址
  • cbInput - 加密字节数
  • pbIV - 初始化向量

3. Bypass Credential Guard技术

3.1 关键变量分析

Wdigest.dll中两个关键变量:

  1. g_fParameter_UseLogonCredential - 控制是否缓存凭据
  2. g_IsCredGuardEnabled - 指示Credential Guard状态

3.2 绕过技术实现步骤

  1. 获取系统版本信息

    RtlGetNtVersionNumbers(&NT_MAJOR_VERSION, &NT_MINOR_VERSION, &NT_BUILD_NUMBER);
    
  2. 提升进程权限

    • 使用AdjustTokenPrivileges开启SeDebugPrivilege
    • 获取LSASS进程访问权限
  3. 定位wdigest.dll模块

    • 通过PEB结构遍历获取模块基址和大小
    • 关键函数:GetProcessPebGetVeryBasicModuleInformations
  4. 搜索关键变量地址

    • 使用特征码匹配技术定位变量
    • 计算偏移量获取实际地址
    *genericPtr = ((PBYTE)lsassMemory.address + sizeof(LONG) + offset);
    
  5. 修改内存变量值

    DWORD UseLogonCredential = 1;
    DWORD IsCredGuardEnabled = 0;
    WriteProcessMemory(cLsass.hProcess, g_fParameter_UseLogonCredential, 
                      (PVOID)&UseLogonCredential, sizeof(DWORD), NULL);
    

3.3 完整绕过流程

  1. 获取LSASS进程PID
  2. 打开进程获取句柄
  3. 读取PEB获取模块信息
  4. 搜索特征码定位关键变量
  5. 修改变量值:
    • g_fParameter_UseLogonCredential = 1
    • g_IsCredGuardEnabled = 0
  6. 使用Mimikatz提取凭据

4. 防御措施

  1. 启用Credential Guard
  2. 限制调试权限
  3. 监控LSASS进程内存修改
  4. 使用受保护的进程轻量级(LSA Protection)
  5. 定期审核特权账户

5. 总结

通过分析Wdigest.dll内部机制,发现可以通过修改内存中关键变量的值来绕过Credential Guard的保护。这种技术依赖于:

  1. 对LSASS进程的内存访问权限
  2. 准确的变量地址定位
  3. 内存写入能力

防御方应实施多层防护措施,而不仅仅是依赖Credential Guard单一机制。

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架构): 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 绕过技术实现步骤 获取系统版本信息 提升进程权限 使用 AdjustTokenPrivileges 开启 SeDebugPrivilege 获取LSASS进程访问权限 定位wdigest.dll模块 通过PEB结构遍历获取模块基址和大小 关键函数: GetProcessPeb 和 GetVeryBasicModuleInformations 搜索关键变量地址 使用特征码匹配技术定位变量 计算偏移量获取实际地址 修改内存变量值 3.3 完整绕过流程 获取LSASS进程PID 打开进程获取句柄 读取PEB获取模块信息 搜索特征码定位关键变量 修改变量值: g_fParameter_UseLogonCredential = 1 g_IsCredGuardEnabled = 0 使用Mimikatz提取凭据 4. 防御措施 启用Credential Guard 限制调试权限 监控LSASS进程内存修改 使用受保护的进程轻量级(LSA Protection) 定期审核特权账户 5. 总结 通过分析Wdigest.dll内部机制,发现可以通过修改内存中关键变量的值来绕过Credential Guard的保护。这种技术依赖于: 对LSASS进程的内存访问权限 准确的变量地址定位 内存写入能力 防御方应实施多层防护措施,而不仅仅是依赖Credential Guard单一机制。