主要结论
- Elastic 安全实验室发现 PIPEDANCE,这是一个以前未知的 Windows 后门,用于启用漏洞利用后的活动和横向移动
- PIPEDANCE 通过命名管道进行隐蔽操作,具备交互式终端、发现/文件枚举、进程注入和数据渗漏检查的能力
- 观察到 PIPEDANCE 部署了 Cobalt Strike
前言
2022 年 12 月下旬,Elastic 安全实验室在先前监控的环境中观察到针对越南组织的新活动。这项新活动包括执行一个命名管道恶意软件,用于促进漏洞利用后的活动。我们将此恶意软件系列命名为 PIPEDANCE。通过利用 PIPEDANCE,攻击者能够
- 通过随机注入到硬编码的 Windows 程序列表中的自定义功能来伪装活动
- 通过枚举文件和进程来执行发现
- 利用标准后门功能,例如运行命令、写入文件
- 检查不同的网络协议以进行渗漏
- 通过进程注入技术启动额外的有效负载
在这篇文章中,我们将逐步介绍初始执行过程,然后详细介绍我们通过审查恶意软件发现的功能。
注意:请查看我们关于创建您自己的客户端以与感染 PIPEDANCE 的端点交互的后续出版物 此处。
概述
与可能与传统网络或应用程序协议通信的恶意软件不同,我们确定了一个二进制文件,该文件专门设计用于在竞争环境中进行横向移动和漏洞利用后启用:执行额外的植入程序、运行命令、执行文件发现、枚举正在运行的进程以及检查出站访问;所有这些都通过使用 Windows 命名管道来实现。这种功能与 Cobalt Strike 或 Metasploit 的 SMB 模块相当。
Windows 中的命名管道允许在单台计算机上或同一网络中不同机器上的进程之间进行进程间通信。可以为管道客户端和管道服务器之间的单向或双向通信设置命名管道。命名管道中使用的数据都存储在内存中,在其中使用标准 Windows API(CreateFile/WriteFile/ReadFile)读取/写入,方式与读取/写入文件相同。
在未知初始漏洞利用之后安装了Elastic Defend。可疑的 Windows 服务执行行为规则生成了首次观察到的事件。尽管未经证实,已发布的研究描述了攻击者利用本地挂载的管理员共享并通过使用 Microsoft 的 SysInternals DebugView (DbgView.exe) 实用程序来加载 PIPEDANCE 的类似技术。
观察到 DbgView.exe 将 PIPEDANCE 加载到 makecab.exe 中,这是一个用于打包 Cabinet 文件. 的 Windows 实用程序。然后,将 Windows 性能数据实用程序 typeperf.exe 注入并派生 openfiles.exe,其中 Cobalt Strike 被加载到此进程中。
尽管 openfiles.exe 二进制文件是合法的 Microsoft 应用程序,但 Elastic Defend 生成了 Cobalt Strike 内存签名。在从 Kibana 的警报中提取内存区域后,我们确定了 Cobalt Strike 模块 invokeassembly.x64.dll,验证了 Cobalt Strike 已注入到合法的 openfiles.exe 二进制文件中。
PIPEDANCE 利用命名管道作为受感染网络中不同受感染端点之间的通信机制。攻击者使用此功能作为双向命令和控制层,他们可以通过该层在命名管道之间调度命令并传递数据。
初始设置/通信流程
在主函数的开头,有一个硬编码的字符串用作管道名称。此字符串在后续阶段也用作 RC4 密钥,用于加密/解密管道之间的数据。在下面的图像中,我们可以看到硬编码的管道名称 (u0hxc1q44vhhbj5oo4ohjieo8uh7ufxe) 被设置为全局变量。
在初始执行期间,恶意软件将使用 CreateNamedPipeA 和 ConnectNamedPipe 方法来创建命名管道 (“\.\pipe\u0hxc1q44vhhbj5oo4ohjieo8uh7ufxe") 并等待传入的客户端进程连接到管道。下图表示此活动,显示了使用硬编码字符串格式化的管道名称以及管道的初始化。
在首次客户端连接期间,PIPEDANCE 从本地系统检索以下值,并将它们放入缓冲区
- PIPEDANCE 进程的进程 ID
- PIPEDANCE 进程的当前工作目录。
- PIPEDANCE 进程的域名和用户名
PIPEDANCE 将此缓冲区和一个包含来自 IsWow64Process 评估结果标志的 8 字节结构以及后续 WriteFile 操作的缓冲区大小传递给管道。然后,PIPEDANCE 使用 RC4 加密包含之前进程详细信息的缓冲区,然后将加密的数据写回客户端管道。
以下是一个高级图形,说明了专门构建的横向移动功能。对于 PIPEDANCE 感染,命名管道服务器进程在新受害者机器上运行,而客户端指令来自同一网络中先前受感染机器的操作员。
命令调度
在初始握手之后,PIPEDANCE 的主要功能由一个带有命令调度功能的 while 循环组成。此调度功能将从操作员检索其各自函数的提供的命令 ID 以及任何参数及其大小。
解析函数传递一个 8 字节的结构,该结构由命令指令和命令参数的缓冲区大小组成。使用先前的 RC4 密钥解密命令参数,然后将其写回管道。
收到命令 ID 后,PIPEDANCE 使用 if/else 和 switch 语句执行多个条件检查。
大多数命令函数都会向操作员返回结果标志或错误代码。对于某些可能返回大量数据的函数,例如正在运行的进程列表,恶意软件会使用前面描述的硬编码字符串生成新的命名管道。然后,它会连接 PIPEDANCE 进程的 PID,该进程通过此管道发送和接收数据。
命令功能
PIPEDANCE 支持 20 多种不同的功能,每种功能都通过 if/then 和 switch/case 逻辑使用其命令 ID 进行访问。以下是前 4 个功能的示例。
命令处理表
命令 ID | 描述 |
---|---|
0x1 | 根据提供的 PID 终止进程 |
0x2 | 通过 cmd.exe 运行单个命令,返回输出 |
0x3 | 使用通过命名管道的 stdin/stdout 重定向的终端 shell |
0x4 | 在当前工作目录上进行文件枚举 |
0x6 | 创建新文件,内容来自管道 |
0x7 | 检索当前工作目录 |
0x8 | 设置当前工作目录 |
0x9 | 获取正在运行的进程 |
0x16 | 对子进程执行注入(线程劫持或 Heaven's Gate),带有 stdin/stdout 选项 |
0x18 | 从硬编码列表执行注入(线程劫持或 Heaven's Gate) |
0x1A | 对提供的 PID 执行注入(线程劫持或 Heaven's Gate) |
0x3E | 清除全局变量/管道数据 |
0x47 | 通过 HTTP Get 请求进行连接性检查 |
0x48 | 通过提供 DNS 服务器 IP 的 DNS 进行连接性检查 |
0x49 | 通过 ICMP 进行连接性检查 |
0x4A | 通过 TCP 进行连接性检查 |
0x4B | 通过不提供 DNS 服务器 IP 的 DNS 进行连接性检查 |
0x63 | 断开管道连接,关闭句柄,退出线程 |
0x64 | 断开管道连接,关闭句柄,退出进程,退出线程 |
为了详细说明 PIPEDANCE 的重要功能,我们将分析分为三个部分
- 标准后门功能
- 网络连接性检查
- 进程注入技术
后门功能
PIPEDANCE 提供了操作员执行侦察和在不同系统之间进行横向移动所需的各种交互式后门功能。
命令执行
有两种与命令执行相关的功能,功能 0x2 和 0x3。第一种方法(功能 0x2)接受来自终端的命令参数,例如 ipconfig。此功能首先创建具有读取和写入句柄的匿名命名管道。在创建进程之前,PIPEDANCE 将使用 STARTF_USESTDHANDLES 配置 STARTUPINFO 结构,以管道传输新进程的命令输出 (hStdOutput)。
然后创建一个线程,将之前的读取管道句柄作为参数传递。为命令输出分配内存,并从此读取管道句柄读取。然后对数据进行循环并以与之前类似的方式加密,并通过新的命名管道发送回。在我们的示例中,这是来自 ipconfig 命令的数据。
第二个执行命令(功能 0x3)在暂停状态下创建一个新的 cmd.exe 进程,并且像以前一样利用 STARTF_USESTDHANDLES。
创建进程后,创建一个新线程,传递 STARTUPINFO,其中为输入和输出创建两个命名管道服务器进程,然后恢复该线程。
此功能的操作类似于反向 shell,攻击者可以直接交互并在两者之间传递数据。
发现和枚举
PIPEDANCE 具有与发现和枚举相关的内置功能。对于进程枚举(功能 0x9),它利用 CreateToolhelp32Snapshot 函数来检索进程详细信息。该函数返回进程 ID、进程名称、进程的体系结构、进程是否绑定到系统(会话表示为 0)或用户会话(会话表示为 1)以及与进程关联的用户名。
有趣的是,在我们在一些不同模块中的观察中,开发人员由于在使用 Unicode 数据时使用 C 运行时库函数 vsprintf_s 格式化数据而使结果混乱。这可以在下面的进程发现模块中观察到,其中进程名称输出变得混乱,而 PIPEDANCE 仅返回进程、体系结构和用户名的第一个字符。下面是返回给操作员的输出表。在此示例中,PID 为 564 且(混乱的)“名称”为 w 的实际上是 PID 为 564 的完整进程名称为 winlogon.exe、完整的体系结构名称为 x86、会话 ID 为 1 以及完整的用户名为 NT AUTHORITY\SYSTEM 等。
PIPEDANCE 实现了一个类似终端的概念,其中它具有其进程的当前或工作目录。这使对手可以直接使用与工作目录相关的功能,例如文件枚举模块。
对于文件枚举,PIPEDANCE 将使用通配符从当前工作目录中拉回文件列表。
PIPEDANCE 还提供了在受害者机器上创建文件并将内容写入文件的功能(功能 0x6)。它首先在受害者机器上创建并命名一个文件,然后创建一个新线程,其中包含命名管道的新实例,该线程将等待并读取通过管道传入的数据。此数据与先前的 RC4 密钥进行异或运算,然后写入文件。
PIPEDANCE 还具有各种管理员或维护命令,用于终止进程、终止线程、断开管道连接、清除内存中的全局变量等。
网络连接性检查
当对手在网络中进行横向移动时,他们的目标之一是了解端点在网络中的位置并确定哪些协议可用于横向或外部传输数据。PIPEDANCE 专门用于通过检查 DNS、ICMP、TCP 和 HTTP 协议来识别端点上的出口点。
例如,当提供 DNS 服务器作为参数时,PIPEDANCE 将对 bing[.]com 发出 DNS 请求,查询结果将返回给操作员,指示成功与否。对于 ICMP,PIPEDANCE 将通过循环遍历字母表并将字母表发送到提供的 IP 地址来为 ICMP 请求生成虚假数据。
类似地,对于 HTTP,操作员可以提供一个域,PIPEDANCE 将通过端口 80 执行一个普通的 HTTP GET 请求,然后返回一个指示成功与否的布尔值。
这些都是简单的功能,但它们为我们提供了对开发人员思维方式和他们试图实现的目标类型的深刻见解。这些检查可能在多阶段过程中使用,在该过程中首先以轻量级方法验证这些协议,然后启动其他 shellcode/有效负载。
进程注入技术
与许多后渗透框架类似,PIPEDANCE 利用不同形式的进程注入来执行 shellcode 并启动其他植入程序。根据进程架构,恶意软件将使用标准的线程执行劫持技术或 Heaven’s Gate 技术执行注入。
PIPEDANCE 利用防御规避措施来隐藏其活动,方法是从硬编码列表中随机选择一个 Windows 程序作为注入目标。
此方法基于当前时间生成一个种子值,并将其传递给伪随机数生成器,该生成器返回 0 到 5 之间的值。此值确定使用 6 个硬编码二进制文件(makecab.exe、typeperf.exe、w32tm.exe、bootcfg.exe、diskperf.exe、esentutl.exe)中的哪一个。
以下是在 32 位体系结构下运行 PIPEDANCE 时与线程劫持技术一起使用的 Windows API 示例。
如果处理器架构为 64 位,PIPEDANCE 将使用 Heaven’s Gate 技术调用 Native API 函数(NtGetContextThread、NtWriteVirtualMemory、RtlCreateUserThread),将 CPU 切换到 64 位,然后执行 shellcode。
PIPEDANCE 还支持使用 CreateRemoteThread 或通过对 RtlCreateUserThread 的 Heaven’s Gate 调用进行注入的其他方法。使用此功能,操作员不从先前的硬编码列表中选择,而是提供注入目标的 PID。
总结
PIPEDANCE 旨在利用命名管道进行秘密操作,并具有各种功能来启用后渗透阶段。在功能方面,它使我们想起了攻击框架的 SMB 模块,但具有其自己的自定义项。虽然利用命名管道并不是一种新技术,但看到它如何作为命令和控制内部代理实现以及如何表示内部开发能力仍然很有趣。
检测逻辑
预防
- 内存威胁预防警报:Shellcode 注入
检测
狩猎查询
使用 Elastic Defend 集成,KQL 和 EQL 的事件都通过 Elastic Agent 提供。狩猎查询可能会返回高信号或误报。这些查询用于识别潜在的可疑行为,但需要进行调查以验证调查结果。
KQL 查询
使用 Kibana 中的“Discover”应用程序,下面的查询将识别来自 PIPEDANCE 内硬编码注入目标的网络连接。
process.name:("makecab.exe" or "typeperf.exe" or "w32tm.exe" or "bootcfg.exe" or "diskperf.exe" or "esentutl.exe") and event.dataset: endpoint.events.network
YARA
Elastic Security 已创建 YARA 规则来识别此活动。以下是识别 PIPEDANCE 的 YARA 规则。
rule Windows_Trojan_PipeDance {
meta:
author = "Elastic Security"
creation_date = "2023-02-02"
last_modified = "2023-02-02"
os = "Windows"
arch = "x86"
category_type = "Trojan"
family = "PipeDance"
threat_name = "Windows.Trojan.PipeDance"
license = "Elastic License v2"
strings:
$str1 = "%-5d %-30s %-4s %-7d %s" wide fullword
$str2 = "PID Name Arch Session User" wide fullword
$str3 = "%s %7.2f B" wide fullword
$str4 = "\\\\.\\pipe\\%s.%d" ascii fullword
$seq_rc4 = { 8D 46 ?? 0F B6 F0 8A 14 3E 0F B6 C2 03 C1 0F B6 C8 89 4D ?? 8A 04 0F 88 04 3E 88 14 0F 0F B6 0C 3E 0F B6 C2 03 C8 0F B6 C1 8B 4D ?? 8A 04 38 30 04 0B 43 8B 4D ?? 3B 5D ?? 72 ?? }
$seq_srv_resp = { 8B CE 50 6A 04 5A E8 ?? ?? ?? ?? B8 00 04 00 00 8D 4E ?? 50 53 8B D0 E8 ?? ?? ?? ?? B8 08 02 00 00 8D 8E ?? ?? ?? ?? 50 57 8B D0 E8 ?? ?? ?? ?? }
$seq_cmd_dispatch = { 83 FE 29 0F 87 ?? ?? ?? ?? 0F 84 ?? ?? ?? ?? 83 FE 06 0F 87 ?? ?? ?? ?? 0F 84 ?? ?? ?? ?? 8B C6 33 D2 2B C2 0F 84 ?? ?? ?? ?? 83 E8 01 }
$seq_icmp = { 59 6A 61 5E 89 45 ?? 8B D0 89 5D ?? 2B F0 8D 04 16 8D 4B ?? 88 0A 83 F8 77 7E ?? 80 E9 17 88 0A 43 42 83 FB 20 }
condition:
4 of ($str*) or 2 of ($seq*)
}
观察到的对手战术和技术
Elastic 使用 MITRE ATT&CK 框架来记录高级持续性威胁针对企业网络使用的常见战术、技术和程序。
战术
战术代表技术或子技术的原因。它是对手的战术目标:执行操作的原因。
技术/子技术
技术和子技术表示对手如何通过执行操作来实现战术目标。
可观察物
所有可观察物也可以在组合的 zip 包中以 ECS 和 STIX 格式下载。
本研究中讨论了以下可观察物。
指示器 | 类型 | 参考 |
---|---|---|
9d3f739e35182992f1e3ade48b8999fb3a5049f48c14db20e38ee63eddc5a1e7 | SHA-256 | PIPEDANCE 服务器端组件 |
805a4250ec1f6b99f1d5955283c05cd491e1aa378444a782f7bd7aaf6e1e6ce7 | SHA-256 | Cobalt Strike 信标 |
exl.officeappsreviews[.]com/lanche-334e58sfj4eeu7h4dd3sss32d | URL | Cobalt Strike C2 服务器 |