Mimikatz Explorer - Sekurlsa::MSV
字数 2070 2025-08-06 12:20:48

Mimikatz sekurlsa::msv 模块深度解析

1. 模块概述

sekurlsa::msv 是 Mimikatz 的核心功能之一,用于从 lsass.exe 进程中提取 Windows 登录凭据(包括 LM/NTLM 哈希)。该模块通过分析 lsasrv.dll 内存中的关键数据结构来获取凭据信息。

2. 技术原理

2.1 关键数据结构

Windows 系统启动时,lsasrv.dll 会被加载到 lsass.exe 进程中,其中包含两个关键全局变量:

  • LogonSessionList: 存储当前活动的 Windows 登录会话标识符
  • LogonSessionListCount: 存储当前活动的会话数

2.2 定位机制

Mimikatz 通过以下步骤定位这些变量:

  1. 特征码扫描:在 lsasrv.dll 中搜索引用这些全局变量的指令特征码
  2. RIP 相对寻址:在 x86_64 架构上,这些指令使用 RIP 相对寻址访问全局变量
  3. 偏移量计算:从指令中提取偏移量值,计算全局变量的实际地址

2.3 加密凭据解密

Windows 使用 CNG (Cryptography Next Generation) API 加密内存中的凭据:

  1. 使用 LsaInitializeProtectedMemory() 初始化加密密钥
  2. 根据数据块长度选择加密算法:
    • 能被 8 整除:使用 AES 算法
    • 否则:使用 3DES 算法
  3. 每次 lsass.exe 启动时生成随机的新密钥

3. 详细实现流程

3.1 初始化阶段

  1. 获取 lsass.exe 进程信息

    • 通过 kull_m_process_getProcessIdForName 获取 PID
    • 使用 OpenProcess 打开进程句柄
  2. 获取 PEB 结构

    • 通过 NtQueryInformationProcess 获取进程基本信息
    • 解析 PEB 结构找到加载的模块列表
  3. 定位 lsasrv.dll

    • 遍历 PEB_LDR_DATA 结构中的模块列表
    • 匹配模块名称为 "lsasrv.dll"

3.2 关键变量定位

  1. LogonSessionList 和 LogonSessionListCount

    • 使用预定义的特征码匹配规则(LsaSrvReferences)
    • 计算 RIP 相对偏移量获取变量地址
  2. 加密密钥和初始化向量

    • 使用 PTRN_WIN8_LsaInitializeProtectedMemory_KeyRef 特征码
    • 定位 h3DesKey, hAesKeyInitializationVector

3.3 凭据提取流程

  1. 遍历登录会话

    • 通过 LogonSessionList 遍历所有活动会话
    • 解析 KIWI_MSV1_0_LIST_63 结构获取会话信息
  2. 提取凭据结构

    • 定位 KIWI_MSV1_0_CREDENTIALS 结构
    • 解析 KIWI_MSV1_0_PRIMARY_CREDENTIALS 结构
    • 获取加密的凭据数据
  3. 解密凭据

    • 使用 LsaUnprotectMemory 解密内存数据
    • 根据系统版本选择适当的凭据结构(如 MSV1_0_PRIMARY_CREDENTIAL_10_1607)
  4. 输出结果

    • 从解密结构中提取 NTLM/LM/SHA1 哈希
    • 格式化输出用户信息和凭据哈希

4. 关键数据结构详解

4.1 Windows 进程结构

typedef struct _PEB {
    BYTE Reserved1[2];
    BYTE BeingDebugged;
    // ...
    PPEB_LDR_DATA Ldr;  // 模块加载信息
    // ...
} PEB, *PPEB;

