AppleJeus行动:Lazarus用虚假安装程序及macOS恶意软件攻击交易所(上)

一、前言

在APT领域,Lazarus(拉撒路)多年以来一直都是较为知名的一个组织。除了网络间谍及网络破坏目标以外,该攻击组织也一直盯着全世界各地的银行及其他金融公司。在过去几个月内,Lazarus已经成功攻陷了多家银行,渗透全球多家加密货币交易所以及金融科技公司。

卡巴斯基实验室一直以来都在参与协助相关事件的协助应急响应。在调查被Lazarus攻击的某个加密货币交易所时,我们意外发现了一个线索。受害者最开始时被带有木马功能的密币交易软件所感染,而该木马借助邮箱传播到目标公司内部。调查结果表明,该公司中一名警惕性不高的员工从一个貌似合法的网站上下载了一个第三方应用,公司也因此感染了Fallchill这款恶意软件,该恶意软件已经有些年头,是Lazarus最近正在使用的一款工具。目前已经有多个报告(比如US-CERT发表的研究报告)中提到Fallchill正在重现江湖。

为了确保操作系统不会导致感染失败,攻击者貌似非常努力,专门开发了适配其他操作系统的恶意软件,macOS系统也不例外。根据网站描述,适配Linux的版本也即将出炉,这貌似是我们首次看到该APT组织使用针对macOS的恶意软件。

Lazarus组织已经拓宽了他们可以攻击的操作系统列表,非Windows平台的用户应该对此有所警醒。

 

二、伪装成密币交易应用的木马

卡巴斯基实验室在端点安全软件中部署了恶意行为检测技术,因此我们可以重新组合出感染的各个阶段,并回溯到原始感染源。依靠该功能,我们发现Lazarus的某个受害者在安装了一款密币交易程序后感染了恶意软件,我们还发现用户使用电子邮件中的链接安装了该程序。

针对Windows的木马应用

如果直接在待投放的软件中嵌入恶意代码,并将其托管在某个网站上,那这种行为有点太过于明显。此次攻击者采用了较为精细的方案:木马代码以交易应用更新包的方式进行推送。

Celas网站上托管了一个Celas Trade Pro应用,这个应用貌似看上去比较正常,没有恶意行为。该应用是Celas开发的一款一体化密币交易程序。

图1. Celas Trade Pro应用

当我们开始研究此次攻击事件时,任何用户还可以从Celas网站上下载这个交易程序。检查从该网站下载的安装包后,我们确认其中存在一个非常可疑的更新程序。

图2. 安装程序下载页面

我们分析的Windows版的安装包信息如下:

MD5: 9e740241ca2acdc79f30ad2c3f50990a
文件名: celastradepro_win_installer_1.00.00.msi
文件类型: MSI安装包
创建时间: 2018-06-29 01:16:00 UTC

在安装过程的最后阶段,安装程序会立刻以CheckUpdate参数运行Updater.exe模块。这个文件看起来像个正常的工具,一般不会引起系统管理员的警觉。此外,该文件还包含一个合法的签名,该签名属于同一个厂商。

编写此代码的开发者将工程名命名为“jeus”,我们可以在PDB路径中找到这个信息,另外这个值也被当成HTTP multipart消息数据的分隔符。正是因为这一点,也因为受影响的操作系统中包括Apple macOS,因此我们将此次攻击活动称为Operation AppleJeus(AppleJeus行动)。

安装包中的恶意更新工具基本信息如下:

MD5: b054a7382adf6b774b15f52d971f3799
文件类型: MS Windows平台的PE32可执行文件(带GUI界面),Intel 80386架构
已知文件名: %Program Files%CelasTradeProUpdater.exe
链接时间: 2018-06-15 10:56:27 UTC
编译路径: Z:jeusdownloaderdownloader_exe_vs2010Releasedloader.pdb

Updater.exe的主要功能是收集受害者主机信息,并将该信息发送回服务器。恶意软件启动后会创建一个特殊字符串,格式为%09d-%05d(随机数字),该字符串用来唯一标识被感染的主机。

恶意软件会收集进程列表(不包括系统进程),从注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion路径中获取准确的操作系统版本。由于这些值只存在于Windows 10中,因此我们认为开发者可能使用Windows 10来测试这款恶意软件。

