威胁狩猎者肩负着艰巨的任务,需要筛选海量且种类繁多的数据,以在攻击生命周期的任何阶段准确定位恶意活动。为了取得成功,狩猎者必须不断磨练他们在最新攻击者技术和检测方法方面的专业知识。内存驻留恶意软件以多种形式出现,是一种存在十多年的攻击者技术。内存驻留恶意软件的流行程度随着时间的推移稳步增加,这可能是由于内存技术的代码和知识的激增造成的。更有可能的是,它的流行反映了基于内存的技术在逃避安全产品和从业人员检测方面的成功。曾经仅限于高级攻击者,内存驻留技术现在已成为所有级别攻击者复杂性的常见手段。我将检查这些基于内存的攻击者技术中最常见的一些,并介绍我们团队的研究,以制定一种可扩展的、低噪声的方法来寻找隐藏在内存中的攻击者。
攻击者技术
在我讨论用于检测网络中攻击者的内存狩猎方法之前,了解常见的内存驻留恶意软件形式很有帮助。这些技术包括shellcode注入、反射性DLL注入、内存模块、进程和模块掏空以及Gargoyle(ROP/APC)。
SHELLCODE注入
Shellcode注入是最基本的内存技术,也是存在时间最长的技术之一。Shellcode注入的基本“方法”是一个四步过程。这些步骤是:1)打开目标进程(OpenProcess);2)在进程中分配一块内存(VirtualAllocEx);3)将shellcode有效负载写入新分配的部分(WriteProcessMemory);以及4)在远程进程中创建一个新线程来执行shellcode(CreateRemoteThread)。古老的Poison Ivy恶意软件使用此技术,这也是多年来如此多的APT组织被它吸引的主要原因。
如果您使用x64dbg提取Poison Ivy样本并在VirtualAllocEx上设置断点,您很快就会找到负责注入的那段代码。
在第一张图像中,在调用VirtualAllocEx之前的push 40指令对应于PAGE_EXECUTE_READWRITE的页面访问保护值。在以下来自ProcessHacker的Poison Ivy植入程序内存布局屏幕截图中,您可以看到它分配了大量这些RWX部分。
典型的代码部分类型为“Image”,并映射到磁盘上的文件。但是,这些类型为“Private”,并且不映射到磁盘上的文件。因此,它们被称为无备份可执行部分或浮动代码。从这些类型的内存区域启动的线程是不正常的,并且是恶意活动的良好指标。ProcessHacker还可以显示恶意软件线程的调用堆栈。调用堆栈中有多个函数不映射到与已加载模块关联的内存。
反射性DLL注入
反射性DLL注入最初由Steven Fewer开发,是另一种内存攻击者技术。Metasploit的Meterperter有效负载是完全将该技术武器化的首次尝试之一,但许多恶意软件家族如今都在使用它。反射性DLL注入的工作原理是创建一个DLL,该DLL在执行时将其自身映射到内存中,而不是依赖于Windows加载程序。注入过程与shellcode注入相同,只是shellcode被自映射DLL替换。添加到DLL的自映射组件负责解析导入地址、修复重定位并调用DllMain函数。攻击者受益于能够使用C/C++等高级语言而不是汇编语言进行编码。
经典的反射性DLL注入(例如Meterpreter使用的注入)很容易被狩猎者发现。即使关闭meterpreter会话,它也会在进程中留下大型RWX内存部分。这些无备份可执行内存部分的开头包含完整的MZ/PE标头,如下面的图像所示。但是,请记住,其他反射性DLL实现可能会擦除标头并修复内存泄漏。
内存中加载的DLL还方便地导出一个名为ReflectiveLoader()的自描述函数。
内存模块
内存模块是另一种内存驻留攻击者技术。它类似于反射性DLL注入,只是注入器或加载器负责将目标DLL映射到内存中,而不是DLL自身映射。从本质上讲,内存模块加载器重新实现了LoadLibrary函数,但它在内存中的缓冲区上运行,而不是在磁盘上的文件上运行。最初的实现旨在将当前进程映射到当前进程,但更新的技术可以将模块映射到远程进程。大多数实现都遵守目标DLL的部分权限,并避免使用嘈杂的RWX方法。
NetTraveler是一个使用内存模块式技术的恶意软件家族。NetTraveler启动时,它会解包核心功能并将其映射到内存中。页面权限更类似于合法的DLL,但是内存区域仍然是私有的而不是映像。
活动线程在这些私有区域具有起始地址。调用堆栈也揭示了这些恶意部分。
Winnti是另一个使用内存模块技术的恶意软件样本。他们在第一页的部分权限上出现了一个小错误,如下所示。
但是,Winnti样本之所以引人注目,是因为DLL中的MZ/PE标头已被删除,使其更难以检测。
进程掏空
进程掏空是攻击者用来防止其恶意软件被安全产品和狩猎者检测到的另一种技术。它涉及创建挂起的进程、取消映射(掏空)进程中的原始可执行文件、将新的有效负载分配并写入进程、使用SetThreadContext将原始线程的执行重定向到新的有效负载,最后调用ResumeThread以完成。更隐蔽的变体使用Create/Map节API来避免WriteProcessMemory。其他变体使用跳转修改入口点而不是使用SetThreadContext。
DarkComet是许多使用进程空洞化技术的恶意软件家族之一。可以使用多种工件来检测进程空洞化。此活动的明显特征之一是使用CREATE_SUSPENDED标志生成的进程,如下面的DarkComet样本截图所示。
模块覆盖
到目前为止,所有讨论的技术都导致了非映像支持代码的执行,因此很容易检测到。另一方面,模块覆盖避免了此要求,使其更难以检测。此技术包括将未使用的模块映射到目标进程,然后用其自身的有效负载覆盖该模块。Flame是第一个广泛公开使用此技术的恶意软件家族。最近,Careto和Odinaff恶意软件家族也使用了模块覆盖技术。可以使用各种技术可靠地检测模块覆盖,这涉及将内存与磁盘上的关联数据进行比较。
石像鬼
石像鬼是一种针对内存驻留恶意软件的概念验证技术,可以逃避许多安全产品的检测。它通过以只读页面保护处于休眠状态来实现这一壮举。然后,它会定期唤醒,使用异步过程调用,并执行ROP链将其有效负载标记为可执行文件,然后再跳转到它。有效负载执行完毕后,石像鬼再次屏蔽其页面权限并返回休眠状态。检测此攻击者技术的一种方法是检查线程和用户APC以查找ROP链的证据。
检测内存攻击
鉴于这些技术的激增和易用性,安全人员必须警惕基于内存的攻击者技术,并主动在其网络上寻找它们。但是,大多数产品无法大规模地通用检测内存攻击,这使得防御者在抵御这些攻击的能力方面存在巨大差距。Endgame已进行大量研究,为我们产品中上述每种方法带来了低噪声检测功能。
鉴于此检测差距的巨大规模和影响,提高所有参与者的能力,而不仅仅是我们客户的能力,非常重要。为此,我们与Jared Atkinson合作开发了他的名为Get-InjectedThreads的PowerShell工具,该工具实现了相对低噪声的内存威胁检测方法。它扫描系统上的活动线程以查找可疑的起始地址。安全人员利用它来扫描其网络中的主机并快速识别许多内存驻留恶意软件技术。该脚本通过使用NtQueryInformationThread函数查询每个活动线程来检索其起始地址。然后使用VirtualQueryEx函数查询起始地址以确定关联的节属性。如果线程启动的内存区域是非映像支持且可执行的(即,不是映像类型并且已设置执行位),则该线程被视为已注入。下面的屏幕截图显示了在感染了9002 RAT 样本的系统上运行时的一个样本检测。
该脚本将捕获各种利用shellcode注入、反射性DLL、内存模块和一些进程空洞化技术的恶意软件家族。但是,它不能替代全面防止内存攻击的安全产品,例如Endgame。
企业级大规模内存检测
Endgame已将针对这些技术(以及更多技术)的检测集成到我们的企业安全平台中,提供了市场上领先的功能来查找内存威胁。我们不仅仅依赖于监控众所周知的系统调用序列以进行进程注入等简单方法,而是有效地分析内存以查找所有已知的规避功能。这为我们的用户提供了注入代码的线程级可见性,以及检查注入代码和仅挂起恶意注入线程以修复威胁等复杂的后续操作。我们的平台有效地阻止了正在发生的注入,并同时查找隐藏在内存中的已驻留对手,并在几秒钟内找到数万台主机上的威胁。
与任何无签名检测技术一样,误报(FP)是一个重要的考虑因素。在我们研究和实施针对上述每种对手技术的基于技术的预防措施时,我们最初在每个步骤都遇到了误报。在我们的产品中正确处理这些误报至关重要。
大多数误报与安全软件、即时(JIT)编译的代码或受DRM保护/打包的应用程序有关。安全产品有时会将代码注入系统中的一些或所有进程,以增强其行为检测能力。缺点是,如果产品的方法粗糙,它实际上可能会损害系统的安全性,并使查找真正的内存威胁变得更加困难。JIT代码是另一个可能出现误报的领域,它在运行时生成存在于非映像支持或浮动内存区域中的汇编代码。.NET或Java应用程序是使用JIT技术的几个示例。幸运的是,这种类型的代码比恶意安全产品更容易识别和过滤。最后,应记住使用数字版权管理 (DRM) 方案打包或保护的应用程序。这些应用程序可能会在内存中解密或去混淆其核心功能,以阻止调试和逆向工程。但是,恶意软件也使用相同的技术来逃避检测并阻止安全从业人员进行分析。
通过仔细的设计决策和广泛的测试,我们已经成功地实现了非常低的误报率,使Endgame用户能够快速清除内存威胁。
结论
攻击者将继续创新新的技术以避免检测并实现其目标。内存驻留技术也不例外,并且十多年来一直是终端安全防御者的棘手问题。幸运的是,通过了解最新的技术,我们可以扭转局面,并利用这些知识开发新的高保真检测方法。在Endgame,我们对这些攻击的全面方法使我们在无文件攻击检测方面处于市场领先地位(增加了我们的其他关键技术)。有关查找内存攻击的更多信息,请查看我们在SANS威胁狩猎和事件响应峰会上发表的幻灯片。