TraderTraitor:朝鲜国家赞助的 APT 瞄准区块链公司
· 2 分钟阅读 · @admin

近期观察到Lazarus正在针对区块链技术和加密货币行业的各种组织,包括加密货币交易所、去中心化金融协议、游戏赚钱加密货币视频游戏、加密货币贸易公司、风险投资基金投资在加密货币中,以及大量加密货币或有价值的不可替代代币的个人持有者。 Lazarus使用各种通信平台对受害者进行社会工程学,以鼓励受害在在windows或者macOS上下载木马化的加密货币应用程序,然后攻击者使用这些应用程序访问受害者的计算机,在受害者的网络环境中传播恶意软件,并获取私钥或利用其他安全漏洞。这些活动支持发起欺诈性区块链交易的其他后续活动。
样本信息
| 文件名 | Md5 |
|---|---|
| Esilet.dmg | 53d9af8829a9c7f6f177178885901c01 |
| Esilet-tmpg7lpp | 9578c2be6437dcc8517e78a5de1fa975 |
3. 详细分析
2.1 Esilet.dmg分析
该恶意程序通过macOS系统专用的磁盘映像格式dmg分发,可以通过命令hdiutil来挂载文件并提取应用程序。
{% asset_img 47e76d051067a5463fc12595faf3c895.png example %}
执行后的界面如下,看起来像是合法的加密货币交易平台。该恶意程序声称能够实时提供加密货币价格和价格预测。

查看挂载应用的文件系统则可以发现使用了Electon框架。Electon是一个有Javascript、HTML和CSS等web技术创建的本地应用程序的GUI框架。

使用Electron打包的应用程序一般都会存在一个文件app.asar,该文件类似于tar,是一种压缩格式。

使用如下命令可以对app.asar进行解包:
npx asar extract
/Volumes/Esilet/Esilet.app/Contents/Resources/app.asar /Users/ken/Desktop/unpacked
查看解包后的文件renderer.prod.js可以得知Esilet.dmg 執行後,会从
hxxps://esilet[.]com/update/darwin.json下载文件文件保存到macOS系统的临时目录,保存文件名为Esilet-tmpg7lpp,通过方法child_process执行下载的文件。

2.2 Esilet-tmpg7lpp分析
1. 持久化
用于持久化的plist文件被硬编码在恶意程序文件内,恶意程序执行后根据执行用户的uid来决定将plist文件保存的目录, 保存文件名为:
com.applex.services.agent.agent.plist
通过BSD API函数getuid来获取执行用户的uid, 当uid为0时属于root用户, 该用户有权限访问**/Library/LaunchDaemons目录,因此将plist文件保存到该目录。否则保存到{HomeDirectory}/Library/LaunchAgents**。

plist文件内容如下,是一个标准的LaunchAgent,通过设置RunAtLoad的值为true来确保每次用户登录时都会自动启动恶意软件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plistversion="1.0">
<dict>
<key>Label</key>
<string>com.applex.services.agent.agent</string>
<key>ProgramArguments</key>
<array>
<string>/Users/user/Desktop/Esilet-tmpg7lpp</string>
<string>daemon</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
2. C&C指令
2.1 初始化C&C连接
通过分析反编译的代码,恶意程序应该预备了10个C&C地址用于通信,但是实际上只使用了三个地址。

如果macOS系统在连网的使用使用了代理,则与C&C通信的时候也使用代理来连接。通过执行shell命令networksetup来查看所有的网络服务,并从其输出的结果解析出使用的代理地址和端口。

恶意程序还硬编码了一些USER_AGENT列表,在首次与C&C进行连接的时候随机从列表中挑选一个。

生成随机数作为索引从C&C地址列表中选择一个作为当前使用的C&C地址然后发送握手包进行验证。

2.2 C&C通信方式
恶意程序主要通过libcurl来实现C&C通信,使用的协议为HTTP或者HTTPS。

与其他的恶意程序不同,该样本使用HTTP请求头的的cookie字段作为标识符来标记受害者。该cookie 被设计为看起来像一个标准的 Google Analytics cookie。

Cookie伪装为Google Analytics使用的cookie格式,使用的cookie格式如下,可以看出关键数据被混在一堆随机数中,通过网络抓包工具很难分析该cookie表示的含义。
Cookie:
_ga=GA1.%d.%02d%d%d%02d.%d%05d%04d;gid=GA1.%d.%02d%d%03d.%d%05d%04d
_ga=GA1.<1>.<2><3><4><5>.<6><7><8>;gid=GA1.<1>.<9><10><11>.<6><7><8>
其中每一位表示的值如下:
1 = rand % 10
2 = rand % 100
3 = 准备好接收第一条指令则为1,否则为0
4 = sessionID
5 = rand % 100
6 = rand % 10
7 = rand % 100000
8 = rand % 10000
9 = rand % 100
10 = 如果是握手包则为8678,否则是1879
11 = rand % 1000
2.3 发送或接收数据
恶意程序发送到C&C的数据主要使用post方式,发送到C&C服务器的数据和从C&C接收的数据均为加密状态,加密使用的密钥为硬编码在文件内的数据经过一些运算计算后得出。 恶意程序使用两个密钥,一个用于解密接收的数据和一个用于加密post发送的数据,从反编译后的代码可以看出,两者使用相同的密钥来加解密。

