8-BitQuest
菜单
[威胁情报]

TraderTraitor:朝鲜国家赞助的 APT 瞄准区块链公司

· 2 分钟阅读 · @admin

TraderTraitor:朝鲜国家赞助的 APT 瞄准区块链公司 像素封面

  近期观察到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下载文件并执行。

更多文章