Daniel Stepanic

拥抱攻击性工具:使用 EQL 构建针对 Koadic 的检测

探索使用事件查询语言 (EQL) 构建针对 Koadic 等利用后框架的行为检测的新方法。

13 分钟阅读安全研究
Embracing offensive tooling: Building detections against Koadic using EQL

今年在 BSidesDFW(我的本地安全会议)上,我重点介绍了攻击者使用开源攻击工具的持续趋势。演讲回顾了名为 Koadic 的这些利用后框架之一,并介绍了防御者可以通过使用事件查询语言 (EQL) 构建行为检测的不同方式。在这篇文章中,我想通过提供有关 Koadic 及其功能、为何它具有相关性的背景信息来回顾这项研究,然后深入探讨一些 EQL 示例,在这些示例中,我将分享针对 Koadic 框架的不同检测策略。

攻击者继续采用开源攻击框架作为其工具集的一部分。通过使用这些现成的工具,攻击者能够在降低开发成本的同时完成其目标,并为事件响应者带来归因问题。这些工具通过创建合理的否认概念来挑战传统的调查技术,并留下更少的可以追溯到攻击者的工具痕迹。即使拥有强大的威胁情报能力和适当的防御可见性,也很难区分红队行动与真正的攻击者行为,尤其是在攻击的早期阶段。

作为防御者,我们需要积极监控开源攻击项目。这些项目就像煤矿中的金丝雀,为我们提供了深入了解新攻击者手段的机会。这不仅让我们进入攻击者的思维模式,而且所有代码都可免费用于模拟和审查。从剖析这些工具中获取价值的一些不同方式可以通过验证您的检测能力、生成新的分析、开发威胁狩猎假设或简单地转移有关底层行为的知识来实现。

为何选择 Koadic?

Koadic 是一个很好的候选者,可以演示基于行为的检测,因为它以一种有趣的方式利用 Windows 操作系统中内置的技术,例如 Windows Script Host (WSH) 和组件对象模型 (COM)。COM 和 WSH 属于“活在陆地上”工具的通用类别,这些工具允许攻击者通过内置的 Windows 程序来代理执行其工具集。

这对于攻击者而言非常理想,因为它允许他们在网络中更好地融入,同时产生更少的取证足迹,而不是在磁盘上删除和执行文件。COM 和 WSH 特别吸引攻击者,因为与 PowerShell 等工具(Windows 在较新版本中添加了广泛的日志记录功能)相比,它们缺乏强大的内置日志记录功能。Koadic 足以满足成熟的威胁组织(例如 APT28)的需求,并且在过去几年中经常收到更新。

Koadic 概述和功能

EQL

作为从业者,我工作中一些更令人兴奋的部分来自于使用 EQL 编写行为检测。这个过程激发了我内心的侦探技能,我发现这既充实又具有挑战性。该语言使从业者能够超越匹配静态值(例如妥协指标 (IoC))的范畴,以一种更加全面和灵活的方式来检测攻击者行为。通过利用时间限制序列或跟踪进程沿袭等功能,我们可以作为防御者开辟更多选择,以构建可靠且持久的检测。

我发现这是有益的,因为我可以将我以前在基于主机的取证方面的 SOC 工作经验直接应用到更加动态的检测中,这种检测可以抵御最新的攻击者手段。最好的是,EQL 的语法非常简单,学习曲线很短,因此如果您今天无法采用 EQL,希望这些查询中的逻辑可以应用于您当前的解决方案。

为了快速回顾一下该语言本身及其核心功能,我建议查看我们之前的博文:事件查询语言简介。总而言之,EQL 是一种独立于架构且与操作系统无关的语言,专为实时检测和流处理而构建。它支持多事件行为,还提供用于分析大量数据的后处理命令。有了这些背景信息,让我们开始深入研究使用 EQL 检测 Koadic 的一些不同方法。

初始访问

鱼叉式网络钓鱼附件 (T1193)

验证父子进程关系仍然是一种用于狩猎和构建检测的有效技术。但是,随着攻击者活动变得更加隐蔽,我们作为防御者也需要灵活性。第一个示例展示了使用 EQL 的 descendant 函数跟踪进程沿袭的价值,该函数允许我们保持状态并跟踪完整的进程族谱。这是一个重要的概念,因为它超越了许多语言所限制的典型父子进程范式。

通过跟踪更进一步的后代进程,防御者可以无限地向下跟踪进程树中的进程链。这为我们如何表达可疑行为提供了更多的自由,同时也允许对进程沿袭进行更严格的控制。

后代进程树可视化(APT28)

此进程链来自 Palo Alto Networks 于 2018 年 6 月报告的与 APT28 活动相关的示例。在此 EQL 表达式中,我们正在监视电子邮件客户端 (Outlook.exe) 的所有后代进程,并且仅查找与 Mshta 相关的新进程创建事件。这使我们可以专注于初始攻击向量(鱼叉式网络钓鱼电子邮件),然后筛选用于执行攻击者代码的 Windows 程序。这是一个强大的分析基础 — 如果我们想创建更强大的分析,我们可以构建与初始妥协阶段相关的更长队列数组,并添加整个 Microsoft Office 套件作为后代。

