Windows操作系统在确定进程映像FILE_OBJECT位置方面存在不一致性,这影响了非EDR(端点检测和响应)端点安全解决方案(如Microsoft Defender Realtime Protection)检测恶意进程中加载的正确二进制文件的能力。这种不一致性导致McAfee开发了一种新的Post-Exploitation绕过技术,我们称之为“进程重新映像(Process Reimaging)”。这种技术相当于在“Mitre攻击防御绕过类别(Mitre Attack Defense Evasion Category)”中实施的Process Hollowing或Process Doppelganging,不过由于不需要代码注入,因此该进程执行起来要容易得多。虽然这个绕过技术已经成功地针对Microsoft Windows和Defender的当前版本进行了测试,但是它很有可能适用于任何端点安全供应商或实现下面讨论的API的产品。
Windows内核ntoskrnl.exe通过NTDLL.dll API发布功能,以支持用户模式组件,如Endpoint Security Solution(ESS)服务和进程。K32GetProcessImageFileName就是这样一个API,它允许ESS验证进程属性以确定它是否包含恶意二进制文件以及是否可以信任它来调用其基础结构。 Windows内核API返回过期且不一致的FILE_OBJECT路径,这使得攻击者可以绕过Windows操作系统进程属性验证。我们开发了一个概念验证,它通过隐藏进程EXE的物理位置来利用此FILE_OBJECT位置不一致性。
此PoC允许我们持久化一个恶意进程(post exploit),它不会被Windows Defender检测到。
Windows Defender无法检测到进程重新映像技术,除非它具有恶意文件的签名并在创建进程之前将其扼杀在磁盘上,或者在可疑设备上执行完全扫描以便检测磁盘上的文件。除了进程重新映像和保护建议之外,本文还包括对用于进程属性验证和进程重新映像攻击向量的Windows内核API进行逆向技术的深入研究。注意,本文以SynAck勒索软为例进行说明。
杀毒扫描程序检测
当杀毒扫描程序在系统上处于活动状态时,它将通过检测包含恶意内容的运行代码,以及在写入时或加载时检测恶意文件来防止感染。
加载映像的实际顺序如下:
1.FileCreate——打开文件以便能够映射到内存中;PHP大马
2.Section Create——文件被映射到内存中;
3.Cleanup——关闭文件句柄,留下一个用于PAGING_IO的内核对象;
4.ImageLoad——文件已加载;
5.CloseFile——文件已关闭;
如果杀毒扫描程序在加载时处于活动状态,则可以使用上述步骤(1,2和4)中的任何一个来保护操作系统免受恶意代码的攻击。如果在加载映像时杀毒扫描程序未处于活动状态,或者它不包含已加载文件的定义,则可以向操作系统查询有关构成该进程的文件的信息并扫描这些文件。进程重新映像是一种在步骤4中绕过病毒扫描的机制,适用于当病毒扫描程序错过启动进程或在加载时没有足够的病毒定义时。
目前,还没有标准的方法来安全地识别与Windows上正在运行的进程相关联的基础文件。这是由于Windows无法从NTDLL API检索正确的映像文件路径,这可以绕过Defender(MpMsEng.exe/MpEngine.dll),其中正在执行的文件是“可能不需要的程序”,如mimikatz.exe。如果在启动mimikatz期间启用了Defender,则会在第1阶段或第2阶段被检测到。如果未启用Defender,或者当前签名文件无法识别启动的程序,则允许启动该文件。启用Defender后,或者更新签名,然后Defender将使用K32GetProcessImageFileName来标识基础文件。如果使用我们的进程重新映像技术创建了该进程,那么运行中的恶意软件将不再被检测到。因此,任何正在运行的安全服务审计程序都将无法识别与正在运行的进程关联的文件。
轻松绕过安全防御机制
Mitre ATT&CK模型如下,其中包含了攻击者使用的Post-Exploitation策略和技术。