两者加解密方式一样,都是通过异或前面生成的密钥来加解密。

2.4 文件下载
主要功能为从C&C下载文件,执行的操作有点复杂,每隔阶段都需要向C&C服务器发送消息,比如创建文件成功或失败、文件大小等。 首先解密从C&C接收的参数fileSize,解密成功后创建文件,如果文件已经存在则打开文件。
使用函数fstat获取文件大小来确定文件已经下载了多少,如果文件没下载完则C&C服务器通将该文件大小作为文件偏移,然后下发该文件偏移后续的文件内容,通过这种方式实现文件续传。
发送post数据告知C&C服务器文件创建或打开成功,等待其下发要下载文件的数据。

分段下载文件数据,每次最大下载0x40000大小的文件数据,下载完后发送指令0x3b6669告知C&C服务器下载成功然后接收剩余的文件数据。

2.5 通过URL下载文件
不同于节2.3的文件下载, 该指令是从C&C服务器接收下载地址然后再本地下载文件。

解密从C&C服务器接收的下载指令的参数下载链接和保存路径,利用该libcurl库来下载文件。

2.6 获取系统信息
从受害者电脑上收集主机名、用户名和操作系统版本号等信息加密后上传到C&C服务器。

恶意程序收集的信息未加密前的格式如下:
Struct format{
Uint32_t random;//随机值
Uint32_t unkonw1;
Uint32_t unkonw2;
Char host_name[250];
Char user_name[250];
Uint32_t ipAddr;
Uint32_t majorVersion;
Uint32_t minorVersion;
Uint32_t buildVersion;
Uint32_t unkonw3; //默认为0x20,可能是指操作系统为32位
}
获取主机名
在macOS系统中,由于系统实现机制的原因,并没有提供sysctl命令,但是我们能够使用BSD API函数sysctl来获取系统信息。如下图所示使用函数sysctl来获取主机名。

获取用户名
通过函数getuid和getpwuid来获取指定uid的用户的passwd结构,该结构中的字段pw_name为当前登录用户。

获取系统版本号
恶意程序调用函数popen来执行shell命令,这里执行sw_vers来获取macOS操作系统的版本号。

2.7 发送心跳包
以大小为212,内容为0的数据作为心跳包发送C&C服务器告知其恶意程序是否存活。

2.8 命令执行
恶意程序实现两种版本的shell命令执行功能,两者的区别就是执行命令后是否需要将执行结果上传到C&C服务器。
不返回执行结果
通过函数fork创建一个子进程,然后该进程通过函数execv来执行shell命令。

当shell命令执行成功时发送指令0x3B3009到C&C服务器,否则发送0x3B2A08。

返回执行结果
由于命令是通过子进程来执行的,因此需要使用函数pipe创建描述符,通过描述符来进行不同进程之间的通信,即将命令执行后的结果从子进程传到父进程。

发送指令0x3b3009告知C&C服务器已经执行命令并等待其派发下一阶段指令。

当下发的指令为0x3B3009时等待子进程执行shell命令结束然上传命令执行后的结果。恶意程序使用函数read从描述符中读取命令执行结果然后分块上传,分块大小为0x40000。

4. IOC
applex.services.agent hxxps://sche-eg.org/plugins/top.php hxxps://www.vinoymas.ch/wp-content/plugins/top.php hxxps://infodigitalnew.com/wp-content/plugins/top.php
5. ATT&CK矩阵
| Tactic | ID | Name | Description |
|---|---|---|---|
| Execution | T1059.004 | Command and Scripting Interpreter: Unix Shell | 通过函数popen函数执行shell命令获取网络信息 |
| T1204.002 | User Execution: Malicious File | 诱导用户执行恶意程序 | |
| Persistence | T1547.015 | Boot or Logon Autostart Execution: Login Items | MacOS通过plist文件创建LoginItems自启动项 |
| Command and Control | T1071.001 | Application Layer Protocol : Web Protocols | 使用http或者https进行C&C通信 |
| T1573.001 | Encrypted Channel: Symmetric Cryptography | 使用异或的方式加解密C&C通信数据 | |
| T1008 | Fallback Channels | 使用三个C&C地址。 | |
| T1105 | Ingress Tool Transfer | 从C&C下载文件并执行。 |

