OceanLotus:macOS的Malvari更新

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作为请求参数调用ptracePT_DENY_ATTACH
  • 通过调用task_get_exception_ports检查某些异常端口是否打开
  • 通过检查当前进程中是否存在P_TRACED标志,检查调试器是否已连接,如下图所示


图3.使用sysctl函数检查调试器连接

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

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

之后,该示例将根据已知虚拟化系统的字符串的硬编码列表检查返回值: aclevmwarevirtualboxparallels 。 最后,以下命令检查计算机是否为以下“ 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检索导出的BoriryChadylonV ,这些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上获得

Source: https://habr.com/ru/post/zh-CN447530/


All Articles