介绍
最近在我们 WildFire 云分析平台上发现了一个新版本的“海莲花( OceanLotus )”后门,这可能是我们在 macOS 更新日志中比较新的后门。这次迭代的目标是一些在越南的感染用户,同时也修复了低级的 AV 检测问题,这个问题自从第一次发现,到现在将近有一年了。如果忽略非正式的几次更新,这个系统的使用情况还是很活跃的, 在我们分析的时候也就是 2017 年 6 月份上旬,我们可以直接通过发送命令连接和控制服务器。
虽然这个看起来和 2015 年 5 月份发现的海莲花( OceanLotus )的一个例子很相似,但从那时起已经有了各种各样的改进。一些改进包括病毒文件的使用,去除使用命令行工具,完善的字符串编码机制,使用加密的自定义二进制协议通信量,还有一个模块化的后门。
感染途径
新的海莲花后门是渗透在一个 zip 文件中。虽然我们没有直接的原始感染路径证据,但我们推测它很可能通过电子邮件附件。一旦用户提取了 ZIP 文件,就会看到一个目录,其中包含一个带有微软 Word 文档图标的文件。该文件实际上是一个应用程序包,其中包含可执行代码。(参见图 1 )。一旦用户双击据称的 Word 文档,特洛伊木马程序就会执行,然后启动 Word 来显示一个诱饵文档。
该恶意软件使用诱饵文件,以帮助掩盖恶意软件的执行。这种技术是基于 Windows 恶意软件的一种普通方法,但很少在 MacOS 使用。为了达到这层混淆,恶意软件作者不得不欺骗操作系统相信文件夹是一个应用程序包而忽略扫描这个 docx 扩展文件。通常, MacOS 的恶意软件会模仿合法应用的安装程序如 Adobe Flash ,这就是如何将 OceanLotus 的旧版本打包。
Figure 1
一旦应用程序包被加载,其就会打开包内 Resources 文件夹中一个名为 .CFUserEncoding 的隐藏文件。这是一个有密码保护的 Word 文档(见图 2 )。它还将该文件复制到可执行路径,并在驻留机制设置之后替换了应用程序包。这将导致受害者相信没有什么不妥,因为他们认为他们正在打开一个 word 文档,然后这个 Word 文档就打开了。在这种情况下,该 Word 文件的名称为“ Noi dung chi tiet.docx ”,这一表达正是越南语中的“ Details( 细节信息 ) ”之意。
Figure 2
驻留机制
与这个后门的前一版本相比,这种驻留机制基本保持不变。这个版本创建一个 Launch Agent ,在受害者主机启动时运行,而早期版本的执行,是当用户登录时。另外,新版本后门会根据运行应用程序之用户的具体 UID 将自身以不同文件名复制到不同位置。
对于登陆的用户不是超级用户,该后门会采集由 getpwuid() 函数返回的 MD5 哈希值结构,将这个哈希值拆分成 < 前 8 位哈希值 >-< 接下来 16 位哈希值 >-< 最后 8 位哈希值 > . 。这些分段的 MD5 哈希值在前面会附上 “0000-“ ,然后作为在 ~/Library/OpenSSL/ 下的一个目录来保存可执行文件(详见图三)。如果登陆的是超级用户,该可执行文件即会被存储在系统系统级的库目录中: /Library/TimeMachine/bin/mtmfs 。
值得一提的是,该可执行文件以及 plist 位置从表面上看与其它合法应用程序无异。
UID
plist Location
Executable Location
0
/Library/LaunchDaemons/com.apple.mtmfsd.plist
/Library/TimeMachine/bin/mtmfs
> 0
~/Library/LaunchAgents/com.apple.openssl.plist
~/Library/OpenSSL/0000-<segmented MD5 hash>/servicessl
Figure 3
一旦这个恶意软件设置成驻留机制,它就会从可执行路径下删除源应用程序包,只留下诱饵文件,然后从新的路径下将自身作为一个服务加载。
去除命令行工具
关于这个后门,我们首先注意到它缺少可疑的字符串,这些字符串通常会表明恶意软件在受害者主机的目的。大多数 MacOS 的恶意软件,会有些地方用 system() 或 exec() 函数来运行其他脚本。在这种情况下,这些没有明显存在调用这些函数,也没有命令行工具字符串,可以轻松地传达应用程序的恶意意图。这说明相比其他攻击者通常只会复制和粘贴来自网络的脚本,这个后门的作者对 macOS 平台会有更加深层次的了解。
这种字符串的缺失加大逆向分析技术的难度,会让该恶意软件看起来不那么可疑,尤其是对于基础的静态分析。
字符串解码
由于在明文上几乎没有明显的可疑之处,于是我们转向考虑作者使用编码或者混淆字符串的可能性。
这个后门的字符串解码方式是从前一版本升级来的,其中字符串是以“ Variable ”作为键进行 XOR 编码。字符串解码方式现在由 bit 位移和 XOR 操作组成,“ Variable ”键取决于所编码字符串的长度。如果变量 XOR 的键计算结果是 0 ,则使用“ XOR ”默认的键 0x1B 。图 4 显示了解码函数的 Python 实现。
Figure 4
在解码字符串(参见图 5 )之后,我们可以观察到恶意软件如何建立永久机制,调查受害者的计算机,并将这些信息发回服务器。在这一点上,这个恶意软件包含后门所实现的功能仍然不明显。
Figure 5
自定义的二进制协议和加密数据包
负责此恶意软件的攻击者似乎花费了大量的精力来开发自己的自定义通信协议。他们并不是简单地使用现成的 Web 服务器来实现他们的命令和控制服务器,这和常规的手法不同。相反,他们创建了自己的命令和控制机制。
后门使用 TCP 端口 443 上的自定义二进制协议,这是一个众所周知的端口,由于它在 HTTPS 连接中的使用,它不太可能被传统防火墙阻止。如图六所示的数据包利用 bit 位移(见图七)与 XOR 配合 0x1B 键共同进行编码。在执行 XOR 运算之前,位总是向左移动 3 次。这是从以前的版本的包只有 XOR 配合 0x1B 键编码的改进。
Figure 6
Figure 7
解码安装包后,我们可以看到不同字段的断点。图 8 显示客户端向服务器发送的初始数据包。除了“ magic ”字节、数据长度和通信类型之外,数据包相对比较空。
Figure 8
根据从服务器发回来的命令,数据包可能会大于 0x52 个字节。超过 0x52 个字节部分的数据会用 zlib 进行压缩,然后,在 CBC 模式下用 AES 加密,同时带有空的初始化向量( IV )和密钥填充的 32 个字节从服务器发送出来。
我们捕捉到从服务器发出来的实时流量,我们观察到从服务器发出来的秘钥是一次性的。这就意味着每一次同服务器建立新的会话都会得到不同的秘钥来加密发送回来的数据。相比于旧版本,这是一次标志性的改进,旧版本只用单字节密钥对 XOR 编码进行加密。
在对从服务器接收到的数据包解码之后,后门会去验证某些字段,如“ magic ”字节,并确保接收到的数据的长度不超过一定值。在整个程序执行过程中,它还检查和处理可能生成的任何错误。
C&C 通信
C&C 服务器通信的顺序如下“
1. 客户机要向服务器发起一次会话,会发送一个命令段为 0x2170272 的数据包
2. 服务器会响应一个带有一次性秘钥和一个命令的数据包。
3. 客户端检查接收到的数据包是否有效。
4. 客户端执行服务器发送的命令,响应一个 zlib 压缩和 AES 加密的乱序结果然后发送回服务器。
不像以前的版本,海莲花( oceanlotus )的命令可以很容易地从它的字符串收集到,作者函数与常数打乱。我们解码了以下可用命令,如图 9 所示。
命令
命令描述
0x2170272
初始化
0x5CCA727
???
0x2E25992
从服务器接收文件
0x2CD9070
在文件/ 路径下获取相关信息
0x12B3629
删除文件/ 路径
0x138E3E6
???
0x25D5082
从一个动态库内执行一个函数
0x25360EA
发送文件到服务器
0x17B1CC4
???
0x18320E0
发送附有水印的受害者和电脑信息
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)