Lazarus 木马化 DeFi Wallet 投递恶意程序
· 3 分钟阅读 · @admin

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.asphxxp://www.newbusantour.co.kr/gallery/left.asphxxp://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
哈希:
0b9f4612cdfe763b3d8c8a956157474acfbe4e29da5d962099b937d7b03fa93b
地址:
hxxp://emsystec.com/include/inc.asphxxp://www.newbusantour.co.kr/gallery/left.asphxxp://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 |

