海莲花APT组织使用最新MacOS后门程序发动攻击 – 作者:亚信安全

海莲花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是一个在越南宣传民族独立和民主的组织。

image002.png

恶意文档运行时的截图

当收件人打开该文档时,该后门程序会建议收件人启用宏。而这个恶意宏则采用了十进制ASCII代码逐个字符地进行混淆,以逃避各种杀毒软件的检测。

image003.png

文档混淆后的代码片段

去除混淆后,我们可以看到有效负载是用Perl编程语言编写的。它会从Word文档中提取theme0.xml文件。theme0.xml是一个带有0xFEEDFACE签名的Mach-O32位可执行文件,其也是该后门程序最终有效载荷。theme0.xml在执行之前会先解压到/ tmp / system / word / theme / syslogd目录。

image004.jpg

去除混淆后的Perl有效载荷

Dropper分析

Dropper用于将后门安装到受感染系统中并建立其持久性攻击机制。

image005.png

Dropper的主要功能

 Dropper的所有字符串以及后门均使用硬编码的RSA256密钥进行加密。其中,有两种形式的加密字符串:RSA256加密的字符串,以及自定义的base64编码和RSA256加密的字符串。

image006.png

硬编码的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),并写入先前确定的路径和文件。

image007.png

Dropper安装后门,将其属性设置为“hidden”,并设置随机文件的日期和时间

当Dropper安装后门时,其会将属性设置为“hidden”,并使用touch命令将文件日期和时间设置为随机值:touch -t YYMMDDMM“/path / filename”> / dev / null。与此同时,访问权限被更改为0x1ed = 755,相当于u= rwx,go = rx。

image008.png

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使进程无限期地运行。该持久性文件被设置为掩藏属性,文件的时间和日期也是随机生成的。

image009.jpg

具有持久性设置的属性列表

launchctlload /Library/LaunchDaemons/filename.plist> / dev / nul或launchctl load〜/ Library /LaunchAgents / filename.plist> / dev / nul命令使得操作系统在登录时启动生成的后门文件,随后Dropper将会删除自身。

后门分析

后门包含两个主要函数infoClient和runHandle。infoClient负责将收集到的操作系统信息发送给C&C服务器(服务器本身是恶意的),并接收来自C&C服务器的返回信息,而runHandle负责后门功能。

image010.png

后门的主要功能

 infoClient在HandlePP类中填充的变量:

image011.png

HandlePP类的变量列表

 clientID是从环境变量衍生的MD5哈希,而strClientID是clientID的十六进制表示。以下所有字符串均通过AES256和base64编码加密。HandlePP :: getClientID方法使用的是下面的环境变量:

image012.jpg

序列号

image013.jpg

硬件UUID

image014.png

MAC地址

image015.png

随机生成的UUID

 

对于初始信息包,后门还收集以下信息:

image016.png

操作系统版本

运行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.。

image017.png

Parser:: inByte方法

如果clientID等于以下字节序列B4 B1 47 BC 52 28 2873 1F 1A 01 6B FA 72 C0 73,那么这个扰码的版本就是使用第三个参数(0x10)计算的,其被当做一个DWORD来处理,每4个字节都与它进行异或,如下例所示。   

image018.png

image019.png

Parser :: inByte方法

当扰码一个字节时,扰码器首先确定字节值是奇数还是偶数。如果该值为奇数,则将该字节和一个随机生成的字节一起添加到数组中。在偶数值的情况下,首先添加随机生成的字节,然后添加该字节。在上面的例子中,第三个参数是’1’= 0x31,这是一个奇数。这意味着它将字节’1’和一个随机生成的字节添加到最终的扰码阵列。

image020.jpg

Parser:: inString方法

扰码一个字符串时,扰码器产生一个5字节长的序列。首先,它产生一个随机字节,随后是三个零字节,一个随机字节,最后是字符串长度的字节。假设我们想要混淆字符串’Mac OSX 10.12’。它的长度是13 = 0x0d,两个随机字节是0xf3和0x92。最后的5字节序列看起来像F300 00 00 92 0D,然后原始字符串与5字节序列异或。

image021.png

扰码Mac OSX 10.12

1.  加密

加密的字节序列被传递到Packet ::Packet类的构造函数中,该类创建随机AES256密钥并使用此密钥加密缓冲区。

2. 编码加密密钥

为了使C&C服务器解密和加密数据,随机生成的AES256密钥必须与加密数据一起包含在数据包中。然而,这个密钥也是通过异或操作XOR 0x13进行扰码的,随后对每个字节应用ROL 6操作。

image022.png

在输出数据包中扰码AES256密钥的函数

 扰码和加密过程中的一些屏幕截图


image023.png

灰色部分的字节表示已加密的计算机信息
image024.png

随机生成AES256密钥

image025.png

扰码的AES256密钥(0xC1异或0x13 = 0xD2,0xD2ROL 6 = 0xB4)等)

image026.jpg

使用AES256密钥加密的计算机信息

image027.jpg

发送到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屏幕截图所示:

image028.jpg

交换系统数据包信息后与C&C服务器的通信

同时,该后门程序的runHandle方法将使用以下后门命令(每个命令有一个字节长的代码并由Packet:: getCommand提取)调用requestServer方法:

image029.png

getCommand 方法

如下两个示例都创建了一个线程,每个线程负责下载和执行文件或在终端中运行命令行程序:

image030.jpg

用于下载和执行以及在终端中运行命令的命令

image031.jpg

用于上传和下载文件的命令

image032.jpg

支持的命令及其各自的代码

* 本文作者:亚信安全,转载注明来自FreeBuf

来源:freebuf.com 2018-04-28 20:00:28 by: 亚信安全

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
每个人都会有缺陷,就像被上帝咬过的苹果,有的人缺陷比较大,正是因为上帝特别喜欢他的芬芳
Everyone has its disadvantage just like the god bites the apple. the bigger disadvantage you have, the more the god appreciate it
评论 抢沙发

请登录后发表评论