8-BitQuest
菜单
[威胁情报]

Lazarus 木马化 DeFi Wallet 投递恶意程序

· 3 分钟阅读 · @admin

Lazarus DeFi Wallet 像素封面

Lazarus 把 DeFi Wallet 安装包换成了木马。受害者运行后,程序在 %AppData%\DeFi Wallet 里释放 GoogleChrome.exe 并执行。这个文件才是后门,负责连接 C&C 并执行指令。

1 样本

文件名 MD5
DeFi Wallet.exe 0b9f4612cdfe763b3d8c8a956157474a
GoogleChrome.exe cfbe4e29da5d962099b937d7b03fa93b

2 DeFi Wallet.exe

程序先看命令行参数。个数不是 1 就退出。

参数符合预期后,在 %AppData% 下创建 DeFi Wallet 目录。

再从资源里取出 GoogleChrome.exe,写到这个目录。

然后创建进程执行它,并把 DeFi Wallet.exe 的完整路径当作参数传进去。随后用合法的 DeFi Wallet 覆盖自身再执行,把释放后门的痕迹清掉。

3 GoogleChrome.exe

后门先读配置。配置可能在注册表里,也可能在文件里。

3.1 初始化

没有配置时,用硬编码的三个地址当 C&C,并写一份新配置:

  • hxxp://emsystec.com/include/inc.asp
  • hxxp://www.newbusantour.co.kr/gallery/left.asp
  • hxxp://www.gyro3d.com/common/faq.asp

配置内容加密后存进注册表或文件。

再生成一个随机数,用来标识这台受害者机器。

同时取 cmd 的完整路径和临时目录,后面执行命令和落地文件会用到。

3.2 通信

和 C&C 通信时,从三个地址里随机挑一个作为本次服务器。

做后门操作之前先发信标。信标是硬编码的 0x60D49D94。只有响应里带这个值,才开始执行指令。

POST 正文的格式是:

jsessid={消息ID}{受害者ID}{随机值}&cookie={随机值}{随机值}{随机值}

这些字段再做一次 RC4,并做 Base64。

实际发出去的包如下。

3.3 指令

C&C 的响应决定执行哪项功能。样本能收集系统信息,也能控制受害机器。

指令 作用
0x60D49D97 用当前时间间隔写入配置
0x60D49D9F 设置和 C&C 通信的间隔
0x60D49DA0 收集系统信息
0x60D49DA2 收集文件信息
0x60D49DA3 收集正在运行的进程
0x60D49DA4 结束指定进程
0x60D49DA5 修改当前进程的工作目录
0x60D49DA6 和指定 IP 建立 socket 连接
0x60D49DA7 修改文件时间戳
0x60D49DA8 创建远程 shell,执行 Windows 命令
0x60D49DA9 安全删除文件
0x60D49DAA 用 CreateProcess 创建进程
0x60D49DAB 用 CreateProcessAsUserW 创建进程
0x60D49DAC 用 CreateProcessAsUserW 创建高完整性级别进程
0x60D49DAD 从 C&C 下载文件
0x60D49DAE 发送文件创建时间和文件内容
0x60D49DAF 把多个文件压成 cab 再发给 C&C
0x60D49DB0 统计指定目录下的文件数、子目录数和总大小
0x60D49DB1 上传当前配置
0x60D49DB2 从 C&C 取最新配置
0x60D49DB3 把配置时间设成当前时间
0x60D49DB4 休眠 0.1 秒后继续

3.4 统计目录

收到 0x60D49DB0 时,先判断路径是不是目录。不是的话,向 C&C 发一段全 0、长度 0x628 的数据。是目录则按下面的格式回传:

struct format {
    wchar_t dir_name[0x104];
    wchar_t dir_path[0x200];
    uint64_t file_create_time;
    uint32_t dirs;
    uint32_t files;
    uint64_t file_size;
};

目录属性和创建时间用 FindFirstFileW 取。

再递归遍历子目录和文件,算出文件数、目录数和占用大小。

3.5 收集文件属性

收集文件信息时,先向 C&C 要目录,再遍历里面的文件和子目录,按 file_info 数组上传。文件的属性值是 0x3E,目录是 0x3C。

