本文详细介绍了趋势科技分析的以前的macOS 版本所发生的变化,并描述了在分析此变体的代码时,如何使用IDA Hex-Rays API自动执行字符串解密。
样本信息:
MacOS后门文件名为flashlightd
MD5:06334cb14c1512bf2794af8dae5ab357
反调试和反沙箱
与其他OceanLotus macOS一样,该样本使用UPX加壳,但大多数加壳程序识别工具都不会识别它,可能是因为它们主要包含依赖于“UPX”字符串存在的签名,而且, Mach-O特征不太常见,不经常更新。因此这种特殊的特性使静态检测更加困难。
解压缩后,一个有趣的事情是入口点位于.TEXT段的__cfstring部分的开头。此部分具有图1中所示的标志属性。
如图2所示,代码位于__cfstring部分的事实欺骗了一些反汇编工具以将代码显示为字符串。
运行时,二进制文件首先创建一个线程作为反调试watchdog,其唯一目的是不断检查是否存在调试器。为了做到这一点,这个线程会这么做:
- 尝试通过使用PT_DENY_ATTACH作为请求参数调用ptrace来分离任何调试器
- 通过调用task_get_exception_ports函数检查是否打开了某些异常端口
- 通过验证是否在当前进程中设置了P_TRACED标志来检查是否附加了调试器,如图3所示
如果监视程序检测到存在调试器,则调用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)。
在“ 函数”窗口中,可以右键单击解密函数,然后单击“提取和解密参数”。脚本应该将解密的字符串放在注释中,如图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。