ProductName: Windows系统版本
CurrentBuildNumber: Windows 10版本号
ReleaseID: Windows 10版本信息
UBR: Windows 10子版本信息
BuildBranch: Windows 10分支信息

将信息发送给服务器之前,恶意软件会使用硬编码的XOR密钥Moz&Wie;#t/6T!2y来加密已收集的信息:

图3. 数据加密过程

恶意软件使用HTTP协议将受害者信息发送给Web服务器,对应的URL为www.celasllc[.]com/checkupdate.php

这个Web服务器是Celass LLC所属的服务器,看上去似乎非常正常。此时我们没有十足的把握断定该服务器已被攻击者攻陷,或者一开始就直接属于攻击者所有。关于该服务器的更多细节请阅读下文的“基础设施”部分。

恶意软件使用了一个硬编码的User-Agent字符串:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)multipart/form-data所使用的分隔字符串为jeus

虽然使用加密数据以及自定义的分隔字符串,但这并不证明这是恶意行为,因为合法应用也会具备这种特征。但我们发现恶意软件在发送的请求中会使用一个上下文无关的字符串get_config,也会将收集到的系统信息伪装成temp.gif文件上传,头部中还会模仿GIF图片的magic number特征,这大大引起了我们的怀疑。

图4. 与C2服务器通信

成功上传数据后,updater会检查服务器返回的响应。如果服务器返回HTTP 300响应,则代表updater需要保持待命状态。然而,如果返回HTTP 200响应,则会使用base64编码来提取载荷,并使用硬编码的RC4密钥W29ab@ad%Df324V$Yd来解密数据。解密后的数据为可执行文件,前缀为MAX_PATHjeusD字符串。

在研究过程中,我们发现还有一些相似的文件。其中一个的创建时间为8月3日,另一个为8月11日。PDB路径表明开发者一直在更新这个updater工具,根据内部目录名,这些代码都源自于2018年7月2日发布的稳定版代码。

木马样本#1 木马样本#2
安装包MD5 4126e1f34cf282c354e17587bb6e8da3 0bdb652bbe15942e866083f29fb6dd62
安装包创建日期 2018-08-03 09:57:29 2018-08-13 0:12:10
updater工具MD5 ffae703a1e327380d85880b9037a0aeb bbbcf6da5a4c352e8846bf91c3358d5c
updater创建日期 2018-08-03 09:50:08 2018-08-11 7:28:08
updater编译路径 H:DEVTManagerDLoader20180702dloaderWorkingDirOutput0000009Releasedloader.pdb H:DEVTManagerDLoader20180702dloaderWorkingDirOutput0000006Releasedloader.pdb

上表中需要注意PDB路径中的TManager目录,我们还可以在另一个地方看到这个字符串的踪影。

针对macOS的木马应用

对于macOS用户,Celas LLC同样提供了一个原生版的交易应用。安装过程中后台会安装一个autoupdater模块,并在安装完毕后立刻运行,每次系统重启时也会自动运行。该模块持续与命令控制(C2)服务器通信,下载并运行服务器派发的其他可执行文件。通信特征与Windows版的updater相匹配,上传和下载的数据会伪装成一个图像文件,内部包含经过加密的数据。

我们分析的安装文件样本信息如下:

MD5: 48ded52752de9f9b73c6bf9ae81cb429
文件大小: 15,020,544字节
文件类型: DMG磁盘映像
已知文件名: celastradepro_mac_installer_1.00.00.dmg
创建日期: 2018年7月13日

Cellas Trade Pro应用一旦安装到macOS系统中,就会在系统启动时利用名为.com.celastradepro.plist的一个文件启动Updater应用(文件名第一个字母为.,这样Finder以及默认的Terminal目录中就不能直接看到该文件)。在启动时,Updater文件使用了的参数为CheckUpdate

图5. Celas Trade Pro应用的plist(Apple Property List)文件

从代码分析的角度来看,CheckUpdate这个命令行参数貌似有点多余,因为应用程序并不接受其他任何参数。在没有输入任何参数的情况下,恶意软件不会执行任何操作,直接退出。沙盒可能会自动执行这个Updater木马,因此这有可能是欺骗沙盒的一个技巧,没有使用这个“秘密”参数就不会看到任何可疑行为。CheckUpdate之类的字符串看上去比较无害,选择这个字符串可以避免引起正在观察当前进程的用户或者管理员的警觉。

