简介:
Cobalt Strike
几乎每一次重大入侵或攻击都以某种方式涉及 Cobalt Strike。举几个例子,HAFNIUM 攻击、SolarWinds 漏洞以及许多勒索软件攻击都是使用 Cobalt Strike 的很好例子。选择 Cobalt Strike 作为我们的主题是一个自然的选择,因为每个高级持续性威胁 (APT) 组织都在其武器库和工具包中使用 Cobalt Strike。来自 MITRE Attack、CrowdStrike 威胁报告、微软、Talos 和其他公司的威胁报告清楚地表明 APT 正在大量使用 Cobalt Strike。Cobalt Strike 是一款对手模拟和红队操作套件,具有非常先进的功能。Cobalt Strike 之所以被广泛使用,是因为它包含了攻击者梦寐以求的一切,平台稳定、可高度定制,并且旨在支持大规模的长期利用。
正如 Cobalt Strike 的创建者 Raphael Mudge 所说:
“当我触摸磁盘或在浏览器中加载内容时,传统的防病毒产品可能会查看我的有效载荷。如果我击败了它,我就赢了。但今天不是这样!现在的战场是我们用来将有效载荷放入内存中的函数。”
正如 Raphael Mudge 之前提到的,Cobalt Strike 在执行其初始加载器时主要在内存中运行。这种执行方式对 Cobalt Strike 检测的安全防御者构成了挑战。这对许多安全产品来说也是一个挑战,因为扫描内存并不容易。因此,我们看到对端点检测和响应 EDR 技术的需求日益增长,因为它能够实时扫描内存并能够检测此类活动和行为。
内存是与攻击者战斗的最后战场这一概念确实是正确的。它是准确的,因为正如我们所理解的,代码必须在某个地方执行,攻击者正在不断改进他们逃避安全控制的方法,检测已经成为一项艰巨的任务。无法识别最后一个领域(内存)中的攻击者,本质上意味着输掉的不是战斗,而是战争。在本文中,我们将深入研究 Cobalt Strike 所采用的技术,尤其是在内存方面。本文将揭示 Cobalt Strike 的本质!Cobalt Strike。
内存取证:我是如何遇到您的 Beacon 的?
在取证领域,遵循结构化方法至关重要,内存取证也不例外。作为数字取证和事件响应 (DFIR) 分析师,您需要一个调查的起点。内存取证也是如此 - 您需要一个明确的理由或线索来深入分析。如果没有这个初始方向,直接进行内存取证就像大海捞针 - 这是一项具有挑战性、耗时耗力的任务。这个支点为分析师提供了指路明灯,引导他们完成发现关键证据的旅程。这强调了系统方法对于检测隐藏在内存中的恶意活动的必要性。
在深入进行内存分析之前,搜索 Cobalt Strike 可能是一项艰巨的任务,有一些工具可以帮助加快这一过程并发现 Cobalt Strike。与筛选内存转储和检查进程以找到起点相比,这可以节省大量时间。尽管选择第二种方法并深入进行内存分析而不运行工具是可能的并且可行,因为 Cobalt Strike 具有一些可以在内存中检测到的签名和行为。我们的方法是使用可用的工具来确认 Cobalt Strike 的存在,然后转到第二种方法手动检查和分析内存转储。通过留意以下内容可以检测 Cobalt Strike:
1- 进程列表 - Pslist 模块:列出所有进程。
2 - 进程树 - Pstree 模块:查找进程之间的父子关系。
3-DLL 列表 - dlllist:列出与进程关联的 DLL。
4- 恶意代码 - Malfind:根据某些特征(如 VAD 标签:虚拟地址描述符和页面权限)查找隐藏的注入代码/DLL。这些特征可以总结如下:
5- 句柄 - 句柄:句柄是指向 Windows 中对象的指针。
6-可以使用波动性框架中的句柄命令找到命名管道。
7-命令行 - CmdLine:用于查找启动进程的命令行。
8-进程扫描 - Psscan:显示恶意软件可以使用的非活动和隐藏进程。
9-Cmd 扫描 - CmdScan:此模块用于在内存中搜索攻击者在受感染系统上使用的命令。请注意,此插件通过检查名为“COMMAND_HISTORY”的结构显示最近的 50 条命令。
如上所述,首先让我们确认 Cobalt Strike 是否存在于我们的内存映像中,然后使用 Volatility 框架对其进行分析。我最喜欢使用的工具之一是 Didier Stevens 编写的工具 1768.py:https://didierstevens.com/files/software/1768_v0_0_18.zip该
工具使用起来很简单;您只需提供相关的内存映像作为输入即可启动它:
从上面的截图中可以清楚地看到,该工具不仅能检测到 Cobalt Strike 的存在,还能深入挖掘信标的基本配置,从而证明了其价值。它提供了诸如 C2 Payload、正在使用的端口、SleepTime、C2 域等见解,以及对于确定网络范围和识别其他可能受到攻击的系统至关重要的其他有价值的详细信息。此外,该工具在识别信标所采用的牺牲过程方面表现出色,为分析师提供了关键信息。这在处理广泛的网络时尤其有价值,大大简化了调查过程。该工具超出了预期,甚至猜出了 Cobalt Strike 的版本:
重要提示:“牺牲进程”是指利用受感染系统上的进程来执行恶意代码的做法。必须注意的是,Cobalt Strike 的默认配置为此目的使用了 rundll32.exe。但是,DFIR 分析师必须认识到,此默认配置可以修改,这可能导致 Cobalt Strike 使用替代进程(如 svchost.exe)。如前所述,Cobalt Strike 提供了广泛的可定制性,这与 Cobalt Strike 的创建者 Raphael Mudge 的想法一致:
“那么,为什么是 rundll32.exe?为什么不是其他东西?老实说,我选择什么并不重要。我选择的任何东西现在都是默认的。因为人们很少更改默认值,所以它会显示得足够多,以至于有人会注意到。对于所有各方来说,正确的做法是知道如何更改默认值。幸运的是,这并不难做到。”
尽管通常使用默认配置,但保持警惕非默认配置对于有效检测非常重要。
取证内存映像:
既然我们确定 Cobalt Strike 位于我们受感染的系统上,我们现在可以手动检查内存映像以查找恶意程序并收集所需的证据和 IOC。我们将使用 Volatility Framework。如果我们从查看映像开始,我们将花费大量时间挖掘进程、DLL 并使用各种插件来寻找 Cobalt Strike。但由于我们已经知道它隐藏在其中一个活动进程中,正如我们之前看到的,我们将重点检查该进程:rundll32.exe。
快速查看 Volatility 的进程树输出会发现许多异常,例如 WmiPrivSE 等进程会生成 PowerShell,而 PowerShell 随后又会生成另一个 PowerShell。最值得注意的是,我们观察到 PowerShell.exe 会生成多个 rundll32.exe。这些不寻常的模式强烈表明需要彻底检查 rundll32.exe,因为它的行为似乎具有潜在的恶意性。
首先,我们将使用 Volatility 插件 (dlllist) 检查该进程的 DLL:
a. 每个内存页面都有权限(读取、写入、执行)。
事实上,Malfind 检测到一个可疑的内存部分,其权限设置为 Read_Write_Execute,并且它与来自磁盘的文件无关。在 Windows 中,所有合法代码都来自磁盘。最后的检查涉及检查内存部分以确定它是否包含代码。但是,如 Volatility 结果所示,十六进制数据中没有明显的代码。
为什么没有代码?主要有两个原因。首先,Malfind 只显示内存页的初始 64 个字节,实际上大小为 4096 字节。其次,这与 Cobalt Strike 采用的一种经典防御策略有关,即反内存取证。Cobalt Strike 使用一种称为可移植可执行文件头踩踏的技术。一旦恶意代码开始运行,PE 头就变得没有必要了。为了避免被发现,Cobalt Strike 用零覆盖前 4096 个字节,从而有效地抹去 PE 标头的任何痕迹,正如 Cobalt Strike 用户指南中所述。
在这种情况下,我们可以通过转储整个过程并进行更彻底的分析来解决这个问题。为此,我们将使用 memdump 插件,它允许我们将整个过程转储到 .dmp 文件中以供进一步检查。
在此阶段,在转储文件中进行基本的字符串搜索可以提供有价值的见解。此方法可以为我们提供最初使用 1768.py 工具检测 Cobalt Strike 存在时获得的相同信息。
此时,作为 DFIR 分析师,您的主要任务已接近完成。如果认为需要进行额外分析,建议将转储文件传递给您的恶意软件分析师或逆向工程师团队进行深入检查。
在整个分析过程中,我们成功检测到了 Cobalt Strike 的存在。我们发现的信息足以确定环境范围并识别其他受感染的系统。值得注意的是,YARA 规则是扫描环境中内存中 IOC 的绝佳方法。可以使用许多公开可用的 YARA 签名,或者您可以创建自定义 YARA 规则来扫描任何 Cobalt Strike 签名。YARA 签名的一个有价值的起点和一个很好的例子是“apt_leviathan.yar”规则,可以通过以下链接访问:
https://github.com/Neo23x0/signature-base/blob/master/yara/apt_leviathan.yar
必须记住,Cobalt Strike 是高度可定制的,公开可用的 YARA 签名可能与您特定环境中的签名不同。因此,根据您环境的独特特征制定 YARA 规则通常是识别相关 IOC 的最有效方法。
其他 Cobalt Strike 检测技术:
1- 命名管道:
“恶意软件必须通信”的概念是正确的。无论它们多么隐蔽,所有恶意软件都必须建立某种形式的通信。有趣的是,许多恶意软件框架(包括 Cobalt Strike)都利用命名管道进行通信。可以通过日志分析/Sysmon 检测命名管道的存在。通过分析命名管道来检测 Cobalt Strike 是一个独特且值得关注的话题,因为 Cobalt Strike 以可以有效检测的模式创建命名管道。有关更多信息,请访问:https://labs.withsecure.com/publications/detecting-cobalt-strike-default-modules-via-named-pipe-analysis
2- PowerShell:
考虑到 Cobalt Strike 广泛依赖 PowerShell,其许多高级功能都利用 PowerShell 脚本,因此强调 PowerShell 日志记录的重要性变得至关重要。启用全面的 PowerShell 日志记录(包括脚本块日志记录)对于有效检测环境中的 Cobalt Strike 活动和行为至关重要。
以下关键字概述了与 Cobalt Strike 相关的一些 PowerShell 构件:DownloadString、EncodedCommand、FromBase64String、rundll32、IEX、Invoke-Expression、WebClient、Syswow64、Powershell -version、http://127.0.0.1、Reflection、$DoIt、Start-Process、Invoke-WMIMethod、Invoke-Command
结论:
总之,作为一名 DFIR 分析师,内存取证是您在对抗 Cobalt Strike 等威胁的最后战场。我们深入研究了攻击者利用 Cobalt Strike 所采用的策略及其规避技术。利用基于签名的检测工具(如 1768.py 和 Volatility 框架),我们成功发现了内存中 Cobalt Strike 的踪迹。此外,我们还发现了 Cobalt Strike 的规避策略,例如 Portable Executable Header Stomping。值得注意的是,由于 Cobalt Strike 严重依赖 PowerShell 并使用命名管道进行通信,因此也可以通过命名管道和 PowerShell 检测到它的存在。
原文始发于微信公众号(Ots安全):内存取证:在内存中搜寻 Cobalt Strike
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论