概述
近期观察到Lazarus正在针对区块链技术和加密货币行业的各种组织,包括加密货币交易所、去中心化金融协议、游戏赚钱加密货币视频游戏、加密货币贸易公司、风险投资基金投资在加密货币中,以及大量加密货币或有价值的不可替代代币的个人持有者。
Lazarus使用各种通信平台对受害者进行社会工程学,以鼓励受害在在windows或者macOS上下载木马化的加密货币应用程序,然后攻击者使用这些应用程序访问受害者的计算机,在受害者的网络环境中传播恶意软件,并获取私钥或利用其他安全漏洞。这些活动支持发起欺诈性区块链交易的其他后续活动。
样本信息
文件名 | Md5 |
---|---|
Esilet.dmg | 53d9af8829a9c7f6f177178885901c01 |
Esilet-tmpg7lpp | 9578c2be6437dcc8517e78a5de1fa975 |
3. 详细分析
2.1 Esilet.dmg分析
该恶意程序通过macOS系统专用的磁盘映像格式dmg分发,可以通过命令hdiutil来挂载文件并提取应用程序。
执行后的界面如下,看起来像是合法的加密货币交易平台。该恶意程序声称能够实时提供加密货币价格和价格预测。
查看挂载应用的文件系统则可以发现使用了Electon框架。Electon是一个有Javascript、HTML和CSS等web技术创建的本地应用程序的GUI框架。
使用Electron打包的应用程序一般都会存在一个文件app.asar,该文件类似于tar,是一种压缩格式。
使用如下命令可以对app.asar进行解包:
1 | npx asar extract |
查看解包后的文件renderer.prod.js可以得知Esilet.dmg 執行後,会从
hxxps://esilet[.]com/update/darwin.json下载文件文件保存到macOS系统的临时目录,保存文件名为Esilet-tmpg7lpp,通过方法child_process执行下载的文件。
2.2 Esilet-tmpg7lpp分析
1. 持久化
用于持久化的plist文件被硬编码在恶意程序文件内,恶意程序执行后根据执行用户的uid来决定将plist文件保存的目录,
保存文件名为:
1 | com.applex.services.agent.agent.plist |
通过BSD API函数getuid来获取执行用户的uid, 当uid为0时属于root用户,
该用户有权限访问**/Library/LaunchDaemons目录,因此将plist文件保存到该目录。否则保存到{HomeDirectory}/Library/LaunchAgents**。
plist文件内容如下,是一个标准的LaunchAgent,通过设置RunAtLoad的值为true来确保每次用户登录时都会自动启动恶意软件。
1 |
|
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表示的含义。
1 | Cookie: |
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服务器。
恶意程序收集的信息未加密前的格式如下:
1 | Struct format{ |
获取主机名
在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下载文件并执行。 |
最后更新: 2024年01月10日 20:56:06
本文链接: http://shxi.cc/post/7427f1ce.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!