该版本的updater木马工具在很多方面与Windows版相似。这两个应用程序都使用跨平台的QT框架来实现。下载器在启动后会针对当前主机创建一个唯一的标识符,标识符格式为%09d-%06d。接下来应用会收集基本的系统信息,macOS系统上通过专用的QT类来完成该任务,收集的信息包括:

主机名

操作系统类型和版本

系统架构

操作系统内核类型和版本

该版本木马在加密和数据传输方面与Windows版完全相同。数据经过XOR加密处理,密钥为硬编码的16字节静态密钥:Moz&Wie;#t/6T!2y,前缀为GIF89a头部,通过HTTP POST请求上传到C2服务器上,所使用的URL地址为:

https://www.celasllc[.]com/checkupdate.php

图6. POST请求模板字符串

macOS版的模块使用了一个硬编码的User-Agent字符串:User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36

收到系统回复后,木马会检查服务器返回的HTTP响应代码。HTTP 300代码表明服务器没有为updater分配任务,应用会立即结束运行。如果HTTP相应代码为200,则updater会提取响应包中的数据,base64解码然后使用硬编码的RC4密钥W29ab@ad%Df324V$Yd解密数据。木马会计算解码后数据的MD5值,将该值与数据内部存储的值进行对比,以验证传输文件的完整性。随后,木马提取载荷并将其保存到一个固定位置:/var/zdiffsec,为所有用户都设置可执行权限,然后以硬编码的命令行参数bf6a0c760cc642启动载荷。显然,木马使用这种命令行参数来避免沙盒或者逆向分析技术检测到载荷的恶意行为。Lazarus组织在2016年攻击银行时也曾使用这种技术手段,到2018年,我们在调查与其有关的所有攻击活动中基本上还是都能看到这种技巧。

 

三、下载的载荷

根据卡巴斯基安全网络的分析数据,攻击者使用了前文描述的updater程序来下载恶意载荷。我们在同一个主机上发现了新创建的一个恶意文件,基本信息如下:

MD5: 0a15a33844c9df11f12a4889ae7b7e4b
文件大小: 104,898,560字节
文件类型: MS Windows平台的PE32+可执行文件(带GUI界面),x86-64架构
已知文件名: C:Recoverymsn.exe
链接时间: 2018-04-19 13:30:19

请注意这个可执行文件的大小。我们认为该文件中填充了大量垃圾数据,避免在互联网上快速下载或传输。

在研究这个恶意软件为什么会出系统中时,我们发现在启动这款恶意软件之前,系统上有一个进程会负责生成多个文件,这表明系统上有一个木马释放器(dropper)正在运行。这款恶意软件的主要功能是在系统上植入链接到多个文件的Fallchill后门。恶意软件在启动时会检查传入的一些命令行参数,恶意软件会从注册表的HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\netsvcs路径中选择一个服务名称来伪装自己,这个注册表表项中包含几十个标准系统服务名称。

恶意软件会随机选择一个服务名,以该名称作为释放出文件的文件名并注册对应的Windows服务。为便于分析,下文我们将这个服务名称为[service]。恶意软件内部引用多个文件,具体如下:

以参数形式传入的文件: 包含一个16字节密钥
msncf.dat: 经过加密的配置数据
msndll.tmp: 经过加密的Fallchill加载器
msndll.dat: 经过加密的Fallchill后门(加载器的载荷)
[service]svc.dll: Fallchill后门加载器
[service].dat: msndll.dat的副本

上述几个文件会生成最终的Fallchill后门,详细的过程如下所示:

1、 检查命令行参数是否指向16字节大小的一个文件;

2、读取命令行传入的文件。该文件内容包含一个加密密钥,我们称之为主密钥;

3、打开msncf.dat文件(配置文件)。如果文件大小等于192字节,则读取文件的内容;

4、打开msndll.tmp文件,使用主密钥进行解密;