typedef struct _PEB_LDR_DATA {
    ULONG Length;
    // ...
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderModuleList;
    LIST_ENTRY InInitializationOrderModuleList;
    // ...
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _LDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks;
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderLinks;
    PVOID DllBase;      // 模块基地址
    PVOID EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    // ...
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

4.2 登录会话结构 (Windows 10 1903)

typedef struct _KIWI_MSV1_0_LIST_63 {
    struct _KIWI_MSV1_0_LIST_63 *Flink;
    struct _KIWI_MSV1_0_LIST_63 *Blink;
    // ...
    LUID LocallyUniqueIdentifier;
    LUID SecondaryLocallyUniqueIdentifier;
    // ...
    LSA_UNICODE_STRING UserName;        // 偏移量 0x90
    LSA_UNICODE_STRING Domaine;         // 域名
    // ...
    PSID pSid;                          // SID
    ULONG LogonType;                    // 登录类型
    ULONG Session;                      // 会话ID
    LARGE_INTEGER LogonTime;            // 登录时间
    LSA_UNICODE_STRING LogonServer;     // 登录服务器 (偏移量 0xF8)
    PKIWI_MSV1_0_CREDENTIALS Credentials; // 凭据 (偏移量 0x108)
    // ...
} KIWI_MSV1_0_LIST_63, *PKIWI_MSV1_0_LIST_63;

4.3 凭据相关结构

typedef struct _KIWI_MSV1_0_CREDENTIALS {
    struct _KIWI_MSV1_0_CREDENTIALS *next;
    DWORD AuthenticationPackageId;
    PKIWI_MSV1_0_PRIMARY_CREDENTIALS PrimaryCredentials;
} KIWI_MSV1_0_CREDENTIALS, *PKIWI_MSV1_0_CREDENTIALS;

typedef struct _KIWI_MSV1_0_PRIMARY_CREDENTIALS {
    struct _KIWI_MSV1_0_PRIMARY_CREDENTIALS *next;
    ANSI_STRING Primary;                // 通常为"Primary"
    LSA_UNICODE_STRING Credentials;     // 加密的凭据数据
} KIWI_MSV1_0_PRIMARY_CREDENTIALS, *PKIWI_MSV1_0_PRIMARY_CREDENTIALS;

// Windows 10 1607+ 的凭据结构
typedef struct _MSV1_0_PRIMARY_CREDENTIAL_10_1607 {
    LSA_UNICODE_STRING LogonDomainName;
    LSA_UNICODE_STRING UserName;
    // ...
    BOOLEAN isNtOwfPassword;           // 是否有NT哈希
    BOOLEAN isLmOwfPassword;           // 是否有LM哈希
    BOOLEAN isShaOwPassword;            // 是否有SHA1哈希
    // ...
    BYTE NtOwfPassword[LM_NTLM_HASH_LENGTH];  // NT哈希 (偏移量 0x4A)
    BYTE LmOwfPassword[LM_NTLM_HASH_LENGTH];  // LM哈希 (偏移量 0x5A)
    BYTE ShaOwPassword[SHA_DIGEST_LENGTH];    // SHA1哈希 (偏移量 0x6A)
    // ...
} MSV1_0_PRIMARY_CREDENTIAL_10_1607, *PMSV1_0_PRIMARY_CREDENTIAL_10_1607;

4.4 加密相关结构

typedef struct _KIWI_BCRYPT_HANDLE_KEY {
    ULONG size;
    ULONG tag;                          // 'UUUR'
    PVOID hAlgorithm;
    PKIWI_BCRYPT_KEY key;               // 实际密钥结构
    PVOID unk0;
} KIWI_BCRYPT_HANDLE_KEY, *PKIWI_BCRYPT_HANDLE_KEY;

typedef struct _KIWI_BCRYPT_KEY81 {     // Win10 版本
    ULONG size;
    ULONG tag;                          // 'MSSK'
    ULONG type;
    // ... 各种字段 ...
    KIWI_HARD_KEY hardkey;             // 实际密钥数据
} KIWI_BCRYPT_KEY81, *PKIWI_BCRYPT_KEY81;

typedef struct _KIWI_HARD_KEY {
    ULONG cbSecret;                     // 密钥长度
    BYTE data[ANYSIZE_ARRAY];           // 实际密钥数据
} KIWI_HARD_KEY, *PKIWI_HARD_KEY;

5. 防御措施

了解攻击技术有助于更好地防御,针对 Mimikatz 的 sekurlsa::msv 模块,可采取以下防护措施:

  1. 保护 lsass.exe 进程

    • 启用 Credential Guard
    • 限制对 lsass.exe 的调试权限
    • 使用 Protected Process Light (PPL)
  2. 监控与检测

    • 监控对 lsass.exe 的异常访问
    • 检测 Mimikatz 特征码和行为模式
    • 启用 Windows Defender ATP 等高级威胁防护
  3. 缓解措施

    • 禁用 LM 哈希存储
    • 启用 NTLMv2 并禁用较弱的认证协议
    • 定期轮换特权账户凭据
  4. 架构安全

    • 实施最小权限原则
    • 使用 Windows Hello 或智能卡等替代认证方式
    • 部署 LSA 保护机制

6. 总结

Mimikatz 的 sekurlsa::msv 模块通过深入分析 Windows 认证子系统内部数据结构,实现了从内存中提取凭据的能力。理解其工作原理不仅有助于渗透测试和取证分析,更能帮助系统管理员构建更强大的防御体系。

关键要点:

  • 依赖于 lsasrv.dll 中的全局变量定位会话信息
  • 使用特征码扫描技术适应不同 Windows 版本
  • 通过逆向 CNG 加密机制解密内存中的凭据
  • 从复杂的链式结构中提取用户信息和哈希值
  • 防御需要多层次的综合防护策略
Mimikatz sekurlsa::msv 模块深度解析 1. 模块概述 sekurlsa::msv 是 Mimikatz 的核心功能之一,用于从 lsass.exe 进程中提取 Windows 登录凭据(包括 LM/NTLM 哈希)。该模块通过分析 lsasrv.dll 内存中的关键数据结构来获取凭据信息。 2. 技术原理 2.1 关键数据结构 Windows 系统启动时,lsasrv.dll 会被加载到 lsass.exe 进程中,其中包含两个关键全局变量: LogonSessionList : 存储当前活动的 Windows 登录会话标识符 LogonSessionListCount : 存储当前活动的会话数 2.2 定位机制 Mimikatz 通过以下步骤定位这些变量: 特征码扫描 :在 lsasrv.dll 中搜索引用这些全局变量的指令特征码 RIP 相对寻址 :在 x86_ 64 架构上,这些指令使用 RIP 相对寻址访问全局变量 偏移量计算 :从指令中提取偏移量值,计算全局变量的实际地址 2.3 加密凭据解密 Windows 使用 CNG (Cryptography Next Generation) API 加密内存中的凭据: 使用 LsaInitializeProtectedMemory() 初始化加密密钥 根据数据块长度选择加密算法: 能被 8 整除:使用 AES 算法 否则:使用 3DES 算法 每次 lsass.exe 启动时生成随机的新密钥 3. 详细实现流程 3.1 初始化阶段 获取 lsass.exe 进程信息 通过 kull_m_process_getProcessIdForName 获取 PID 使用 OpenProcess 打开进程句柄 获取 PEB 结构 通过 NtQueryInformationProcess 获取进程基本信息 解析 PEB 结构找到加载的模块列表 定位 lsasrv.dll 遍历 PEB_ LDR_ DATA 结构中的模块列表 匹配模块名称为 "lsasrv.dll" 3.2 关键变量定位 LogonSessionList 和 LogonSessionListCount 使用预定义的特征码匹配规则(LsaSrvReferences) 计算 RIP 相对偏移量获取变量地址 加密密钥和初始化向量 使用 PTRN_ WIN8_ LsaInitializeProtectedMemory_ KeyRef 特征码 定位 h3DesKey , hAesKey 和 InitializationVector 3.3 凭据提取流程 遍历登录会话 通过 LogonSessionList 遍历所有活动会话 解析 KIWI_ MSV1_ 0_ LIST_ 63 结构获取会话信息 提取凭据结构 定位 KIWI_ MSV1_ 0_ CREDENTIALS 结构 解析 KIWI_ MSV1_ 0_ PRIMARY_ CREDENTIALS 结构 获取加密的凭据数据 解密凭据 使用 LsaUnprotectMemory 解密内存数据 根据系统版本选择适当的凭据结构(如 MSV1_ 0_ PRIMARY_ CREDENTIAL_ 10_ 1607) 输出结果 从解密结构中提取 NTLM/LM/SHA1 哈希 格式化输出用户信息和凭据哈希 4. 关键数据结构详解 4.1 Windows 进程结构 4.2 登录会话结构 (Windows 10 1903) 4.3 凭据相关结构 4.4 加密相关结构 5. 防御措施 了解攻击技术有助于更好地防御,针对 Mimikatz 的 sekurlsa::msv 模块,可采取以下防护措施: 保护 lsass.exe 进程 启用 Credential Guard 限制对 lsass.exe 的调试权限 使用 Protected Process Light (PPL) 监控与检测 监控对 lsass.exe 的异常访问 检测 Mimikatz 特征码和行为模式 启用 Windows Defender ATP 等高级威胁防护 缓解措施 禁用 LM 哈希存储 启用 NTLMv2 并禁用较弱的认证协议 定期轮换特权账户凭据 架构安全 实施最小权限原则 使用 Windows Hello 或智能卡等替代认证方式 部署 LSA 保护机制 6. 总结 Mimikatz 的 sekurlsa::msv 模块通过深入分析 Windows 认证子系统内部数据结构,实现了从内存中提取凭据的能力。理解其工作原理不仅有助于渗透测试和取证分析,更能帮助系统管理员构建更强大的防御体系。 关键要点: 依赖于 lsasrv.dll 中的全局变量定位会话信息 使用特征码扫描技术适应不同 Windows 版本 通过逆向 CNG 加密机制解密内存中的凭据 从复杂的链式结构中提取用户信息和哈希值 防御需要多层次的综合防护策略