译文声明
本文是翻译文章,文章原作者mcafee,文章来源:securingtomorrow.mcafee.com 原文地址:https://securingtomorrow.mcafee.com/other-blogs/mcafee-labs/in-ntdll-i-trust-process-reimaging-and-endpoint-security-solution-bypass/
译文仅供参考,具体内容表达以及含义原文为准
进程重镜像概述
Windows操作系统在判断进程镜像FILE_OBJECT的位置时存在不一致性,这就会影响非EDR终端安全解决方案在检测恶意进程代码时的能力。也正是这种不一致性,促使McAfee研发了出了一中新型的后渗透绕过技术,我们将这种技术称之为“进程重镜像”。这种技术跟Process Hollowing以及Process Doppelganging很相似(归类为Mitre攻击防御绕过技术),但是“进程重镜像”更容易执行,因为它不需要进行代码注入。目前,我们这项技术已经在当前版本的Windows以及Windows Defender上测试成功,而且这种技术很可能适用于其他实现了文中讨论的API的终端安全厂商的或产品。
Windows内核-ntoskrnl.exe可以通过NTDLL.dll API来给用户模式组件提供功能支持,比如说终端安全解决方案(ESS)服务和进程等等。其中一个API就是K32GetProcessImageFileName,它允许ESS对进程属性进行验证以判断其是否包含恶意代码,或是否信任它所发起的基础设施调用请求。Windows内核API会返回不一致的FILE_OBJECT路径,这将允许攻击者绕过Windows操作系统的进程属性验证。我们已经开发出了一份PoC代码并通过隐藏进程EXE的物理路径来利用这种FILE_OBJECT路径的不一致性。
PoC允许我们实现恶意进程的持久化植入(后渗透阶段),而且不会被Windows Defender检测到。
除非已有而已文件签名,或在进程创建之前就在磁盘中屏蔽,否则Windows Defender是无法检测到进程重镜像技术的。在这篇文章中,我们将深入讨论Windows内核API的进程属性验证以及进程重镜像攻击向量,本文使用SynAck勒索软件来作为研究案例。
反病毒扫描检测
如果系统中安装了反病毒扫描工具,它将会通过对包含了恶意内容的运行代码进行检测或检测恶意文件的写入/加载来保护终端系统的安全。
下面给出的是一个镜像的实际加载过程:
1、 FileCreate – 打开文件,并映射进内存;
2、 Section Create – 文件已成功映射进内存;
3、 Cleanup – 关闭文件处理句柄,生成内核对象以供PAGING_IO使用;
4、 ImageLoad – 文件加载;
5、 CloseFile – 文件关闭;
如果反病毒扫描工具已激活,它就可以利用上述的步骤1、2和4来保护操作系统免受恶意代码的攻击。如果镜像在加载时,反病毒扫描工具没有激活,或镜像中不包含恶意内容,那么它就会询问操作系统建立该进程的文件,并扫描这些文件。而进程重镜像这种机制,可以在第四步时绕过反病毒扫描。
破坏原有的信任模型
Mitre攻击模型是攻击者定义的后渗透攻击策略与技术,针对的是Windows、Linux和macOS终端保护解决方案:
一旦攻击者能在目标设备上执行任意代码之后,那么在进行横向渗透之前,他们会尝试实现持久化的提权,并禁用安全防护机制。他们可以使用进程篡改技术来在受信进程中执行任意代码,这样就可以绕过防御机制了。进程篡改技术主要利用的是Windows操作系统的合法功能来伪造出受信进程,最终执行目标代码。
进程篡改技术(SynAck勒索软件)
McAfee高级威胁研究团队在2018年就对SynAck勒索软件进行过分析,并发现它使用了Process Doppelganging和Process Hollowing技术来绕过终端安全防护。下图显示的是SynAck勒索软件使用Process Hollowing实现防御绕过的流程图:
下图显示的是SynAck勒索软件使用Process Doppleganging实现防御绕过的流程图:
进程重镜像
Windows内核API在返回FILE_OBJECT路径时存在不一致性,这将允许攻击者绕过Windows操作系统的进程属性验证机制。这样一来,攻击者就可以通过隐藏进程EXE文件的物理位置来注入持久化的恶意进程(后渗透阶段)了。
下图显示的是SynAck勒索软件使用进程重镜像技术实现防御绕过的流程图:
进程重镜像深入分析
NtQueryInformationProcess会从内核中的EPROCESS结构中获取所有的进程信息,而NtQueryVirtualMemory会从EPROCESS结构中的Virtual Address Descriptors (VADs)域中提取出所需数据。
EPROCESS结构中包含文件名和路径信息(Windows 10):
+0x3b8 SectionObject (文件名和路径)
+0x448 ImageFilePointer* (文件名和路径)
+0x450 ImageFileName (文件名)
+0x468 SeAuditProcessCreationInfo (文件名和路径)
内核API NtQueryInformationProcess会由下列基于内核/NTDLL API调用:
K32GetModuleFileNameEx
K32GetProcessImageFileName
QueryFullProcessImageImageFileName
VAD中包含指向FILE_OBJECT的指针,并获取进程中的所有映射镜像,其中包含了文件名和文件路径
内核API NtQueryVirtualMemory由下列基于内核/NTDLL API调用:
GetMappedFileName
当FILE_OBJECT路径被篡改之后,Windows将无法更新上述的内核结构域,Windows只会更新FILE_OBJECT的文件名和其中部分域:
攻击技术解析
进程重镜像技术针对的是攻击的后渗透阶段,此时攻击者已经获取到了目标系统的访问权,这里的关键就是实现FILE_OBJECT文件路径的修改。如果直接将可执行进程的文件路径重命名,就会导致Windows操作系统返回API的错误镜像地址(如下图所示)。目前,所有版本的Windows操作系统都会受到这个问题的影响。
文件名修改 >= Windows 10
如果直接将可执行进程的文件路径重命名,就会导致Windows操作系统返回K32GetProcessImageFileName API的错误镜像地址(如下图所示)。目前,只有Windows 10操作系统都会受到这个问题的影响。
在下图中,由于在偏移量448位置设置了一个新的EPROCESS域(ImageFilePointer),GetModuleFileNameEx和QueryFullProcessImageImageFileName将会获取到修改后的正确文件名。指令(mov r12, [rbx+448h])负责将ImageFilePointer指向EPROCESS结构。
文件名修改 < Windows 10
如果直接将可执行进程的文件路径重命名,就会导致Windows操作系统返回K32GetProcessImageFileName API、GetModuleFileNameEx API和QueryFullProcessImageImageFileName API的错误镜像地址(如下图所示)。目前,只有Windows 7和Windows 8操作系统都会受到这个问题的影响。
GetModuleFileNameEx和QueryFullProcessImageImageFileName将会获取到不正确的文件名,其中PsReferenceProcessFilePointer指向的是偏移量0x3b8。
如果你想保证成功绕过安全检测的话,还需要满足下列先决条件:
1、 LoadLibrary或CreateProcess必须使用磁盘中准确的文件来作为初始加载库;
2、 文件路径必须重命名(如果将相同文件放入新创建的路径,是没有效果的);
进程重镜像技术能够以下列两种方式来结合LoadLibrary FILE_OBJECT重用攻击向量:
第一种方法:LoadLibrary
当一个ESS或应用程序调用GetMappedFileName API来获取一个内存映射的镜像文件时,进程重镜像技术将会导致Windows操作系统返回错误的路径。目前,所有的Windows操作系统版本都会受到这个问题的影响。
第二种方法:CreateProcess
当一个ESS或应用程序调用GetMappedFileName API来获取一个进程镜像文件时,进程重镜像技术将会导致Windows操作系统返回错误的路径。目前,所有的Windows操作系统版本都会受到这个问题的影响。
终端保护建议
McAfee高级威胁研究团队在2018年6月5日将进程重镜像技术的技术细节提交给了微软公司,微软也在2019年6月份发布了针对进程冲进想FILE_OBJECT文件名篡改攻击向量的更新补丁。这份补丁只适用于Windows 10,而其他版本的Windows操作系统仍然会受到这个问题的影响。