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——打开文件以便能够映射到内存中;
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策略和技术。
Mitre Enterprise ATT&CK
当今的网络安全框架多是创建在防御的方面,值得注意的是,近年也有以剖析攻击面为出发的网络安全框架,而MITRE ATT&CK就是典型的例子,它对于攻击流程的定义,提出了更有系统性的归纳,成为简单易懂的模型与通用语言,这也让各家网络安全企业在说明网络攻击链(Cyber Kill Chain)时,有统一的标准去依循,而企业也可通过这样的工具,更方便地理解攻击者行为带来的安全风险。
一旦攻击者在终端上获得代码执行,在进行大范围感染之前,他们将寻求获得持久性,特权升级和绕过防御的能力。他们可以使用进程操作技术实现绕过,以使代码在受信任的进程中执行。进程操作技术已经存在了很长时间,并且从进程注入演变Process Hollowing 和Process Doppelganging,目的是模拟可信进程。虽然Miter ATT&CK和Unprotect Project也记录了其他进程操作技术,但我们将重点关注Process Hollowing 和Process Doppelganging。进程操作技术利用Windows操作系统的合法功能来模拟受信任的进程可执行二进制文件,并且通常需要代码注入。
ESS将信任机制(inherent trust)内置于Windows操作系统中,以实现数字签名验证和进程属性验证等功能。正如Specter Ops所证明的那样,ESS对Windows操作系统的信任可能会因为数字签名验证而被破坏。
同样,进程重新映射破坏了ESS在Windows操作系统中对进程属性验证的信任。
当一个进程被ESS信任时,它被认为不包含恶意代码,也可以被信任调用ESS受信任的基础架构。
McAfee高级威胁研究(ATR)团队的分析人员使用Mitre ATT&CK框架分析与进攻技术(例如绕过防御技相关的活动。这种分析,可以帮助组织了解攻击者的行为和进化,以便他们可以评估自己的安全状况并做出适当的反应来控制和消除攻击,McAfee ATR会创建并共享基于威胁分析的Yara规则。
进程操作技术(以SynAck勒索软件为例)
McAfee在2018年就分析过SynAck勒索软件,并发现它使用Process Doppelganging和 Process Hollowing作为其备用绕过技术。我们使用此恶意软件来解释Process Doppelganging和Process Hollowing技术,就是为了将它们与基于真实世界观察的进程重新映像进行比较。
进程操作防御绕过技术(Process Manipulation defense evasion)不断发展,Process Doppelganging于2017年公开发布,目的是让ESS在保护和检测能力方面取得进步。由于进程操作技术通常利用Windows操作系统的合法功能,因此如果杀毒扫描程序在进程启动之前未被阻止,则之后就很难被防御。
Process Hollowing
当进程在挂起状态下创建然后其内存在未映射的情况下,被恶意代码替换,此时,就会发生Process Hollowing。恶意代码的执行是掩盖在一个合法的进程下的,并且可能会绕过防御和检测分析。
SynAck勒索软件采用Process Hollowing来绕过安全检测
Process Doppelganging
Process Doppelgänging会替换合法进程的内存,使恶意代码可以在隐藏的状态下,绕过防御和检测。Process Doppelgänging使用Windows Transactional NTFS(TxF)也可以避免使用高度监控的API函数,如NtUnmapViewOfSection,VirtualProtectEx和SetThreadContext。
SynAck勒索软件采用Process Doppelganging来绕过安全检测
进程重新映像的武器化过程
由于Windows内核API返回过期且不一致的FILE_OBJECT路径,这使得攻击者可以绕过Windows操作系统进程属性验证。这允许攻击者通过隐藏进程EXE的物理位置来持久化恶意进程(post exploitation)。
SynAck勒索软件采用进程重新映像来绕过安全检测
NtQueryInformationProcess从内核中的EPROCESS结构字段中检索所有进程信息,NtQueryVirtualMemory从EPROCESS结构中的虚拟地址描述符(VAD)字段中检索信息。
EPROCESS结构包含以下字段/偏移量的文件名和路径信息(参见下图):
+ 0x3b8 SectionObject(文件名和路径);
+ 0x448 ImageFilePointer*(文件名和路径);
+ 0x450 ImageFileName(文件名);
+ 0x468 SeAuditProcessCreationInfo(文件名和路径);
注意:此字段仅出现在Windows 10中。
在NTDLL中显示NtQueryInformationProcess文件名API的代码复杂度IDA图
内核API NtQueryInformationProcess通过以下kernelbase/NTDLL API来使用:
· K32GetModuleFileNameEx;
· K32GetProcessImageFileName;
· QueryFullProcessImageImageFileName;
VAD为进程中的所有映射映像保存一个指向FILE_OBJECT的指针,其中包含文件名和文件路径(见下图)。
内核API NtQueryVirtualMemory通过以下kernelbase/NTDLL API来使用:
· GetMappedFileName
在NTDLL中显示NtQueryVirtualMemory文件名API的代码复杂度IDA图
在创建进程后修改FILE_OBJECT文件路径时,Windows无法更新上述任何内核结构字段。对于上述某些字段,Windows会更新FILE_OBJECT文件名的更改。
VAD反映了创建进程后加载的映像的任何文件名更改,但不反映文件路径的任何重命名。
EPROCESS字段也无法反映进程文件路径的任何重命名,只有ImageFilePointer字段反映了文件名更改。
因此,当ESS或其他应用程(见下表)调用时,NtQueryInformationProcess和NtQueryVirtualMemory导出的API会返回错误的进程映像文件信息。
攻击发生的先决条件
进程重新映像发生在Post-Exploitation阶段,此时,攻击者已经获得了对目标系统的访问权限。这与Mitre ATT&CK框架的防御绕过类别中的Process Hollowing或Process Doppelganging技术相同。
进程重新映像攻击向量
FILE_OBJECT文件路径更改
只需重命名正在执行的进程的文件路径,Windows操作系统就会返回所有API的错误映像位置信息(见下图)。这会在测试时,影响所有Windows操作系统版本。
FILE_OBJECT文件路径更改,文件路径更改影响所有Windows操作系统版本
FILE_OBJECT文件名更改
Filename Change >= Windows 10
简单地重命名正在执行的进程的文件名会导致Windows操作系统返回K32GetProcessImageFileName API的错误映像信息(参见下图),目前已被证实仅对Windows 10有影响。
FILE_OBJECT文件名更改:文件名更改影响Windows> = Windows 10
根据下图可知,GetModuleFileNameEx和QueryFullProcessImageImageFileName将获得正确的文件名更改,这是由于一个新的EPROCESS字段ImageFilePointer位于偏移量448处。那里的指令(mov r12,[rbx + 448h])将ImageFilePointer从偏移448引用到EPROCESS结构中。
NtQueryInformationProcess(Windows 10):Windows 10 RS1 x64 ntoskrnl版本10.0.14393.0
Filename Change 简单地重命名一个正在执行的进程的文件名,会导致Windows操作系统返回K32GetProcessImageFileName,GetModuleFileNameEx和QueryFullProcessImageImageFileName API的错误映像信息(见下图),这已被证实会影响Windows 7和Windows 8。
FILE_OBJECT文件名更改:文件名更改影响Windows
根据下图,GetModuleFileNameEx和QueryFullProcessImageImageFileName将获得错误的文件名(PsReferenceProcessFilePointer引用EPROCESS offset 0x3b8 SectionObject)。
NtQueryInformationProcess(Windows 7和8):Windows 7 SP1 x64 ntoskrnl版本6.1.7601.17514
LoadLibrary FILE_OBJECT重用
LoadLibrary FILE_OBJECT重用是基于以下的事实:当在EXE或DLL上的LoadLibrary和FreeLibrary之后调用LoadLibrary或CreateProcess时,该进程将重用内存中来自先前LoadLibrary的现有映像FILE_OBJECT。
顺序如下:
1.LoadLibrary(路径\文件名);
2.FreeLibrary(路径\文件名);
3.LoadLibrary(重命名为路径\文件名)或CreateProcess(重命名为路径\文件名);
这导致Windows在上面的步骤3的进程中创建VAD条目,该条目重用仍然在进程内存中的FILE_OBJECT,该对象是在上面步骤1中创建的。由于VAD现在为磁盘上的文件提供了不正确的文件路径信息,因此GetMappedFileName API将在磁盘上返回相关映像的错误位置。
要成功绕过检测,则需要满足以下先决条件:
LoadLibrary或CreateProcess必须在磁盘上使用与初始LoadLibrary完全相同的文件;
必须重命名Filepath(将相同的文件拖放到新创建的路径中将不起作用);
使用LoadLibrary FILE_OBJECT重用攻击向量,可以通过以下两种方式使用进程重新映像技术;
1.LoadLibrary方式(见下图):
当ESS或应用程序调用GetMappedFileName API来检索内存映射映像文件时,进程重新映射将导致Windows 操作系统返回错误的路径,这会在测试时影响所有Windows操作系统版本。
LoadLibrary FILE_OBJECT重用(LoadLibrary),使用LoadLibrary的进程重新映像技术影响所有Windows操作系统版本
2. CreateProcess(见下图):
当ESS或应用程序调用GetMappedFileName API来检索进程映像文件时,进程重新映像将导致Windows OS返回错误的路径,这在测试时影响所有Windows OS版本。
LoadLibrary FILE_OBJECT重用(CreateProcess):使用CreateProcess的进程重新映像技术影响所有Windows操作系统版本
进程操作技术比较:
Windows Defender进程重新映像文件路径绕过过程
此视频演示了如何将零日恶意软件(以Mimikatz PUP为例)植入到磁盘并作为恶意进程“phase1.exe”执行。使用进程重新映像 文件路径攻击向量,我们证明即使Defender使用磁盘上的恶意软件签名进行更新,它也不会检测正在运行的恶意进程。因此,对于非EDR ESS,例如Defender实时保护,恶意进程可以驻留在Windows设备上,直到重新启动或设备在签名更新后接收完整扫描。(视频地址:https://www.youtube.com/embed/dQogaxinTXk)