一、背景
2月初,伏影实验室威胁追踪系统监测到一个使用DNS协议进行命令控制的恶意软件家族Mozart,该家族样本信息由malwarehunterteam发现,并在twitter上进行了披露。此次披露的信息包含了该恶意软件的部分攻击链,包括释放该恶意软件的JS脚本以及钓鱼使用的PDF文件。
通常,恶意软件利用DNS的递归查询机制,构造带异常长度的域名,通过解析的过程与C2服务器进行通信。而本次发现的恶意软件则利用了DNS的TXT记录,TXT记录用来保存域名的附加文本信息,TXT记录的内容可以按照一定的格式编写,也可以自定义任意内容。
DNS协议使用53端口,如不开放此端口,就无法通过域名访问网站。因此绝大多数情况下,DNS端口是持续开放状态的,这也为攻击者带来了极大的便利。
二、恶意文件分析
2.1 攻击流程
2.2 PDF钓鱼文件
该文件是通过钓鱼邮件的附件获取,其中的内容为乱码,攻击者在用红色字标注当前PDF查看器不支持当前文档的字体样式,需要点击下载获取字体样式才可以正常查看。这是一个非常典型的钓鱼攻击。
钓鱼文档
2.3 恶意JS脚本
该脚本包含在CarlitoRegular.zip中,需用户手动点击后执行,JS脚本在Windows系统中支持双击运行,自动调用cscript.exe执行该脚本,攻击者没有设置任何自动触发条件,需手动执行该文件。通过格式化JavaScript代码后可以看到,脚本将base64编码的内容解码后,写入到%temp%目录下新创建的calc.exe文件中,这一动作一方面%temp%目录不需要对权限进行处理,另一方面使用calc.exe也易于自身隐藏。
2.4 恶意二进制文件Mozart
通过JS脚本释放的恶意二进制文件命名为Mozart恶意软件,因其执行时需读写Mozart.txt文件而得名。通过读取当前文件所在目录,计算目录名长度,得到字符‘52’,与.jpg,.png,.gif进行拼接,并在%temp%目录中寻找此文件。若文件存在,则构建随机文件名命名的.bat文件,并执行。此处查询的文件在此攻击链梳理过程中并未找到源头,分析认为此处应有其他的攻击组件或针对特定目标进行的攻击。
攻击者在构建该恶意文件时,并未对C2进行加密或隐藏,以明文形式存储。接下来恶意文件在受感染机器上查找%temp%目录下是否存在Mozart.txt文件。如存在,则进入发送上线数据包的流程。如不存在,则创建该文件,并写入12345。
写入数据
Mozart.txt文件
完成上述操作后,读取当前运行的恶意文件内容,并在%Temp%目录下一个随机名称的文件,将读取的内容写入。接着在%Temp%下创建bash脚本,名称同样随机,写入内容为:
move “%TEMP%\ysyqkffeh” “%AppData%\Microsoft\Windows\Start Menu\Programs\Startup\ysyqkffeh.exe”,其中ysyqkffeh.exe即为Mozart恶意文件本体。如此即实现开机自启动的持续驻留功能。
攻击者搜集被攻击目标的计算机基础信息,包括:
- 计算机硬件信息的GUID
- 获取计算机用户名称
- 通过获取的计算机用户名称查询用的SID
将硬件GUID和用户的SID拼接后,再连缀.0以及.getid,形成上线数据包,格式为:[GUID].[SID].0.getid,通过DNS请求发送给C&C主控,此处查询TXT记录,通过该查询模式,C&C服务器能返回任意格式内容,更便于传输信息,同时也不易被检测。
DNS TXT查询请求
与C&C控制服务器建立连接后,受感染机器将向控制服务器请求任务信息。在上线成功后,C&C控制服务器会返回一个用户ID,受感染机器在发送请求任务指令时需将其拼接在指令内容的最前端,如:[ID].1.gettasksize。
C&C控制指令列表如下:
- .0.getid 获取ID
- .1.gettasksize 获取任务数量
- .1.gettask 获取任务内容
- .1(.0).reporttask 通过CreateProcessW创建任务
- 1.0.getupdates 获取更新,结果存入.txt结尾的文件
- 1.0.reportupdates 如果getupdates请求返回内容,则更新.txt结尾的文件
当获取了更新后,恶意程序会将下载的新文件复制到%AppData%\Microsoft\Windows\Start Menu\Programs\Startup\目录下,替换原有的文件,并通过CreateProcessW来启动。
三、总结
该家族的攻击手段本身并不复杂,但是其利用DNS协议建立C&C控制信道,能够有效的对一些限制性网络和添加了多种防护设备的网络进行穿透,具有较高的隐蔽性。因此我们建议应当针对异常长度的DNS请求包进行检测,以确认是否存在恶意软件利用此进行通信。
附录
YARA 规则
import "pe"
rule crime_win32_mozart_loader_1 {
meta:
description = "Detects Mozart DNS loader"
author = "@VK_Intel"
reference = "https://twitter.com/VK_Intel/status/1227234932960964609"
date = "2020-02-19"
strings:
$s0 = "\" \"%AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\" fullword wide
$s1 = "mozart.txt" fullword wide
$s2 = ".gettask" fullword wide
$s3 = ".gettasksize" fullword wide
$s4 = ".getupdates" fullword wide
$s5 = ".gettasks" fullword wide
$s6 = ".exe\" " fullword wide
$str_parser = { 55 8b ec 83 ec 08 53 56 57 8b f9 8b da 8b ?? 8d ?? ?? 66 ?? ?? 83 c6 02 66 85 c0 75 ?? 2b f1 ba 02 00 00 00 d1 fe 33 c9 8d ?? ?? f7 e2 0f 90 c1 f7 d9 0b c8 51 e8 ?? ?? ?? ?? 8b ?? 83 c4 04 89 ?? ?? 8b f0 0f ?? ?? 8d ?? ?? 66 ?? ?? 8d ?? ?? 66 85 c9 75 ?? ff ?? e8 ?? ?? ?? ?? 8b ?? ?? 83 c4 04 8b ce 8d ?? ?? 66 ?? ?? 83 c1 02 66 85 c0 75 ?? 2b ca 8b d3 d1 f9 8d ?? ?? 89 ?? ?? 66 90 66 ?? ?? 83 c2 02 66 85 c0 75 ?? 2b ?? ?? d1 fa 8d ?? ?? ba 02 00 00 00 03 c1 33 c9 f7 e2 0f 90 c1 f7 d9 0b c8 51 e8 ?? ?? ?? ?? 8b ce 8b d0 83 c4 04 89 ?? 8d ?? ?? 89 ?? ?? 66 ?? ?? ?? ?? ?? 66 ?? ?? 83 c1 02 66 85 c0 75 ?? 2b ?? ?? d1 f9 8d ?? ?? 50 56 52 e8 ?? ?? ?? ?? 83 c4 0c 8b f3 66 ?? ?? 83 c3 02 66 85 c0 75 ?? 8b ?? 2b de 83 c7 fe 66 ?? ?? ?? 83 c7 02 66 85 c0 75 ?? ff ?? ?? 8b cb c1 e9 02 f3 ?? 8b cb 83 e1 03 f3 ?? e8 ?? ?? ?? ?? 83 c4 04 5f 5e 5b 8b e5 5d c3 }
condition:
uint16(0) == 0x5a4d and filesize < 400KB and
( pe.imphash() == "8ac64056f182548e1c118c582f3c21a9" or 3 of ($s*) or
( $str_parser and 1 of ($s*) ) )
}