5、创建[service]svc.dll文件,使用伪随机数填充文件内容。恶意软件使用10,240字节伪随机数据填充该文件,并且迭代循环(rand()%10 + 10240)次。这也是为什么生成的文件大小至少为104,851,000字节;

6、将16字节的主密钥拷贝到[service]svc.dll文件的末尾;

7、使用主密钥加密[service].dat文件名,并将其拼接到[service]svc.dll的末尾;

8、将解密后的msndll.tmp覆盖到[service].dat文件的开头处;

9、移动msndll.dat文件为[service].dat

10、删除msndll.tmpmsncf.dat以及msndll.log临时文件;

11、为[service]svc.dll以及[service.dat]文件打上时间戳;

12、将[service]svc.dll注册为Windows服务;

13、将msncf.dat文件中的数据复制一份保存到注册表的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\TaskConfigs\Description键值中。

图7. 感染流程示意图

Fallchill后门加载器

我们已确认攻击者使用如上步骤在目标主机上创建了如下恶意软件,具体信息分别如下:

1、Fallchill后门加载器:

MD5: e1ed584a672cab33af29114576ad6cce
文件大小: 104,878,356字节
文件类型: PE32+可执行文件(DLL)(控制台模式),x86-64架构,MS Windows平台
已知文件名: C:Windowssystem32uploadmgrsvc.dll
链接时间: 2018-01-18 01:56:32

2、经过加密的Fallchill后门:

MD5: d8484469587756ce0d10a09027044808
文件大小: 143,872字节
文件类型: 加密数据
已知文件名: C:Windowssystem32uploadmgr.dat

在启动时,uploadmgrsvc.dll会读取自身可执行文件末尾处的276个字节数据,其中前16个字节作为加密密钥来使用,剩余的260个字节包含后门所使用的加密文件路径。

图8. 加载器文件末尾的数据结构

解密末尾的260个字节后,恶意软件会提取出包含真正后门数据的文件名或文件路径,该文件包含的数据经过加密处理。

图9. 加载器模块末尾解密后的文件名

恶意软件读取这个文件,使用同样的加解密方法解密文件内容。这也是加载器如何在内存中加载并执行后门代码的具体方式。内存中经过解密的最终载荷的元信息如下所示:

MD5: d7089e6bc8bd137a7241a7ad297f975d
文件大小: 143,872字节
文件类型: PE32+可执行文件(DLL)(GUI模式),x86-64架构,MS Windows平台
链接时间: 2018-03-16 07:15:31

我们将Fallchill后门的加载过程总结如下:

图10. Fallchill后门加载过程

前面提到过,最终载荷属于Lazarus APT组织曾经使用过的Fallchill恶意软件家族。在启动时,恶意软件会在运行时解析API函数地址,从安装过程中创建的注册表路径(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\TaskConfigs\Description)中读取C2服务器地址。

如果该路径中不包含任何配置信息,则恶意软件会使用默认的C2服务器地址:

196.38.48[.]121
185.142.236[.]226

这是一个全功能版本的后门,包含足够多的函数来完全控制被感染的主机。木马的部分网络协议命令如下所示:

命令ID 描述
0x8000 将当前时间及配置数据写入注册表
0x8001 发送配置数据
0x8002 替换特定注册表键值中的配置数据
0x8003 执行Windows命令,将结果存储在临时文件中并上传至C2服务器
0x8006 显示当前的工作目录
0x8007 修改当前的工作目录
0x8008 收集进程信息
0x8009 结束进程
0x8010 启动新进程
0x8011 以当前用户的安全上下文创建进程
0x8012 连接特定的主机/端口
0x8013 获取磁盘信息
0x8014 罗列目录
0x8015 搜索文件
0x8019 将数据写入特定文件中
0x8020 读取特定文件的内容并上传到C2服务器
0x8021 将多个文件压缩成一个临时文件(文件名以ZD开头)并上传到C2服务器
0x8023 擦除特定文件
0x8025 复制另一个文件的时间信息(时间戳)
0x8026 关闭恶意软件服务并自销毁
0x8043 将“Not Service” unicode字符串发送给C2服务器(可能是用来测试通信)

这些功能对Lazarus的许多后门来说非常正常,在过去几年内针对银行以及金融行业的攻击事件中我们已经看到过类似的功能。

(完)