2019年3月,流行的在线扫描服务VirusTotal为OceanLotus网络集团的macOS上传了一个新的恶意软件样本。 后门可执行文件与我们为macOS研究的malvari的先前版本具有相同的功能,但其结构已更改,并且变得更加难以检测。 不幸的是,我们找不到与此样本相关的滴管,因此我们尚不知道感染媒介。
最近,我们发表了一篇
有关OceanLotus的文章 ,以及操作员如何尝试确保持久性,加快代码执行速度并最小化Windows系统上的存在痕迹。 还众所周知,该网络组具有适用于macOS的组件。 这篇文章详细描述了macOS的最新版macware与先前版本(
由趋势科技描述 )相比的变化,以及分析如何使用IDA Hex-Rays API自动进行字符串解密。
分析方法
以下三部分描述了使用SHA-1
E615632C9998E4D3E5ACD8851864ED09B02C77D2
样本分析。 该文件称为
flashlightd ,ESET防病毒产品将其检测为OSX / OceanLotus.D。
防调试和沙箱保护
与所有OceanLotus macOS二进制文件一样,该示例与UPX打包在一起,但是大多数打包程序识别工具都无法识别出它。 可能是因为它们主要包含签名(取决于字符串“ UPX”的存在),此外,Mach-O签名不太常见,并且更新频率不高。 此功能使静态检测变得困难。 有趣的是,解
__cfstring
后,入口点位于
__cfstring
段中
__cfstring
节的
.TEXT
。 如下图所示,此部分中有标志属性。
图1. MACH-O __cfstring部分的属性如图2所示,在
__cfstring
部分中的代码位置使
__cfstring
可以通过将代码显示为字符串来欺骗某些反汇编工具。
图2. IDA将后门代码定义为数据启动二进制文件后,将创建一个流来防止调试,该流的唯一目的是不断检查调试器的存在。 对于此线程:
- 尝试通过将
PT_DENY_ATTACH
作为请求参数调用ptrace
来PT_DENY_ATTACH
- 通过调用
task_get_exception_ports
检查某些异常端口是否打开 - 通过检查当前进程中是否存在
P_TRACED
标志,检查调试器是否已连接,如下图所示
图3.使用sysctl函数检查调试器连接如果看门狗检测到调试器的存在,则会调用
exit
函数。 另外,该示例然后通过执行两个命令来检查环境:
ioreg -l | grep -e "Manufacturer" sysctl hw.model
之后,该示例将根据已知虚拟化系统的字符串的硬编码列表检查返回值:
acle ,
vmware ,
virtualbox或
parallels 。 最后,以下命令检查计算机是否为以下“ 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服务器是相当新的,创建日期为10/22/2018。
- daff.faybilodeau [。] com
- sarc.onteagleroad [。] com
- au.charlineopkesston [。] com
资源URL更改为
/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35
。
发送到C&C服务器的第一个数据包包含有关主机的更多信息,包括由下表中的命令收集的所有数据。

除了此配置更改之外,该示例还没有使用
libcurl库进行网络过滤,而是使用了一个外部库。 为了找到它,后门尝试使用带有
gFjMXBgyXWULmVVVzyxy
密钥并
gFjMXBgyXWULmVVVzyxy
零的AES-256-CBC解密当前目录中的每个文件。 每个文件都被解密并保存为
/tmp/store
,并尝试使用
dlopen函数将其加载为库。 当解密尝试导致成功的
dlopen
调用时,后
Boriry
检索导出的
Boriry
和
ChadylonV
,这些
ChadylonV
似乎负责与服务器进行网络通信。 该示例的源位置中没有滴管或其他文件,因此我们无法分析该库。 此外,由于组件已加密,因此基于这些行的YARA规则将与磁盘上找到的文件不匹配。
如以上文章所述,创建了
cliendID 。 此标识符是以下命令之一的返回值的MD5哈希:
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'
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]); }'
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }'
ifconfig en0 | awk \'/ether /{print $2}\'
ifconfig en0 | awk \'/ether /{print $2}\'
(获取MAC地址)
-未知命令(“
\x1e\x72\x0a
”),在先前的示例中使用
在散列之前,将字符“ 0”或“ 1”添加到返回值中,表示存在root用户特权。 如果代码以root用户身份运行,则此
clientID存储在
/Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
在所有其他情况下。 通常使用
_chflags函数隐藏文件;使用带有随机值的
touch –t
命令更改其时间戳。
解码字符串
与以前的版本一样,使用
CCCrypt函数使用AES-256-CBC(十六进制密钥:
9D7274AD7BCEF0DED29BDBB428C251DF8B350B92
零,IV填充零)对字符串进行加密。 密钥已从以前的版本进行了更改,但是由于该组仍使用相同的字符串加密算法,因此可以自动执行解密。 除了这篇文章,我们还将发布一个IDA脚本,该脚本使用Hex-Rays API解密二进制文件中存在的字符串。 该脚本可能有助于将来对OceanLotus进行分析以及对我们尚未获得的现有样本进行分析。 该脚本基于一种通用方法,用于接收传递给函数的参数。 他还在寻找目的地设置。 可以重用该方法以获取函数参数列表,然后将其传递给回调。
知道了
解密函数的原型后,脚本会找到对该函数的所有交叉引用,所有参数,然后解密数据并将纯文本放入交叉引用地址的注释中。 为了使脚本正常工作,它必须具有base64解码功能使用的用户定义字母,并且必须定义一个包含密钥长度的全局变量(在这种情况下,为DWORD,请参见图4)。
图4. key_len全局变量的定义在“函数”窗口中,可以右键单击解密函数,然后单击“提取和解密参数”。 该脚本应将解密的行放在注释中,如图5所示。
图5.解密后的文本放在注释中因此,可以将解密的行方便地一起放置在IDA
外部参照窗口中以实现此功能,如图6所示。
图6.对f_decrypt函数的外部参照最终的脚本可以在
Github仓库中找到。
结论
如前所述,OceanLotus正在不断改进和更新其工具集。 这次,网络组织改进了与Mac用户合作的恶意软件。 代码没有太大变化,但是由于许多Mac用户忽略了安全产品,因此保护恶意软件免遭检测是次要的。
ESET产品在研究时已检测到此文件。 由于用于C&C通信的网络库现在已在磁盘上加密,因此攻击者使用的确切网络协议尚不清楚。
折衷指标
妥协指标以及MITER ATT&CK属性也可以在
GitHub上获得 。