struct file_info {
    uint32_t file_attr;
    uint32_t file_size_low;
    uint32_t file_size_high;
    FILETIME create_time;
    FILETIME last_write_time;
    uint32_t name_len;
    wchar_t name[1];
};

3.6 下载文件

0x60D49DAD 先从 C&C 收保存路径。创建文件失败就把错误码传回去,然后等下一条指令。成功后再分块收数据,每次最多 0x17000 字节,直到写完。写入失败时回传错误码 998,也就是无效的内存访问。

3.7 修改时间戳

0x60D49DA7 从 C&C 拿两个文件名。第一个是要改的文件,创建时间、最后访问时间和最后写入时间都取自第二个文件,用来伪装。

3.8 远程 shell

0x60D49DA8 用 CreatePipe 建匿名管道,再 CreateProcess 拉起 cmd。命令行是 cmd /c 接上 C&C 下发的命令。WaitForSingleObject 等它跑完,用 ReadFile 从管道读结果并上传。失败则上传错误码,然后结束 cmd。

3.9 创建进程

样本准备了三种创建进程的方法,按场景选用。

3.9.1 CreateProcessW

0x60D49DAA 走 CreateProcessW。STARTUPINFOW 的 wShowWindow 和 dwFlags 用来把窗口藏起来。

3.9.2 令牌

0x60D49DAB 按指令里的 Session ID 找到父进程,用 DuplicateTokenEx 做一个继承其权限的新令牌,从而创建权限相同的子进程。这通常用来提权或绕过 UAC。

接着用新令牌调用 CreateEnvironmentBlock,把环境块交给 CreateProcessAsUser。

3.9.3 高完整性 SID

0x60D49DAC 同样按 Session ID 找父进程并复制令牌,再把令牌的完整性 SID 设为 S-1-16-12288,然后用 CreateProcessAsUser 创建管理员权限的子进程。

3.10 进程列表

0x60D49DA3 遍历进程,把信息打成数组上传。每条记录是:

struct proc_info {
    uint32_t name_len;
    wchar_t name[1];
    uint32_t pid;
    uint32_t ppid;
    uint32_t domain_len;
    wchar_t domain[1];
    uint32_t session_id;
    FILETIME create_time;
};

3.11 磁盘信息

0x60D49DA1 收集逻辑分区。上传格式是:

struct volume_info {
    uint64_t total_bytes;
    uint64_t free_bytes;
    uint16_t name_len;
    wchar_t name[1];
};

struct drive_info {
    uint32_t drive_cnt;
    uint32_t drive_bitmask;
    uint32_t drive_types[26];
    struct volume_info info[1];
};

4 检测

MD5 TopEDR YARA
0b9f4612cdfe763b3d8c8a956157474a Trojan/Generic!B0902DA7C050F3CD Topsec-APT.Lazarus_APT38.NukeSped.b
cfbe4e29da5d962099b937d7b03fa93b 无 Topsec-APT.Lazarus_APT38.NukeSped.b

5 IOC

哈希:

  • 0b9f4612cdfe763b3d8c8a956157474a
  • cfbe4e29da5d962099b937d7b03fa93b

地址:

  • hxxp://emsystec.com/include/inc.asp
  • hxxp://www.newbusantour.co.kr/gallery/left.asp
  • hxxp://www.gyro3d.com/common/faq.asp

6 ATT&CK

战术 ID 名称 在这次活动里
Execution T1204.002 User Execution: Malicious File 用木马化的 DeFi Wallet 释放恶意程序
Defense Evasion T1070.004 Indicator Removal on Host: File Deletion 木马覆盖自身,再拉起合法程序清痕迹
Defense Evasion T1070.006 Indicator Removal on Host: Timestomp 修改指定文件的时间戳
Discovery T1057 Process Discovery 遍历正在运行的进程
Discovery T1082 System Information Discovery 获取 IP、计算机名、系统版本和 CPU 架构
Discovery T1083 File and Directory Discovery 遍历目录
Discovery T1124 System Time Discovery 获取系统时间
Command and Control T1071.001 Application Layer Protocol: Web Protocols 使用 HTTP 和 C&C 通信
Command and Control T1573.001 Encrypted Channel: Symmetric Cryptography 通信内容使用 RC4 和 Base64

更多文章