新的 APT Group Earth Berberoka 以新旧恶意软件攻击赌博网站

我们最近发现了一个新的高级持续威胁 (APT) 组,我们称之为 Earth Berberoka(又名 GamblingPuppet)。根据我们的分析,该组以赌博网站为目标。我们的调查还发现,Earth Berberoka 以 Windows、Linux 和 macOS 平台为目标,并使用了历史上被认为是讲中文的人的恶意软件系列。

在此博客条目中,我们概述了 Earth Berberoka 在其活动中使用的 Windows 恶意软件系列。该恶意软件阵容包括经过验证且已升级的恶意软件系列,例如 PlugX 和 Gh0st RAT,以及我们称为 PuppetLoader 的全新多阶段恶意软件系列。

我们在研究论文“Operation Earth Berberoka:多向量和多平台 APT 分析”中讨论了 Earth Berberoka 针对 Linux 和 macOS 以及 Windows 的恶意软件系列的全部技术细节、感染媒介、目标以及与其他 APT 组的可能联系针对在线赌博网站的广告系列。”

技术分析

木偶装载机

我们发现了一个新的恶意软件家族,我们称之为 PuppetLoader。它是一个复杂的五阶段恶意软件家族,使用了一些有趣的技术,包括劫持加载的模块以启动恶意代码,以及将恶意负载和模块隐藏在修改后的位图图像 (BMP) 文件中。

第 1 阶段:混淆器和加载器

RC4 实施不正确

在此阶段,使用硬编码密钥 (2726c6aea9970bb95211304705b5f595) 和似乎是 RC4 (Rivest Cipher 4) 算法的方式对一组有效负载数据进行解密。但是,密码的伪随机生成部分中的密码“交换”操作没有正确实现。这导致仅对标头和有效负载的前几部分进行了正确加密,而后面的部分几乎完全以明文形式保留。

似乎这种硬编码密钥和有缺陷的 RC4 实现也被用于名为 TigerPlug 的恶意软件家族中,可能是因为它传播了 PlugX 恶意软件。我们没有发现关于其行为和特征的公开报道。

劫持加载的模块

载荷解密后,它被加载到机器的内存中,并使用一种隐蔽的方法执行:PuppetLoader 首先从 Windows\System32 目录加载一个合法的 DLL。然后劫持加载过程以用恶意库替换合法库。这是通过挂钩 NTDLL API 来完成的,例如 NtQueryAttributesFile、NtOpenFile、NtCreateSection、NtMapViewOfSection、NtQuerySection 和 ZwClose。 

加载程序使用未记录的 NTDLL API,例如 RtlPushFrame、RtlPopFrame 和 RtlGetFrame, 以避免递归预订,当挂钩函数间接调用自身时会发生这种情况。

为了正确加载恶意负载,分配标记为“LDFM”的帧并填充必要的参数,例如文件名的内存地址和分配的缓冲区句柄或包含恶意负载的地址。在确定它们的值后,一些参数会立即设置,而其他参数则稍后设置。

图 1. LDFM 加载框架

然后调用 LdrLoadDll 来加载合法的 asyclfilt.dll 库。之后,调用之前挂钩的 API 函数,导致加载的 DLL 名称被替换为 lz32.dll, 这是一个合法的 DLL。然后,这个合法 DLL 的内容会被挂接的 NtMapViewOfSection 函数内的恶意负载替换。

然后,LdrLoadDll 函数对新加载的恶意图像进行变基并加载所有需要的依赖项。一旦从 LdrLoadDLL 函数返回句柄,恶意软件就不再需要帧,这就是为什么它通过调用 RtlPopFrame 弹出帧解开之前挂钩的函数,并通过调用 GetModuleHandleW (asycfilt.dll) 验证加载是否成功.

然后,恶意软件会动态解析名为 Install 的导出函数,并将参数值设置为“11BF29E1371C0D83C530BD1BF346”,然后解密为名为 OneTime 的函数。对于其命令行参数,PuppetLoader 使用相同的有缺陷的 RC4 实现,使用密码“whk0q9ogev6ofg8d”。

这些劫持步骤导致以下结果:

  • 通过解析PEB_LDR_DATA结构可以看到加载的asycfilt.dll模块,该结构包含当前进程中所有加载的模块。

