背景:
大约3个月前,InfoSec社区介绍了一种称为“进程重映像(Process Reimaging
)”的新型攻击技术。该技术由McAfee安全团队在博客中发布,标题为“我信任NTDLL——进程重镜像和绕过终端安全解决方案 ”。在这种攻击技术发布几天后,我的一位同事兼朋友Dwight Hohnstein给出了演示该技术的POC的代码,可在他的Github 上找到。尽管该技术没有被归类到MITRE ATT&CK,但我相信它将属于“ 防御逃避 ”战术分类。
尽管此博客的目的是展示用来检测这种攻击的方法,但它假定您已阅读了McAfee团队发布的博客并阅读了Dwight的POC代码。攻击的的简要概述如下:
进程重镜像是一种利用Windows操作系统在确定进程镜像的FILE_OBJECT位置时存在的不一致的攻击技术。这意味着攻击者可以投递一个恶意二进制文件到磁盘上,并通过在执行初始阶段将完整文件路径替换为可信的二进制文件路径来隐藏恶意文件的物理位置。反过来,这允许攻击者绕过Windows操作系统的进程属性验证,允许在任选的进程镜像上下文中隐藏他们自身。
此攻击涉及三个阶段:
投递二进制文件到磁盘。——这个假设 指攻破系统并可以投递二进制文件到磁盘。
加载未检测的二进制文件。这里指进程创建后加载的最初二进制镜像。
恶意二进制文件被“重镜像”为想要显示成的一个已知无害二进制文件。这是可以实现的,因为虚拟地址描述符(Virtual Address Descriptors,VADs)在镜像被重命名后不会更新。因此,这允许当其它应用查询时,返回错误的进程镜像文件信息。
这使攻击者有机会防御性地逃避分析人员和应急响应人员的检测。通常的组织都没有收集到“正确”的数据。常常,收集的数据是非结构化的、免费的并缺少得出结论所需的实质性细节。如果没有高质量的数据,组织可能就不会发现穿越他们环境的程序采用的技术。而且,由于过度依赖EDR产品(如,Windows Defender,等等)的基本配置,您会将检测到的恶意活动的详细信息提供给第三方,第三方可能会也可能不会采用正确的函数调用来检测此恶意活动(如,使用GetMappedFileName正确地检测这种重镜像攻击)。基于这些因素,此攻击可使攻击者成功逃避检测。有关该攻击的更多细节信息,请查阅该主题的原始博客“技术深度学习 ”部分(译者注:McAfee原文中)。
注释: GetMapperedFileName 是应用程序用来查询进程信息的API。它检查所请求的地址是否在指定进程地址空间中的内存映射文件内。如果地址在内存映射文件内,它会返回内存映射的文件名。该API需要PROCESS_QUERY_INFOMATION和PROCESS_VM_READ访问权限。任何时候,只要句柄具有PROCESS_QUERY_INFORMATION访问权限,它也会被授予pROCESS_QUERY_LIMITED_INFORMATION 。这些访问权限的位掩码为0x1010。这看起来很熟悉,因为这是使用Mimikatz所需的访问权限。Matt Graeber提醒我注意尝试基于授予的权限检测对LSASS的可疑访问时会有许多来源。
透明度:
该攻击发布后,我花费了一个星期六创建捕获假设,仔细研究数据的访问行为,并查找其关系。当阅读Dwight的POC时,我注意到代码中的Win32 API调用,据此,我确信我可以将这些API调用和特定事件关联起来。因为像许多防御产品一样,我做了一些假设像EDR产品和他们的记录功能。
没有已知的API到事件ID的映射,我自己开始映射这些调用。我开始时(并持续)专注映射的Sysmon方面。这涉及逆向工程Sysmon驱动来映射API调用到事件注册机制,再到事件ID。非常感谢Matt Graeber,他帮助我完成了这项任务,并花时间教我逆向工程的过程 。创建此映射是我实施的“检测策略”的重要部分,没有它就不可能实现。
进程重映像检测:
检测方法:
进行这项检测的研究方法如下:
阅读“进程重映像”攻击的技术文章。
通读Dwight的POC代码。
获得攻击是怎么执行的相关知识,在数据和攻击行为间建立关系。
执行攻击。
结合研究结果和数据关系进行可靠的检测。
检测浏览
当浏览 技术深度学习 部分时,这很醒目:
281K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6k6h3y4#2M7X3W2F1k6%4c8G2L8h3!0J5M7X3!0%4i4K6u0W2L8h3y4S2k6X3g2W2i4K6u0W2j5$3!0E0i4K6u0r3L8%4c8Z5k6i4u0Q4x3X3c8T1L8r3!0Y4M7#2)9J5c8X3#2U0j5h3k6W2k6g2)9J5k6r3I4S2j5Y4y4Q4x3V1k6A6L8W2)9J5k6r3&6@1k6r3I4D9i4K6u0V1K9g2)9J5k6s2c8J5N6i4y4@1i4K6u0V1M7s2u0G2j5$3g2K6M7#2)9J5k6s2u0W2K9h3#2S2k6$3W2F1k6#2)9J5k6r3q4F1k6q4)9J5k6r3g2F1k6s2m8G2K9h3&6@1i4K6u0V1M7$3g2U0N6i4u0A6N6s2W2Q4x3X3c8K6L8$3I4#2N6r3W2G2L8W2)9J5k6r3u0&6M7r3q4K6M7#2)9J5c8R3`.`.
上图展示了一些API调用,这些引起了我的兴趣。
LoadLibrary
CreateProcess
基于我对Sysmon驱动内部的研究,这两个API调用均被应用了某个事件注册机制。随后,该注册机制被Sysmon驱动使用输入/输出接口控制(IOCTL)代码调用来查询数据。查询的数据将会被传回Sysmon二进制文件,随后产生相关的事件ID。
上述两个API调用对应的过程如下所示: Sysmon事件ID1的映射:进程创建 Sysmon事件ID 7 的映射:镜像加载
基于这项研究和McAfee文章中技术深入探讨部分,我知道了攻击执行时,会产生什么数据。Sysmon对每个LoadLibrary调用产生事件ID 7,CreateProcess调用产生事件ID 1;然而,我如何将数据 转化为可操作的数据 ? 威胁猎杀者可以轻易使用和操作以满足他们需求的数据?为此,我们专注于数据标准化和数据质量。
数据质量源自数据标准化。数据标准化是将数据转化为可以轻松分析的通用可读格式的过程。数据质量是确保环境收集正确数据的过程,可以用来定位特定的攻击技术。这可以通过对比非恶意数据产生的行为和攻击发生过程中的数据产生的行为之间的关系来实现。
例如,当创建一个进程是,OriginalFileName (Sysmon一个新添加项)应该与Sysmon事件ID 1中的镜像(Image) 部分匹配。假设您要启动PowerShell,当你启动PowerShell,OriginalFileName 将会是 Powershell.EXE , Image 会是 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 。如果这两项不匹配,则表明可能存在恶意活动。进程重镜像后,应用程序调用GetMappedFileName API来获取进程镜像文件,Windows会发送回错误的文件路径。
[注意]看雪招聘,专注安全领域的专业人才平台!