本文详细介绍了趋势科技分析的以前的macOS 版本所发生的变化,并描述了在分析此变体的代码时,如何使用IDA Hex-Rays API自动执行字符串解密。

样本信息:

MacOS后门文件名为flashlightd

MD5:06334cb14c1512bf2794af8dae5ab357

反调试和反沙箱

与其他OceanLotus macOS一样,该样本使用UPX加壳,但大多数加壳程序识别工具都不会识别它,可能是因为它们主要包含依赖于“UPX”字符串存在的签名,而且, Mach-O特征不太常见,不经常更新。因此这种特殊的特性使静态检测更加困难。

解压缩后,一个有趣的事情是入口点位于.TEXT段的__cfstring部分的开头。此部分具有图1中所示的标志属性。

图1 - MACH-O __cfstring部分属性

如图2所示,代码位于__cfstring部分的事实欺骗了一些反汇编工具以将代码显示为字符串。

图2 - 后门代码由IDA定义为数据

运行时,二进制文件首先创建一个线程作为反调试watchdog,其唯一目的是不断检查是否存在调试器。为了做到这一点,这个线程会这么做:

  • 尝试通过使用PT_DENY_ATTACH作为请求参数调用ptrace来分离任何调试器

  • 通过调用task_get_exception_ports函数检查是否打开了某些异常端口

  • 通过验证是否在当前进程中设置了P_TRACED标志来检查是否附加了调试器,如图3所示

图3 - 检查调试器是否通过sysctl函数连接

如果监视程序检测到存在调试器,则调用exit函数。

此外,样本会通过发出以下两个命令来检查其环境:

ioreg -l | grep -e“Manufacturer”和sysctl hw.model

并根据已知虚拟化系统字符串的硬编码列表检查返回值:oracle,vmware,virtualbox或parallels。

最后,命令:

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

检查机器是否为以下之一:

“MBP”,“MBA” ,“MB”,“MM”,“IM”,“MP”和“XS”。

这些代码代表系统的模型。例如,“MBP”代表MacBook Pro,“MBA”代表MacBook Air等等。

主要更新

尽管自趋势科技文章以来后门命令没有改变,但还是有一些其他修改。

用于此样本的C&C服务器是最新的,因为它们的创建日期是2018-10-22。

  • daff.faybilodeau.com

  • sarc.onteagleroad.com

  • au.charlineopkesston.com

使用的URL资源已更改为/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35

发送到C&C服务器的第一个数据包包含有关主机的更多信息。包括下表中的命令收集的所有数据。

命令

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

machdep.cpu.brand_string

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

ifconfig -l

ioreg -rd1 -c IOPlatformExpertDevice | awk "/IOPlatformSerialNumber/ { split($0, line, """); printf("%s", line[4]); }"

除了此配置更改之外,此示例不使用libcurl库进行网络渗透。相反,它使用外部库。

为了找到它,后门尝试使用AES-256-CBC解密当前目录中的每个文件,其中key为gFjMXBgyXWULmVVVzyxy,用零填充。

每个文件都被“解密”并保存为/tmp/store,并尝试将其作为使用dlopen函数创建的库加载。

当解密尝试导致成功调用dlopen时,后门会检索导出的函数Boriry和ChadylonV ,这似乎是负责与服务器的网络通信的函数。

由于没有来自原始样本位置的dropper或其他文件,因此无法分析此库。

此外,由于组件已加密,因此基于这些字符串的YARA规则与磁盘上找到的文件不匹配。

而海莲花的macOS后门都会创建一个clientID。此标识符是以下命令之一,执行之后的返回值,再计算MD5哈希值后的值:

在进行哈希处理之前,会将字符“0”或“1”附加到表示根权限的返回值。

如果代码以root身份运行,或者在

~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML 中,此clientID存储在

~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML

否则,此文件通常通过_ chflags函数隐藏,其时间戳使用带有随机值的“ touch -t ”命令进行修改。

字符串解密

与以前的变体一样,字符串使用AES-256-CBC

(十六进制编码密钥:

9D7274AD7BCEF0DED29BDBB428C251DF8B350B92,用零填充,IV用零填充)加密,使用CCCrypt 功能。

密钥已从以前的版本更改,但由于海莲花仍使用相同的算法来加密字符串,因此可以自动解密。

与本文一起,发布了一个利用Hex-Rays API来解密二进制文件中存在的字符串的IDA脚本。

该脚本可能有助于将来对OceanLotus的分析以及我们尚未获得的现有样本的分析。

这个脚本的核心是一个通用的方法来获取传递给函数的参数。

此外,它会查找参数分配以查找其值。可以重用此方法来检索函数的参数列表,然后将它们传递给回调。

知道了解密函数的原型,脚本首先找到对该函数的所有交叉引用,找到所有参数,解密数据并将明文放在交叉引用地址的注释中。

为了使脚本正常工作,必须在脚本中设置base64解码函数使用的自定义字母,并且必须定义包含键长度的全局变量(在本例中为DWORD;请参见图4)。

图4 - 定义全局变量key_len

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

图5 - 将解密的文本放入注释中

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

图6 - 外部参照到的f_decrypt 功能

脚本已上传至github,可以用用看。

https://github.com/blackorbird/APT_REPORT/blob/master/Oceanlotus/OL_OSX_decryptor.py

结论

正如我们在另一篇文章中最近记录的那样,OceanLotus不断改进和更新其工具集,并再次改进了针对Mac用户的工具。

代码没有那么大改变,但由于许多Mac用户没有在他们的机器上运行安全软件,因此逃避检测的需求并不那么重要。

由于用于C&C通信的网络库现在已在磁盘上加密,因此该后门使用的真正网络协议仍然未知。

IOC

MD5:06334cb14c1512bf2794af8dae5ab357

文件路径:

1、~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML

2、/Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex

3、/tmp/store

域名

daff.faybilodeau.com

sarc.onteagleroad.com

au.charlineopkesston.com

URI

/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35

报告链接:

https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/

趋势对海莲花mac后门的分析:

https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/

声明:本文来自黑鸟,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。