图 2. 加载的模块名称中显示的 asycfilt.dll

  • lz32.dll是基于进程监控工具打开的。

图 3. 打开的文件中显示的 lz32.dll

  • 仅加载了 PuppetLoader 的 dropper 有效负载,并且没有实际加载前面提到的库。

第 2 阶段:滴管

dropper 在受感染的机器中创建并删除多个文件。

硬编码的 GUID ({78106D5F-CD1A-A8C4-A625-6863092B4BBA}) 被插入到 CPuppetProcessFileSharer (C:\\Users\\Public\\Pictures\\Desktop.inf)。我们认为它可以作为第 2 阶段已经完成的标志。

Config.ini (C:\Users\Public\Videos\Config.ini) 包含 GUID 和原因,它是使用密钥 (whk0q9ogev6ofg8d) 加密的硬编码值 StartupBasicLoader ” 。

svchost.exe 使用以下命令行参数以挂起模式启动:

 -cmd -NoModuleLoadDLL -DisplayName=KeepAuthority.Client.MainConsole.x64.Release -InvokeMethodName=Run -InokeMethodParam=NULL”

这也使用前面提到的密钥进行了加密,并在 svchost.exe 中创建了一个新线程,以使其加载 BasicLoader 有效负载 MSVCPX00.dll。有趣的是,“-InokeMethodParam”中有一个印刷错误。

第 3 阶段:BasicLoader

BasicLoader 阶段首先将硬编码的 GUID ({78106D5F-CD1A-A8C4-A625-6863092B4BBA}) 添加到 CPuppetProcessFileSharer。与第 2 阶段一样,我们认为这可能是第 3 阶段开始运行的标志。

BasicLoader 在 Users\\Public 中的目录(桌面、文档、下载、音乐、图片和视频)中搜索 BMP 文件。它会检查每个目录中是否存在将通过所需结构的 BMP 文件。对于这样做的 BMP 文件,附加到 BMP 文件的有效负载被解密、加载到内存中并执行。BMP 文件仅由 33 x 11 像素和 338 字节组成,附加到它的数据是使用相同有缺陷的 RC4 实现加密的有效负载。

图 4. 一个小 BMP 文件,其中附加了加密的有效负载

第 4 阶段:核心

当硬编码的 GUID ({7D8DA9DC-1F3B-2E5C-AA59-9418E652E4AA}) 添加到 CPuppetProcessFileSharer 时,此阶段开始。与其他阶段类似,这可能是第 4 阶段开始运行的标志。

在此之后,恶意软件启动系统记录器线程,其中记录的信息通过管道接收并保存到具有硬编码名称的文件中。记录的信息可以来自其他模块或进程。根据我们的分析,每个日志文件条目由分隔符 (0xAABBCCDD) 分隔,后跟自定义 RC4 密码和消息长度。

解密后的日志可以包含以下信息:

  • 运行的模块
  • 运行此模块的参数
  • 在哪个阶段(来自 CPuppetProcessFileSharer 的 GUID)执行了操作

图 5. Core 的解密日志

在此阶段还实现了以下命令行参数:

  • -显示名称
  • -InokeMethodParam(原文如此)
  • -InvokeMethodName
  • -NoModuleLoadDLL
  • -LoadShellcode

虽然其他参数大多是不言自明的,但我们强调两个值得注意的参数:-NoModuleLoadDLL 使用与阶段 1 加载器相同的技术,-LoadShellcode 分配一个内存块,复制 shellcode 并执行它。

第 5 阶段:Client.MainConsole

这是用 C++ 编写的主要客户端二进制文件,是 PuppetLoader 感染链的最后阶段。

代码由处理不同任务的几个类构成,例如管理交互式 shell、上传和下载文件、安装新模块、监控受害者行为以及在满足条件时执行回调函数。

  • CPipeCmdManager – 交互式外壳管理器

论据:

-flushusersession

-createcmd

-destorycmd(原文如此)

-执行命令

-cmdkeepalive

  • CommonLib::CcmdMulArgDecoder – 命令行参数解码器,与命令行参数相关的附加模块

论据:

-模块日志

-LogText

-模块ID

-模块版本

-MountStatus

-小路

-IsDelete

