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 通过以下步骤定位这些变量:
- 特征码扫描:在 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 进程结构
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 模块,可采取以下防护措施:
-
保护 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 加密机制解密内存中的凭据
- 从复杂的链式结构中提取用户信息和哈希值
- 防御需要多层次的综合防护策略