基于全内存扫描与数据流重组的无文件内存窃取技术分析
概述
在网络安全攻防中,凭据窃取是实现权限提升与横向移动的关键步骤。Windows系统中的lsass.exe
进程因其内存中缓存有用户的密码哈希、Kerberos票据等认证信息,是该领域的核心攻击目标。随着终端检测与响应(EDR)等安全解决方案的发展,依赖标准API(如MinidumpWriteDump
)的传统工具正面临越来越高的检测率。
为规避现有监控机制,出现了一种更底层的内存窃取技术。该技术不使用常规的、易于监控的系统函数,而是采用全内存扫描的方式,直接在目标进程的虚拟内存空间中定位所需数据,并以无文件(Fileless)的方式完成凭据窃取。本文旨在对此技术的实现流程、核心原理及规避策略进行深入的技术分析。
核心原理:规避高层API,直接操作底层数据
现代EDR产品的防御逻辑,主要基于对特定高风险API调用和行为模式的监控。在内存窃取场景下,以下行为被视为高风险指标:
1. 调用 MinidumpWriteDump
函数:这是最直接的进程内存转储行为,已被安全产品严密监控。
2. 访问PEB
进程环境块:攻击者常通过读取目标进程的PEB来获取其已加载的模块列表。因此,一个进程对lsass.exe
的PEB进行读取,同样是高优先级的监控事件。
本文所探讨的技术,其核心原理是规避上述高层API及结构化数据。它不调用任何高级别的转储函数,也放弃了通过PEB定位模块的便捷方式。作为替代,该技术直接在ntdll.dll
层面调用一系列NTAPI,通过手动执行内存查询与数据重组,最终构建出一个最小化的、但符合凭据解析工具要求的Minidump文件。
技术实现:不依赖PEB的完整流程
整个过程可划分为三个主要阶段:权限获取、全内存扫描与模块定位、数据流的手动构建。
第一阶段:获取进程访问权限
此阶段是后续所有操作的强制性前置条件。对lsass.exe
的内存访问必须获得操作系统的明确授权。
1. 启用调试权限:程序首先调用NtOpenProcessToken
打开自身进程的访问令牌,随后调用NtAdjustPrivilegesToken
来启用令牌中已存在的SeDebugPrivilege
。
2. 管理员权限的必要性:SeDebugPrivilege
默认仅授予系统管理员(Administrators)用户组。这意味着,执行此程序的用户必须具备管理员权限,否则权限启用操作将失败,导致后续步骤无法执行。
3. 获取进程句柄:在成功启用权限后,调用NtOpenProcess
获取一个拥有PROCESS_VM_READ
(内存读取)和PROCESS_QUERY_INFORMATION
(信息查询)权限的lsass.exe
进程句柄。该句柄是执行后续所有跨进程内存操作的基础。
第二阶段:基于全内存扫描的模块定位
此阶段是该技术规避PEB检测的关键。它采用了一种系统性的内存遍历方法来定位目标模块lsasrv.dll
。
1. 遍历虚拟内存区域:程序在一个循环中,从一个较低的内存地址(如0x0)开始,反复调用NtQueryVirtualMemory
。该API能够返回指定地址所在内存区域的详细信息,包括基地址、大小、状态和保护属性。
2. 识别模块的内存特征:在遍历过程中,程序持续寻找符合已加载模块(DLL/EXE)内存特征的区域。一个被加载模块的基地址,通常指向一个PE文件头。
3. 确认PE文件签名:当发现一个已提交(MEM_COMMIT
)的内存区域时,程序会通过NtReadVirtualMemory
读取该区域的起始数据,并校验其是否包含PE文件的特定文件签名——即起始的“MZ”标识(0x5A4D
)和PE头部的“PE\0\0”签名(0x00004550
)。
4. 比对模块身份:一旦确认这是一个模块的基地址,程序便会在此内存块中搜索lsasrv.dll
这个Unicode字符串。若匹配成功,则意味着已定位目标模块的基地址。
5. 计算模块大小:从已定位的基地址开始,继续向后累加连续内存区域的大小,直至遇到一个不属于该模块的区域,从而计算出lsasrv.dll
在内存中的精确大小。
第三阶段:手动构建Minidump数据流
在获取了所有必要信息后,最后一步是将这些数据片段组装成一个结构合法的Minidump文件。
1. 填充数据流结构体:程序在内存中初始化SystemInfoStream
、ModuleListStream
和Memory64ListStream
三个核心数据流的结构体,并将上一步获取的系统版本、lsasrv.dll
地址和大小等信息填入。
2. 转储原始内存数据:再次完整地遍历lsass.exe
的所有可读内存区域,通过NtReadVirtualMemory
将其实际内容逐块复制出来。
3. 组合并生成输出:最后,将Minidump文件头、流目录、三个核心数据流以及所有原始内存数据块,严格按照Minidump文件格式规范,在内存中拼接成一个完整的字节数组。
无文件攻击的实现:规避磁盘检测
此技术的另一关键优势在于其无文件(Fileless)的特性。整个Minidump的构建过程完全在内存中完成,最终产物是一个字节数组。
• 无需写入磁盘:攻击工具可以避免将包含敏感凭据的转储文件写入本地磁盘。
• 直接内存操作:程序可以直接在内存中对该字节数组进行加密或编码(例如XOR),然后通过网络套接字发送到远程C2服务器。
这种方式可以有效规避依赖静态文件扫描的安全产品,显著增加了检测和取证的难度。
防御策略与技术启示
尽管此技术具有高度的隐蔽性,但其行为模式仍可被检测。防御的重心需要从监控特定的API调用,转向对更底层的、组合性的行为模式进行分析。
1. 监控权限提升与高风险进程访问:建立对lsass.exe
进程访问链的监控规则。任何非系统核心进程,若在启用SeDebugPrivilege
后,紧接着尝试获取lsass.exe
的读取句柄,应被视为高风险事件并进行告警。
2. 检测异常内存扫描行为:一个用户进程对另一个关键系统进程(尤其是lsass.exe
)发起大规模、序列化的NtQueryVirtualMemory
循环调用,这本身构成了异常的行为模式,可作为检测此类扫描技术的重要依据。
3. 启用LSA保护模式:在Windows 8.1及更高版本中,应启用LSA保护(PPL - Protected Process Light)。该系统级安全机制能够从根本上阻止非PPL进程(即使具备管理员权限)对lsass.exe
内存的直接读取,是防御此类攻击最有效的内置措施。
结论
基于全内存扫描的无文件内存窃取技术,反映了当前网络攻击向更底层、更隐蔽方向发展的趋势。它证明了攻击者会利用对操作系统内部机制的深入理解来绕过表层防御。对于防御方而言,深入分析并理解这些高级攻击技术,是将防御体系从被动响应升级为主动威胁狩猎和行为预测的必要前提。只有对底层系统行为建立有效的监控和分析模型,才能构筑更为可靠的安全防线。
📍发表于:中国 北京