-ModuleKeepAlive

-上传文件

然后,客户端通过 UDP(用户数据报协议)与命令和控制 (C&C) 服务器建立通信,并识别不同类型的自定义 UDP 数据包:

主客户端实现的后门功能有:

  • 交互式外壳
  • 上传文件
  • 下载文件
  • 列出文件
  • 终止进程
  • 列出进程
  • 安装模块
  • 登录回调
  • 枚举 RDP 会话

通过 UDP 的通信协议使用相同的 RC4 加密。发送和/或接收的数据包包含一个 16 字节的 RC4 密钥和一个 RC4 加密有效负载的长度,然后是另一个带有加密有效负载本身的数据包。

我们在调查期间获得了 Windows 和 macOS 样本的另一个恶意软件家族是 oRAT。有趣的是,这是我们第一次分析这个用 Go 语言编写的恶意软件家族的样本。

我们在分析中发现的 oRAT 释放器是使用 Electron JS 框架和 DMG(磁盘映像)文件构建的 MiMi 聊天应用程序。我们在研究论文中讨论了两者的全部细节。

对于 Windows 和 macOS 示例,这些示例都标记为 0.5.1 版,并且具有相同的功能和配置。

配置文件和 AES 解密密钥以加密形式附加到 PE(便携式可执行文件)文件覆盖层。

图 6. 解密的 oRAT 配置

配置使用 AES-GCM(AES with Galois/Counter Mode)算法进行解密。然后,恶意软件对其进行解析并启用网关或流量转发器模式(如果在配置设置中指定)。

为了让恶意软件操作员直接连接到受感染的机器并通过 GET 或 POST 请求执行命令,恶意软件会启动受感染机器上的本地服务器,以侦听在配置设置中为控制命令指定的端口。

网络通信可以是纯文本或加密的,具体取决于文件的配置:

  • 纯文本的“tcp”
  • “stcp” 用于使用golang-tls 库的加密 TCP 通信
  • “sudp”用于使用Quic-go 库的加密 UDP 流量

控制服务器是通过注册路由来实现的。这种简单的机制导致将 GET/POST 请求直接转换为内部 Go 命令。因此,请求 URL 会导致在受感染的系统上执行相应的代码。

我们获得了注册这些路由的 oRAT 样本:

  • 获取/代理/信息
  • 获取/代理/ping
  • 发布/代理/上传
  • 获取/代理/下载
  • 获取/代理/截图
  • 获取/代理/压缩包
  • 获取/代理/解压缩
  • 获取 /agent/kill-self
  • 获取/代理/端口扫描
  • 获取/代理/代理
  • 获取/代理/ssh
  • 获取/代理/网络

PuppetDownloaders(C++ 下载器)

在我们的调查过程中,我们还发现恶意网站分发虚假的 Adob​​e Flash Player 更新,这些更新实际上是在提供 C++ 下载器。

感染始于用 C++ 编写的可执行文件,该可执行文件通过 Winsock API 连接到特定端口中的域或 IP 地址。下载的内容保存为 SMTemp.dat,并使用可执行文件的文件名和硬编码的 XOR 密钥,解密名为 Loader.dll 的文件并将其复制到磁盘。如果可执行文件因任何原因被重命名,DLL 解密将失败,并且恶意软件的第二阶段不会通过。

如果 SMTemp.dat 文件存在,Loader.dll 文件将执行它。之后,加载程序解密一个合法的 Adob​​e Flash Player 安装程序并执行它,以欺骗受害者认为可执行文件是一个合法的安装程序。

在调查过程中,我们注意到托管 PuppetDownloaders 恶意软件负载第二阶段的服务器处于离线状态。值得注意的是,该恶意软件的字符串解密例程是一个简单的 XOR,其密钥为字符串“2020-05-24 13:00:29”。用于解码字符串的密码的前 13 个字节与后 13 个字节相同。

图 7. XOR 解密例程

我们将这些下载器称为 PuppetDownloaders,因为它们与 PuppetLoader 恶意软件家族相关联,我们的观察证明了这一点:

  • 该恶意软件和 PuppetLoader 都使用相同的字符串解密例程,该例程使用相同的密钥。
  • 该恶意软件和 PuppetLoader 都使用相同的 XOR 密钥 (2726c6aea9970bb95211304705b5f595),用于解密嵌入式 Loader.dll 文件。
  • 该恶意软件和 PuppetLoader 的解密 Loader.dll 共享类似的字符串,例如“[-] UnExist pwszModuleFunName:”。这表明使用了一个通用框架来编译这两个 DLL。