初始访问和执行 - 鱼叉式网络钓鱼示例

EQL 查询

process where process_name == "mshta.exe" and descendant of
[process where process_name == "outlook.exe"]

防御规避/执行

Mshta (T1170),Rundll32 (T1085)

Koadic 等工具通常包含一些有助于促进有效负载构建的可用性功能,也称为暂存器。这些小段代码在受害者计算机上执行,用于建立与攻击者的网络连接,以便引入分阶段的有效负载以供执行。暂存器代表入侵过程早期阶段的重要组成部分。以下示例继续探索针对各种用于使用 Koadic 暂存器代理执行的 Windows 实用程序的检测策略。

下面的 EQL 查询使用 sequence 运算符,这是 EQL 的一个函数,它根据序列中的事件顺序进行匹配。在这种情况下,当这些标准 Windows 管理实用程序之一启动网络连接时,我们会进行匹配。在另一种语言可能要求分析师编写多个规则(每个实用程序一个)的地方,EQL 使我们能够构建一个能够匹配多种排列的数组。

使用 filter 运算符按进程标识符 (PID) 按顺序联接这些事件。我喜欢这个示例,因为它能够检测不特定于 Koadic 的恶意软件和其他攻击性工具。话虽如此,可能需要进行一些筛选才能删除潜在的良性事件(例如网络管理活动),但这种行为是每个组织都应该跟踪和定期审查的行为。

防御规避和执行 - 暂存器

EQL 查询

sequence by unique_pid
[process where subtype.create and process_name in
("mshta.exe", "regsvr32.exe", "rundll32.exe", "wmic.exe")]
[network where process_name in
("mshta.exe", "regsvr32.exe", "rundll32.exe", "wmic.exe")]

在审查攻击性工具时,更有趣的收获之一是找到无意中遗留下来的不同工件。只需要一个“响亮”的工件(例如突出显示的文件或注册表修改)即可快速找到可疑活动。

在 Koadic 的案例中,HTTP 暂存器默认使用 Internet Explorer 的核心架构来发起 Web 请求,这会导致暂存器在“Internet 临时文件”目录中创建。这种行为的发生是由于 Internet Explorer 缓存浏览器内容以快速加载网页的方式造成的。通过某些可执行文件监视这种行为,可以在 Koadic 之外实现可靠的检测,例如用于下载和执行恶意代码的通用 cradles

防御规避 & 执行 - 缓存的暂存器

EQL 查询

file where process_name in
("mshta.exe","regsvr32.exe", "rundll32.exe", "wmic.exe")
and subtype.create and file_path == "*Content.IE5*"

发现

账户发现 (T1087),远程系统发现 (T1096)

发现 - 宏

EQL 的一个特性是在查询之间共享或重用类似逻辑的能力。通过使用宏声明,我们可以将一组项目捆绑在一起,并像变量一样调用该数组。一个很好的例子是将 Microsoft Office 应用程序分组到一个宏中,或者,在本例中,将几个不同的 Windows 程序分组在一起,这些程序可用于发现和枚举。

EQL 查询(宏)

macro KOADIC_DISCOVERY(name)
name in (
"arp.exe", "findstr.exe", "hostname.exe", "ipconfig.exe",
"nbtstat.exe", "net.exe", "net1.exe", "netsh.exe",
"nltest.exe", "ping.exe", "systeminfo.exe", "tasklist.exe",
"tracert.exe", "whoami.exe"
)

下面的 Elastic Endpoint Resolver 视图有助于提供有关 Koadic 如何产生子进程的一些上下文。通过使用 Koadic 模块 (exec_cmd) 并运行本机支持的命令(例如“whoami /groups”),我们可以看到 Rundll32.exe 应用程序是由 WmiPrvse.exe 调用的,并将指令传递给命令提示符,然后再启动 Whoami.exe 应用程序。

Elastic Endpoint Resolver 可视化

既然我们对攻击链有了更好的了解,让我们将之前的宏 (KOADIC_DISCOVERY) 绑定到一个基于序列的检测中,该检测会查找来自同一用户在 10 分钟内执行的任何一个枚举程序的三个进程创建事件。此相同功能可让您监视先前观察到的进程。例如,也许在 15 天后,该进程建立网络连接以下载额外的有效负载。还有什么其他语言可以让您找到休眠数周或数月的长期有效负载?

EQL 查询

sequence by user_name with maxspan=10m
[process where subtype.create and KOADIC_DISCOVERY(process_name)]
[process where subtype.create and KOADIC_DISCOVERY(process_name)]
[process where subtype.create and KOADIC_DISCOVERY(process_name)]
| unique user_name

上面的查询是完全可用的,可以用作初始发现和枚举的通用检测。但是,如果我们有理由加强围绕 Koadic 的逻辑呢?了解 Koadic 在端点级别的进程族谱,我们可以利用 EQL 中不同的进程关系跟踪功能,例如 child ofdescendant of

