Daniel Stepanic

绕舞池两圈 - Elastic 发现 PIPEDANCE 后门

Elastic 安全实验室描述 PIPEDANCE 后门

阅读需 24 分钟恶意软件分析
Twice around the dance floor - Elastic discovers the PIPEDANCE backdoor

关键要点

  • 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 文件(**.cab**)的 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** 评估的结果标志和后续 **WriteFile** 操作的缓冲区大小的 8 字节结构传递到管道。然后,PIPEDANCE 使用 RC4 加密包含先前进程详细信息的缓冲区,然后将加密的数据写回客户端管道。

以下是说明专用横向移动功能的高级图形。对于 PIPEDANCE 感染,命名管道服务器进程在新的受害者机器上运行,而客户端指令来自同一网络中先前受感染机器上的操作员。

命令调度

初始握手后,PIPEDANCE 的主要功能包括一个带有命令调度函数的 while 循环。此调度函数将从操作员那里检索其相应函数的提供的命令 ID 以及任何参数及其大小。

解析函数传递一个 8 字节的结构,该结构包含命令指令和命令参数的缓冲区大小。使用先前的 RC4 密钥解密命令参数,然后写回管道。

接收到命令 ID 后,PIPEDANCE 使用 if/else 和 switch 语句执行多个条件检查。

大多数命令函数都会将结果标志或错误代码返回给操作员。对于可能返回大量数据的某些函数(例如正在运行的进程列表),恶意软件将使用前面描述的硬编码字符串生成一个新的命名管道。然后它连接 PIPEDANCE 进程的 PID,通过此管道发送和接收数据。

命令功能

PIPEDANCE 支持 20 多个不同的函数,每个函数都使用其命令 ID 通过 if/then 和 switch/case 逻辑进行访问。以下是前 4 个函数的示例。

命令处理表

命令 ID描述
0x1根据提供的 PID 终止进程
0x2通过 cmd.exe 运行单个命令,返回输出
0x3使用 stdin/stdout 重定向通过命名管道的终端 shell
0x4当前工作目录上的文件枚举
0x6创建一个包含管道内容的新文件
0x7检索当前工作目录
0x8设置当前工作目录
0x9获取正在运行的进程
0x16使用 stdin/stdout 选项为子进程执行注入(线程劫持或天堂之门)
0x18从硬编码列表执行注入(线程劫持或天堂之门)
0x1A在提供的 PID 上执行注入(线程劫持或天堂之门)
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/payload。

进程注入技术

与许多后渗透框架类似,PIPEDANCE利用不同形式的进程注入来执行shellcode并启动其他植入物。根据进程体系结构,恶意软件将使用标准线程执行劫持技术或天堂之门技术进行注入。

PIPEDANCE利用防御规避来模糊其活动,它会随机从硬编码列表中选择一个Windows程序作为注入目标。

此方法基于当前时间生成种子值,并将其传递给伪随机数生成器,该生成器返回0到5之间的值。此值决定使用6个硬编码二进制文件中的哪一个(**makecab.exe**、**typeperf.exe**、**w32tm.exe**、**bootcfg.exe**、**diskperf.exe**、**esentutl.exe**)。

以下是当PIPEDANCE在32位体系结构下运行时,使用线程劫持技术使用的Windows API示例。

如果处理器体系结构是64位,PIPEDANCE将使用天堂之门技术调用本机API函数(**NtGetContextThread**、**NtWriteVirtualMemory**、**RtlCreateUserThread**),将CPU切换到64位,并执行shellcode。

PIPEDANCE还支持使用 **CreateRemoteThread** 或通过对 **RtlCreateUserThread** 的天堂之门调用进行其他注入方法。使用此函数,操作员将提供注入目标的PID,而不是从之前的硬编码列表中选择。

总结

PIPEDANCE旨在使用命名管道进行隐蔽操作,并具有各种功能来启用入侵后的阶段。就功能而言,它让我想起了攻击框架的SMB模块,但它有自己的定制功能。虽然利用命名管道并非一项新技术,但看到它如何作为命令和控制内部代理实现,并代表内部开发能力,这很有趣。

检测逻辑

预防

  • 内存威胁预防警报:Shellcode注入

检测

狩猎查询

使用Elastic Agent和Elastic Defend集成提供KQL和EQL的事件。狩猎查询可能会返回高信号或误报。这些查询用于识别潜在的可疑行为,但需要进行调查以验证结果。

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框架来记录高级持续威胁针对企业网络使用的常见战术、技术和程序。

战术

战术代表技术或子技术的“为什么”。这是攻击者的战术目标:执行操作的原因。

技术/子技术

技术和子技术代表攻击者如何通过执行操作来实现战术目标。

可观察指标

所有可观察指标也可以以ECS和STIX格式的组合zip包形式下载

本研究中讨论了以下可观察指标。

指标类型参考
9d3f739e35182992f1e3ade48b8999fb3a5049f48c14db20e38ee63eddc5a1e7SHA-256PIPEDANCE服务器端组件
805a4250ec1f6b99f1d5955283c05cd491e1aa378444a782f7bd7aaf6e1e6ce7SHA-256Cobalt Strike信标
exl.officeappsreviews[.]com/lanche-334e58sfj4eeu7h4dd3sss32dURLCobalt Strike C2服务器