OceanLotus:macOS 恶意软件更新

2019 年 XNUMX 月,来自网络组织 OceanLotus 的 macOS 恶意软件新样本被上传到流行的在线扫描服务 VirusTotal。 该后门可执行文件与我们研究的 macOS 恶意软件的先前版本具有相同的功能,但其结构发生了变化,并且变得更难以检测。 不幸的是,我们无法找到与该样本相关的滴管,因此我们还不知道感染媒介。

我们最近发布了 关于海莲花的帖子 以及操作员如何尝试提供持久性、加快代码执行速度并最大限度地减少 Windows 系统上的占用空间。 据了解,该网络组织还拥有适用于 macOS 的组件。 这篇文章详细介绍了 macOS 最新版本的恶意软件与之前版本相比的变化(由趋势科技描述),还介绍了如何在分析过程中使用 IDA Hex-Rays API 自动解密字符串。

OceanLotus:macOS 恶意软件更新

分析

接下来的三部分描述了使用 SHA-1 哈希对样本进行的分析 E615632C9998E4D3E5ACD8851864ED09B02C77D2。 该文件名为 手电筒d,ESET防病毒产品将其检测为OSX/OceanLotus.D。

反调试和沙箱保护

与所有 macOS OceanLotus 二进制文件一样,该示例使用 UPX 打包,但大多数打包器识别工具无法识别它。 这可能是因为它们大多包含依赖于“UPX”字符串存在的签名,此外,Mach-O 签名不太常见,并且更新不那么频繁。 此功能使静态检测变得困难。 有趣的是,解压后,入口点位于该部分的开头 __cfstring 在细分中 .TEXT。 该部分具有标志属性,如下图所示。

OceanLotus:macOS 恶意软件更新
图 1. MACH-O __cfstring 节属性

如图2所示,该部分的代码位置 __cfstring 允许您通过将代码显示为字符串来欺骗某些反汇编工具。

OceanLotus:macOS 恶意软件更新
图 2. IDA 检测到的后门代码作为数据

执行后,二进制文件将创建一个线程作为反调试器,其唯一目的是不断检查调试器是否存在。 对于此流程:

— 尝试取消任何调试器,调用 ptrace с PT_DENY_ATTACH 作为请求参数
- 通过调用函数检查某些独占端口是否打开 task_get_exception_ports
- 通过检查标志是否存在来检查调试器是否已连接,如下图所示 P_TRACED 在当前流程中

OceanLotus:macOS 恶意软件更新
图 3. 使用 sysctl 函数检查调试器连接

如果看门狗检测到调试器的存在,则调用该函数 exit。 此外,该示例还通过运行两个命令来检查环境:

ioreg -l | grep -e "Manufacturer" и sysctl hw.model

然后,该示例根据已知虚拟化系统的硬编码字符串列表检查返回值: 阿克尔, VMware的, VirtualBox的 или 相似之处。 最后,下一个命令检查机器是否是以下“MBP”、“MBA”、“MB”、“MM”、“IM”、“MP”和“XS”之一。 这些是系统型号代码,例如,“MBP”表示 MacBook Pro,“MBA”表示 MacBook Air 等。

system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}

主要补充

虽然自趋势科技研究以来后门命令没有发生变化,但我们确实注意到了一些其他修改。 此示例中使用的 C&C 服务器相当新,创建于 22.10.2018 年 XNUMX 月 XNUMX 日。

- daff.faybilodeau[.]com
- sarc.onteagleroad[.]com
- au.charlineopkesston[.]com

资源 URL 已更改为 /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
发送到C&C服务器的第一个数据包包含有关主机的更多信息,包括下表中的命令收集的所有数据。

OceanLotus:macOS 恶意软件更新

除了此配置更改之外,该示例未使用网络过滤库 libcurl,但是一个外部库。 为了找到它,后门尝试使用 AES-256-CBC 和密钥来解密当前目录中的每个文件 gFjMXBgyXWULmVVVzyxy,用零填充。 每个文件都被解密并保存为 /tmp/store,并尝试使用该函数将其作为库加载 打开。 当解密尝试导致调用成功时 dlopen,后门提取导出函数 Boriry и ChadylonV,它们显然负责与服务器的网络通信。 我们没有来自示例原始位置的滴管或其他文件,因此我们无法解析该库。 此外,由于该组件已加密,因此基于这些字符串的 YARA 规则将与磁盘上找到的文件不匹配。

正如上面文章中所描述的,它创建了 客户端ID。 此 ID 是以下命令之一的返回值的 MD5 哈希值:

- ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, """); printf("%s", line[4]); }'
- ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, """); printf("%s", line[4]); }'
- ifconfig en0 | awk '/ether /{print $2}' (获取MAC地址)
- 未知团队(“x1ex72x0a"),在之前的示例中使用过

在散列之前,会在返回值中添加“0”或“1”以指示 root 权限。 这 clientID的 存储在 /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex,如果代码以 root 身份运行,或者在所有其他情况下在 ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML 中运行。 该文件通常使用该功能隐藏 _chflags,使用命令更改其时间戳 touch –t 具有随机值。

字符串解密

与之前的选项一样,字符串使用 AES-256-CBC 进行加密(十六进制密钥: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 用零填充,IV 用零填充)通过函数 CCC加密。 密钥与以前的版本相比有所变化,但由于该组仍然使用相同的字符串加密算法,因此可以自动解密。 除了这篇文章之外,我们还发布了一个 IDA 脚本,该脚本使用 Hex-Rays API 来解密二进制文件中存在的字符串。 该脚本可能有助于将来对 OceanLotus 的分析以及对我们尚未获得的现有样本的分析。 该脚本基于接收传递给函数的参数的通用方法。 此外,它还会查找参数分配。 可以重用该方法来获取函数参数列表,然后将其传递给回调。

了解函数原型 解码,脚本找到此函数的所有交叉引用、所有参数,然后解密数据并将纯文本放置在交叉引用地址的注释中。 为了使脚本正常工作,必须将其设置为 Base64 解码函数使用的自定义字母表,并且必须定义一个包含密钥长度的全局变量(在本例中为 DWORD,请参见图 4)。

OceanLotus:macOS 恶意软件更新
图 4. 全局变量 key_len 的定义

在“函数”窗口中,您可以右键单击解密函数,然后单击“提取并解密参数”。 该脚本应将解密的行放在注释中,如图 5 所示。

OceanLotus:macOS 恶意软件更新
图 5. 解密后的文本放在评论中

这样解密后的字符串就可以方便地放在 IDA 窗口中 外部参照 该函数如图 6 所示。

OceanLotus:macOS 恶意软件更新
图 6. f_decrypt 函数的外部引用

最终脚本可以在以下位置找到 Github存储库.

结论

正如已经提到的,OceanLotus 正在不断改进和更新其工具包。 这次,该网络组织改进了恶意软件,使其能够与 Mac 用户配合使用。 代码没有太大变化,但由于许多 Mac 用户忽视安全产品,因此保护恶意软件免遭检测是次要的。

ESET 产品在研究时已检测到此文件。 由于用于 C&C 通信的网络库现在已在磁盘上加密,因此攻击者使用的确切网络协议尚不清楚。

妥协指标

妥协指标以及 MITRE ATT&CK 属性也可在 GitHub上.

来源: habr.com

添加评论