概要
2019年1月开始,思科Talos开始跟踪一系列间谍软件的分发活动,攻击者所用到的恶意软件一般是耳熟能详的Agent Tesla、Loki-bot等,通过定制dropper将最终恶意软件注入到公共进程中,一旦感染成功,便能从多类浏览器或邮件客户端中窃取用户信息。
这些注入技术并不新鲜,早就存在多年了,但随着攻击者在感染链上的改进,传统的反病毒系统也很难检测到嵌入的恶意软件。在本文中,我们将介绍其中一起行动,攻击者是如何利用dropper在不同阶段隐藏恶意软件的。
任何互联网用户都有可能成为这类恶意软件的目标,如果遭到感染,自己的隐私就有可能完全暴露在攻击者面前。
技术概述
此次活动以典型的钓鱼邮件的方式开展:
图1.钓鱼邮件
邮件附件是一个ARJ文件。ARJ是20世纪90年代早期的一种存档格式,经常用于盗版软件中,它可以将存档文件分割成多个较小的文件,使得文件更容易通过拨号连接共享。利用这种老旧的存档格式有可能绕过薄弱的电子邮件安全网关。
在本例中,此ARJ存档没有拆分成多个文件,而是仅包含一个名为“ IMP_Arrival Noticedoc.exe”的可执行文件。
Dropper
可执行文件是经过编译的AutoIt脚本,由UPX加壳,在编译之前有做混淆处理。图2显示了脚本的反编译结果。
图2 .AutoIT脚本的反编译版本
图3和图4显示了AutoIt脚本的去混淆版本,它在一开始就带有一些反虚拟机(VM)检查。这种检查是非常符合AgentTesla特色的,经常可以在AgentTesla分发活动第一阶段dropper中看到这类检查。
图3 .去混淆后的AutoIT脚本的开头部分
图4 .去混淆AutoIT脚本的VM检查
如果没有检查到什么,那么它将对移交给DecodeDataFromPEResourceOrString函数的第一个参数($data)中的字符串进行资源字体类型(8)的解码和提取(图7)。在GetResourcesFromPE函数(图6)中,该参数被转换为一个字符串,并划分为不同的字体资源名称,结果是一个字符串列表,顺序如下:
1.SystemPropertiesDataExecutionPreventionM
2.Windows.Media.BackgroundPlaybackK
3.windeployL
4.LaunchWinAppX
5.ccaF
6.CellularAPIQ
7.MuiUnattendE
8.RmClientE
9.ucsvcG
10.refsutilV
11.SpeechRuntimeV
12.DPTopologyAppv2_0N
然后从PE资源中提取这些字体类型资源,并连接到一个二进制大文件。
图5 .IMP_Arrival Noticedoc.exe的资源部分
图6 .GetResourcesFromPE函数
结果同样存储在$ data变量中(图7中的第245行),第246行的StringReverse(BinaryToString($ data))反转了存储字节的顺序。这是RC4加密形式的最终恶意软件payload。变量$ sopcode包含RC4代码的字节。在准备好shellcode和加密的payload数据之后,在第262行执行RC4函数并解密payload。
图7 .DecodeDataFromPEResourceOrString RC4函数
下图显示了反汇编的RC4 shell代码:
图8 . RC4函数($ opcode变量)
解密payload后,脚本将调用最后的InjectPayloadIntoProcess函数将payload注入另一个进程中,还提供了九种不同的合法注入选项,攻击者通过向函数提供相应的编号来选择使用哪个。
图9.注入进程选择
在本例中,攻击者选择了第一个选项——RegAsm.exe来隐藏payload。图10的所示的第211行准备本地注入shellcode($ a5_local_shellcode)并执行。如上所述,代码最终将payload隐藏在选定的合法进程内部,解码后的payload将作为最后一个参数($ a4_payload_code)移交给注入的shellcode。
图10 .AutoIT脚本的流程注入代码
AutoIT脚本还有几个在此活动中没有使用的附加函数,这些函数用于以下任务:
·将文件写入TEMP目录并执行。
·从互联网下载文件并执行。
·通过命令行执行脚本。
·特权升级。
每次行动中的AutoIT脚本是非常相似的,不同之处在于payload的构建方式,一些脚本从资源部分提取payload,还有一些脚本将加密payload存储在AutoIT脚本内部的大字符串中(图11)。图7中所示的解码函数也是没什么变化,$ rt参数设置为-1,意味着GetResourcesFromPE函数(图6)除了返回$ data变量的未修改内容(即图11中$ payload变量的内容)之外不执行任何操作。
图11.基于长字符串的AutoIT脚本开头
脚本的Injection部分也差不多,图12显示了另一个脚本的示例。
图12.基于长字符串的AutoIT脚本注入部分
Payload
在这些行动中,注入的payload大多是AgentTesla的混淆版本。AgentTesla能够从大多数浏览器、电子邮件客户端、SSH / SFTP / FTP客户端和其他软件中窃取凭据,再通过SMTP,FTP和HTTP滤出信息。本例中仅使用了SMTP。此版AgentTesla未被de4dot检测到有任何混淆,一些函数相较传统版本进行了稍微的修改或重新排序,但是其中大多数函数可能还是由混淆器完成的。
图13. AgentTesla
它在运行时解析配置设置和可疑字符串,图10中所示的函数是在可执行的静态类构造函数(.cctor)中实现的。解密某些大型数组用到了Rijndael算法,偏移量是根据传递给函数的整数来选择的。在屏幕截图的右侧,可以看到紫色的数组部分的长度。
图14. Agent Tesla解码例程
下图显示了运行时的使用情况,例如解码某些参数以将电子邮件滤出。
图15 .Agent Tesla字符串混淆
该函数的完全去混淆的版本如下所示:
图16 . Agent Tesla email函数(已去混淆)
这就是典型的AgentTesla函数。值得注意的是,混淆器似乎是为此版Agent Tesla定制的。看起来像是混淆原始代码同时填充变量。在本例中包含但从未使用过的函数中,甚至在一些使用过的函数中,一些硬编码字符串用变量(如%filename%)填充。
图17.混淆器变量
结论
这起攻击行动是恶意软件逃避检测机制的另一个例子。攻击者使用了复杂的dropper和好几种不同的混淆技术,将原始恶意软件隐藏在dropper中,恶意软件只会在运行时解密并注入内存,而在硬盘上则永远不会解密,令反病毒程序很难以检测。即使是那些大名鼎鼎的恶意软件,也能通过这种方式成功潜入。