探索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利用技术:

  1. Mimilib - 实现SSP接口的DLL
  2. smemssp - 通过内存patch实现的SSP功能

Mimilib技术分析

核心实现

Mimilib的SSP功能入口点在kssp.c文件中的kssp_SpLsaModeInitialize函数,通过mimilib.def导出为SpLsaModeInitialize

注册的关键回调函数:

  • SpInitialize - 初始化SSP
  • SpShutDown - 卸载SSP
  • SpGetInfoFn - 提供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;
}

加载方式

  1. 传统方法:修改注册表并重启系统
  2. 动态方法:使用AddSecurityPackage API

检测与规避

Mimilib可以通过EnumerateSecurityPackages函数枚举发现:

EnumerateSecurityPackagesA(&packageCount, &packages)

返回的信息中包含SSP名称和描述,默认值为:

  • Name: "KiwiSSP"
  • Comment: "Kiwi Security Support Provider"

可以通过修改kssp_SpGetInfo函数中的硬编码值来规避检测。

MemSSP技术分析

实现原理

MemSSP通过直接patch lsass进程内存实现,hook msv1_0.dll中的SpAcceptCredentials函数。

关键步骤

  1. 打开lsass进程:
OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION)
  1. 定位msv1_0.dll模块

  2. 搜索并patch目标函数

Hook工作流程

  1. 创建存根函数生成日志文件
  2. 将凭据写入日志文件
  3. 返回到原始函数

风险分析

主要风险点在于使用WriteProcessMemory API,可能被安全产品检测。

高级技术:无WriteProcessMemory的MemSSP

RPC调用分析

AddSecurityPackage实际通过RPC与lsass通信:

  • 接口UUID: 4f32adc8-6052-4a04-8701-293ccf2096f0
  • 函数编号: 3 (对应SspirCallRpc)

服务器端处理流程

  1. sspisrv.dll处理RPC调用
  2. 通过gLsapSspiExtension分发到LsapSspiExtensionFunctions
  3. LpcHandler进一步处理参数
  4. DispatchApi通过LpcDispatchTable分发调用
  5. WLsaAddPackage执行权限检查
  6. SpmpLoadDll加载SSP DLL

实现优化

  1. 通过RPC直接加载DLL,避免直接调用AddSecurityPackage
  2. 在DLL的DllMain中返回FALSE,使DLL加载后立即卸载,避免注册表修改
  3. 支持UNC路径加载远程DLL

防御建议

  1. 监控lsass进程中的异常DLL加载
  2. 检测WriteProcessMemory对lsass的调用
  3. 定期检查已注册的SSP列表
  4. 监控AddSecurityPackage API调用
  5. 检查lsass内存中的异常hook

总结

Mimikatz的SSP技术提供了多种凭据提取方法,从传统的DLL加载到高级的内存patch技术。理解这些技术的实现原理有助于开发定制化的攻击payload,同时也为防御方提供了检测思路。通过结合RPC调用和内存patch技术,可以实现更隐蔽的凭据窃取方法。

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 - 初始化SSP SpShutDown - 卸载SSP SpGetInfoFn - 提供SSP信息 SpAcceptCredentials - 接收明文凭据 凭据窃取机制 kssp_SpAcceptCredentials 函数实现凭据窃取: 加载方式 传统方法:修改注册表并重启系统 动态方法:使用 AddSecurityPackage API 检测与规避 Mimilib可以通过 EnumerateSecurityPackages 函数枚举发现: 返回的信息中包含SSP名称和描述,默认值为: Name: "KiwiSSP" Comment: "Kiwi Security Support Provider" 可以通过修改 kssp_SpGetInfo 函数中的硬编码值来规避检测。 MemSSP技术分析 实现原理 MemSSP通过直接patch lsass进程内存实现,hook msv1_0.dll 中的 SpAcceptCredentials 函数。 关键步骤 打开lsass进程: 定位 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列表 监控 AddSecurityPackage API调用 检查lsass内存中的异常hook 总结 Mimikatz的SSP技术提供了多种凭据提取方法,从传统的DLL加载到高级的内存patch技术。理解这些技术的实现原理有助于开发定制化的攻击payload,同时也为防御方提供了检测思路。通过结合RPC调用和内存patch技术,可以实现更隐蔽的凭据窃取方法。