探索Mimikatz-第2部分-SSP
字数 1700 2025-08-18 17:33:25
Mimikatz深入探索:SSP技术分析与实现
前言
本文是Mimikatz探索系列的第二部分,重点分析Mimikatz中与SSP(Security Support Provider)相关的技术实现。SSP是Windows身份验证架构中的关键组件,Mimikatz利用SSP接口实现了多种凭据提取技术。
SSP基础概念
SSP(安全支持提供程序)是一个DLL,在身份验证和授权事件过程中提供回调函数接口。Wdigest等系统组件就是通过SSP接口缓存凭据的。
Mimikatz提供了两种主要的SSP利用技术:
- Mimilib - 实现SSP接口的DLL
- smemssp - 通过内存patch实现的SSP功能
Mimilib技术分析
核心实现
Mimilib的SSP功能入口点在kssp.c文件中的kssp_SpLsaModeInitialize函数,通过mimilib.def导出为SpLsaModeInitialize。
注册的关键回调函数:
SpInitialize- 初始化SSPSpShutDown- 卸载SSPSpGetInfoFn- 提供SSP信息SpAcceptCredentials- 接收明文凭据
凭据窃取机制
kssp_SpAcceptCredentials函数实现凭据窃取:
NTSTATUS NTAPI kssp_SpAcceptCredentials(SECURITY_LOGON_TYPE LogonType,
PUNICODE_STRING AccountName,
PSECPKG_PRIMARY_CRED PrimaryCredentials,
PSECPKG_SUPPLEMENTAL_CRED SupplementalCredentials)
{
FILE *kssp_logfile;
if(kssp_logfile = _wfopen(L"kiwissp.log", L"a")) {
klog(kssp_logfile, L"[%08x:%08x] [%08x] %wZ\\%wZ (%wZ)\t",
PrimaryCredentials->LogonId.HighPart,
PrimaryCredentials->LogonId.LowPart,
LogonType,
&PrimaryCredentials->DomainName,
&PrimaryCredentials->DownlevelName,
AccountName);
klog_password(kssp_logfile, &PrimaryCredentials->Password);
klog(kssp_logfile, L"\n");
fclose(kssp_logfile);
}
return STATUS_SUCCESS;
}
加载方式
- 传统方法:修改注册表并重启系统
- 动态方法:使用
AddSecurityPackageAPI
检测与规避
Mimilib可以通过EnumerateSecurityPackages函数枚举发现:
EnumerateSecurityPackagesA(&packageCount, &packages)
返回的信息中包含SSP名称和描述,默认值为:
- Name: "KiwiSSP"
- Comment: "Kiwi Security Support Provider"
可以通过修改kssp_SpGetInfo函数中的硬编码值来规避检测。
MemSSP技术分析
实现原理
MemSSP通过直接patch lsass进程内存实现,hook msv1_0.dll中的SpAcceptCredentials函数。
关键步骤
- 打开lsass进程:
OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION)
-
定位
msv1_0.dll模块 -
搜索并patch目标函数
Hook工作流程
- 创建存根函数生成日志文件
- 将凭据写入日志文件
- 返回到原始函数
风险分析
主要风险点在于使用WriteProcessMemory API,可能被安全产品检测。
高级技术:无WriteProcessMemory的MemSSP
RPC调用分析
AddSecurityPackage实际通过RPC与lsass通信:
- 接口UUID:
4f32adc8-6052-4a04-8701-293ccf2096f0 - 函数编号: 3 (对应
SspirCallRpc)
服务器端处理流程
sspisrv.dll处理RPC调用- 通过
gLsapSspiExtension分发到LsapSspiExtensionFunctions LpcHandler进一步处理参数DispatchApi通过LpcDispatchTable分发调用WLsaAddPackage执行权限检查SpmpLoadDll加载SSP DLL
实现优化
- 通过RPC直接加载DLL,避免直接调用
AddSecurityPackage - 在DLL的
DllMain中返回FALSE,使DLL加载后立即卸载,避免注册表修改 - 支持UNC路径加载远程DLL
防御建议
- 监控lsass进程中的异常DLL加载
- 检测
WriteProcessMemory对lsass的调用 - 定期检查已注册的SSP列表
- 监控
AddSecurityPackageAPI调用 - 检查lsass内存中的异常hook
总结
Mimikatz的SSP技术提供了多种凭据提取方法,从传统的DLL加载到高级的内存patch技术。理解这些技术的实现原理有助于开发定制化的攻击payload,同时也为防御方提供了检测思路。通过结合RPC调用和内存patch技术,可以实现更隐蔽的凭据窃取方法。