通过使用 child of 函数并将父进程设置为 Rundll32.exe,我们实际上得到了 Rundll32.exe 的孙子进程。然后,如果我们想更进一步,我们可以添加 descendant of 父进程 WmiPrvse.exe。此示例演示了 EQL 的灵活性,可为真实的攻击者行为提供强大的检测功能。

进程树可视化 - child of 和 descendant of

EQL 查询

sequence by user_name with maxspan=10m
[process where child of [process where parent_process_name == "rundll32.exe"]
and KOADIC_DISCOVERY(process_name) and
descendant of [process where parent_process_name == "wmiprvse.exe"]]
[process where child of [process where parent_process_name == "rundll32.exe"]
and KOADIC_DISCOVERY(process_name) and
descendant of [process where parent_process_name == "wmiprvse.exe"]]
| unique user_name

特权提升

绕过用户账户控制 (T1088)

虽然攻击者在许多情况下控制着受害者的目标,但他们并不总是在初始入侵期间最终获得提升的用户。即使鱼叉式网络钓鱼的受害者是本地管理员,攻击者通常也需要在继续操作之前从“中”完整性进程提升到“高”完整性进程。现成的攻击性工具(如 Koadic)可以相对轻松地实现这种转换,包括开箱即用的几个不同的 UAC 绕过模块。

在本例中,我们将检查 Matt Nelson (@enigma0x3) 发布的一种众所周知的 UAC 绕过技术,同时利用计算机管理启动器 — CompMgmtLauncher.exe — 它与 Microsoft Management Console (MMC) 互操作。有关此技术的详细信息(该技术仍然适用于 Windows 7 端点)可以在此处找到。

此技术涉及修改 Windows 注册表以更改 MMC 与之交互的文件的默认关联 (HKCU\Software\Classes\mscfile\shell\open\command) 到攻击者选择的应用程序。通过部署具有兼容扩展名的恶意脚本对象并将此注册表键值更改为启动内置脚本解释器,攻击者可以绕过控制。

在此注册表修改之后,查找与自动提升的 Microsoft 程序 (CompMgmtLauncher.exe) 相关联的新进程创建事件,然后是常见的 Koadic 暂存器后代进程(如 Mshta.exe 或 Rundll32.exe),这些进程应在高完整性上下文中运行。我们可以将这些事件组合成一个有序的序列,并将所有步骤的整体运行时间限制在 10 秒内完成。

特权提升 - UAC 绕过

EQL 查询

sequence with maxspan=10s
[registry where length(bytes_written_string) \> 0 and key_type in
("sz", "expandSz") and key_path == "*\\mscfile\\shell\\open\\command\\"
and user_name != "SYSTEM"]
[process where process_path == "C:\\Windows\\System32\\CompMgmtLauncher.exe"]
[process where process_name in ("mshta.exe","rundll32.exe") and
integrity_level == "high"]

收集/渗漏

来自本地系统的数据 (T1005)

Koadic 的 C2 方法可能对多种分析师感兴趣,因为其在植入程序和服务器之间交换数据的方式具有事务性。这种行为通过下面执行的特定命令的一些直接示例突出显示

命令 shell 重定向到文本文件

Koadic 将 STDOUT/STDERR 重定向到一个临时文本文件,该文件存储操作员的命令输出(就像它们呈现给服务器一样)。然后将这些命令读回 Koadic C2 终端。此文件最初创建一秒钟后,会自动删除。

通过正确的端点可见性,您可能无法检测到的恶意行为会变得很突出。为了演示围绕此进行的检测,我们将使用事件函数来仅过滤来自 cmd.exe 的包含重定向符 (\>) 的进程,然后将该进程的 PID 绑定到与文本 (.txt) 文件活动相关的同一 PID。

EQL 查询

file where file_name == "*.txt" and
event of [process where process_name == "cmd.exe" and command_line == "*\>*"]

显示文件修改的示例结果

如果您想获得更多上下文,例如 Koadic 传递了什么命令,我们可以将检测转换为序列并添加进程事件。

EQL 查询

sequence with maxspan=5s by unique_pid
[process where subtype.create and process_name == "cmd.exe" and command_line == "*\>*" and
descendant of [process where process_name == "wmiprvse.exe"]]
[file where subtype.create and wildcard(file_name, "*.txt", "*.log")]

结合进程和文件修改的示例结果

结论

总而言之,我们分析了一个攻击性框架 (Koadic) 及其几个突出特征,回顾了一种灵活的查询语言 (EQL) 来表达检测逻辑,并逐步介绍了通过示例分析识别与 Koadic 相关的行为的几种方法。

我认为像 Koadic 这样的攻击性框架的可用性对防御者来说是一个机会,也是保持警惕的动力。创造性地思考如何检测这些后渗透行为,并评估这些工具如何针对其自身的检测能力执行,将使组织走上在阻止类似威胁方面取得更大成功的道路。

为了帮助组织,我们已将本文中的所有查询添加到 EQLLib 存储库中。对于今年对 BSidesDFW 的原始演示文稿感兴趣的读者,这是 幻灯片的链接。

EQL 支持正在添加到 Elasticsearch。