海莲花APT组织(又名APT 32,APT-C-00,SeaLotus和Cobalt Kitty)是一个高度组织化的、专业化的境外黑客组织,该APT组织主要针对人权组织,媒体,研究机构和海事建筑公司等进行高级持续性攻击。亚信安全多年来一直持续追踪海莲花组织,近日,我们发现该组织使用最新的MacOS后门程序,对装有Perl程序的Mac系统进行攻击,亚信安全截获了该后门程序,并将其命名为OSX_OCEANLOTUS.D。
OSX_OCEANLOTUS.D技术分析
MacOS后门程序通过带有恶意word文档的电子邮件传播,Word文档原始文件名为“2018-PHIẾU GHI DANH THAM DỰ TĨNH HỘI HMDC 2018.doc”, 翻译成中文就是“2018年HMDC大会登记表”, 而HMDC是一个在越南宣传民族独立和民主的组织。
恶意文档运行时的截图
当收件人打开该文档时,该后门程序会建议收件人启用宏。而这个恶意宏则采用了十进制ASCII代码逐个字符地进行混淆,以逃避各种杀毒软件的检测。
文档混淆后的代码片段
去除混淆后,我们可以看到有效负载是用Perl编程语言编写的。它会从Word文档中提取theme0.xml文件。theme0.xml是一个带有0xFEEDFACE签名的Mach-O32位可执行文件,其也是该后门程序最终有效载荷。theme0.xml在执行之前会先解压到/ tmp / system / word / theme / syslogd目录。
去除混淆后的Perl有效载荷
Dropper分析
Dropper用于将后门安装到受感染系统中并建立其持久性攻击机制。
Dropper的主要功能
Dropper的所有字符串以及后门均使用硬编码的RSA256密钥进行加密。其中,有两种形式的加密字符串:RSA256加密的字符串,以及自定义的base64编码和RSA256加密的字符串。
硬编码的RSA256密钥会显示前20个字符
Dropper会使用setStartup()方法来判断其是否以root身份运行。并以此做为依据,使用GET_PROCESSPATH和GET_PROCESSNAME方法对后门安装的路径和文件名进行解密:
root用户
路径:/Library/CoreMediaIO/Plug-Ins/FCP-DAL/iOSScreenCapture.plugin/Contents/Resources/
进程名:screenassistantd
普通用户
路径:〜/ Library /Spelling /
进程名:spellagentd
随后,它使用Loader ::installLoader方法,读取硬编码的64位Mach-O可执行文件(magic value 0xFEEDFACF),并写入先前确定的路径和文件。
Dropper安装后门,将其属性设置为“hidden”,并设置随机文件的日期和时间
当Dropper安装后门时,其会将属性设置为“hidden”,并使用touch命令将文件日期和时间设置为随机值:touch -t YYMMDDMM“/path / filename”> / dev / null。与此同时,访问权限被更改为0x1ed = 755,相当于u= rwx,go = rx。
Mach-O 可执行文件(64位)的magic value 0xFEEDFACF
用GET_LAUNCHNAME和GET_LABELNAME方法为root用户(com.apple.screen.assistantd.plist)和普通用户(com.apple.spell.agent.plist)返回属性列表“ .plist ” 的硬编码名称。之后,其会在/Library / LaunchDaemons /或〜/ Library /LaunchAgents / 文件夹中创建持久性文件。当操作系统启动时,RunAtLoad用来运行守护进程,而KeepAlive使进程无限期地运行。该持久性文件被设置为掩藏属性,文件的时间和日期也是随机生成的。
具有持久性设置的属性列表
launchctlload /Library/LaunchDaemons/filename.plist> / dev / nul或launchctl load〜/ Library /LaunchAgents / filename.plist> / dev / nul命令使得操作系统在登录时启动生成的后门文件,随后Dropper将会删除自身。
后门分析
后门包含两个主要函数infoClient和runHandle。infoClient负责将收集到的操作系统信息发送给C&C服务器(服务器本身是恶意的),并接收来自C&C服务器的返回信息,而runHandle负责后门功能。
后门的主要功能
infoClient在HandlePP类中填充的变量:
HandlePP类的变量列表
clientID是从环境变量衍生的MD5哈希,而strClientID是clientID的十六进制表示。以下所有字符串均通过AES256和base64编码加密。HandlePP :: getClientID方法使用的是下面的环境变量:
序列号
硬件UUID
MAC地址
随机生成的UUID
对于初始信息包,后门还收集以下信息:
操作系统版本
运行getpwuid -> pw_name,scutil --get ComputerName和uname -m将分别提供以下返回值:
Mac OSX 10.12.
System Administrator
<owner’s name>’s iMac
x86_64
所有这些数据在发送到C&C服务器之前都被加密。详细过程如下所述:
1. 扰码
类解析器的方法有多种,每个变量类型的解析方法各不同,比如Parser::inBytes, Parser::inByte, Parser::inString以及Parser::inInt.。
Parser:: inByte方法
如果clientID等于以下字节序列B4 B1 47 BC 52 28 2873 1F 1A 01 6B FA 72 C0 73,那么这个扰码的版本就是使用第三个参数(0x10)计算的,其被当做一个DWORD来处理,每4个字节都与它进行异或,如下例所示。
Parser :: inByte方法
当扰码一个字节时,扰码器首先确定字节值是奇数还是偶数。如果该值为奇数,则将该字节和一个随机生成的字节一起添加到数组中。在偶数值的情况下,首先添加随机生成的字节,然后添加该字节。在上面的例子中,第三个参数是'1'= 0x31,这是一个奇数。这意味着它将字节'1'和一个随机生成的字节添加到最终的扰码阵列。
Parser:: inString方法
扰码一个字符串时,扰码器产生一个5字节长的序列。首先,它产生一个随机字节,随后是三个零字节,一个随机字节,最后是字符串长度的字节。假设我们想要混淆字符串'Mac OSX 10.12'。它的长度是13 = 0x0d,两个随机字节是0xf3和0x92。最后的5字节序列看起来像F300 00 00 92 0D,然后原始字符串与5字节序列异或。
扰码Mac OSX 10.12
1. 加密
加密的字节序列被传递到Packet ::Packet类的构造函数中,该类创建随机AES256密钥并使用此密钥加密缓冲区。
2. 编码加密密钥
为了使C&C服务器解密和加密数据,随机生成的AES256密钥必须与加密数据一起包含在数据包中。然而,这个密钥也是通过异或操作XOR 0x13进行扰码的,随后对每个字节应用ROL 6操作。
在输出数据包中扰码AES256密钥的函数
扰码和加密过程中的一些屏幕截图:
灰色部分的字节表示已加密的计算机信息
随机生成AES256密钥
扰码的AES256密钥(0xC1异或0x13 = 0xD2,0xD2ROL 6 = 0xB4)等)
使用AES256密钥加密的计算机信息
发送到C&C服务器的最终有效载荷的屏幕截图,扰码的AES256密钥标记为绿色,而加密的计算机信息标记为红色,其他是随机生成的字节
当后门收到来自C&C服务器的响应时,最终有效载荷需要通过解密和扰码类似的方式进行解码。 Packet:: getData解密接收到的有效载荷,而Converter::outString负责对结果进行解扰。
从C&C服务器收到的数据包含以下信息:
HandlePP :: urlRequest(/appleauth/static/cssj/N252394295/widget/auth/app.css)
HandlePP :: keyDecrypt
STRINGDATA :: BROWSER_SESSION_ID(m_pixel_ratio)
StringData是::RESOURCE_ID
这些数据稍后将在C&C通信中使用,如下面的Wireshark屏幕截图所示:
交换系统数据包信息后与C&C服务器的通信
同时,该后门程序的runHandle方法将使用以下后门命令(每个命令有一个字节长的代码并由Packet:: getCommand提取)调用requestServer方法:
getCommand 方法
如下两个示例都创建了一个线程,每个线程负责下载和执行文件或在终端中运行命令行程序:
用于下载和执行以及在终端中运行命令的命令
用于上传和下载文件的命令
支持的命令及其各自的代码
* 本文作者:亚信安全,转载注明来自FreeBuf