freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

海莲花APT组织使用最新MacOS后门程序发动攻击
2018-04-28 20:00:28

海莲花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客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者