MFC 套接字下载器

我们还看到 WinRAR 自解压 (SFX) 文件丢弃了使用 Microsoft 基础类库 (MFC) 框架编写的下载器。这些 MFC 套接字下载器具有相同的结构:一个函数创建一个套接字,连接到域或 IP 地址,发送一个短字符串,然后调用两次“recv”。

代码流通过调用 EnumDesktopsA 或 EnumWindows 重定向,其回调函数指针指向下载的内容。

下载器尝试访问端口 8080、29527 和 8885。它们还将字符串“feiji”、“@5436”和“fhfgj@jfggdsg”发送到套接字。我们发现了同一恶意软件家族的多个额外样本,它们具有相同的结构并发送相同的字符串。但是,多个组可能会秘密共享此恶意软件的源代码。

插头X

PlugX是一种远程访问工具 (RAT),十多年来一直被用作间谍活动的恶意工具。根据我们获得和分析的样本,我们发现 Earth Berberoka 使用 PlugX 以 32 位和 64 位架构为目标。

该恶意软件系列在 HELLO 数据包中发送一个 DWORD,一个 32 位无符号整数。然后,受感染的系统将看起来像“yyyymmdd”格式的日期的 HELLO 数据包发送到 C&C 服务器。

我们在分析的多个样本中发现了以下 DWORD,这表明我们发现的版本是在过去三年内开发的:20190520、20201106 和 20210804。

我们发现的所有样本都以相同的方式加载:一个容易受到 DLL 侧载攻击的合法且签名的文件被放置在一个恶意 DLL 旁边,该恶意 DLL 解密并加载包含最终有效负载的第三个文件。

这些恶意 DLL 文件之一具有 PDB(程序数据库)路径 C:\Users\Administrator\Desktop\Plug7.0(Logger)\logexts\x64\Release\logexts.pdb。

Gh0st RAT

我们还看到了Gh0st RAT的至少三种不同变体,这是另一个已经存在10 多年的恶意软件家族,被用于 Earth Berberoka 的活动。这个恶意软件家族的源代码是公开的,这就是它有很多变种的原因。

我们分析的其中一个变体有一个有趣的破坏性特征:它取代了主引导记录 (MBR) 以显示明确的消息(“我是病毒!F*ck you :-)”)。这条 Gh0st RAT 变种受害者的公开报告中也显示了这一特定信息。2017 年工业控制系统网络应急响应小组 (ICS-CERT)报告还讨论了 Gh0st RAT 变体如何擦除 MBR 并将其替换为不同样本中不同的消息。

其他已知的恶意软件系列

我们还发现 Earth Berberoka 滥用了其他合法工具,以及该组织在其活动中使用的恶意软件系列:

  • Quasar RAT——一种基于 Windows 的开源 RAT,已被 APT 组织用于网络攻击
  • AsyncRAT – 一种开源 RAT,可用于通过加密连接远程监控和控制设备
  • Trochilus – 一种可以逃避沙盒分析的隐形 RAT,可用于网络间谍活动

安全建议

我们的分析指出,Earth Berberoka 拥有多种工具和庞大的基础设施来瞄准东南亚赌博市场。为避免成为 Earth Berberoka 攻击的受害者,赌博网站的用户和运营商可以采用以下安全建议:

  • 在点击链接或下载应用程序之前,正确审查电子邮件、网站和应用程序。
  • 仅从受信任的来源下载应用程序。
  • 注意恶意网站标志,例如语法和拼写错误。
  • 通过托管电子邮件安全和反垃圾邮件保护阻止通过电子邮件到达的威胁,例如恶意链接。
  • 使用有助于检测、扫描和阻止恶意 URL 的多层安全解决方案。

我们调查的全部技术细节可以在我们即将发表的研究论文中找到。 我们在单独的文本文件中列出了WindowsLinuxmacOS的妥协指标 (IOC)。我们还在单独的文本文件中 提供域列表。