一、前言
FortiGuard实验室最近捕获到了借助Microsoft Word文档传播的新款恶意软件样本,经过快速研究,我发现这是Agent Tesla间谍软件的一款新型变种。去年6月份时我曾经分析过这种间谍软件的另一个样本,发表过一篇分析文章。在本文中,我想与大家分享一下这款变种的新增功能。
这款恶意软件借助Microsoft Word文档进行传播,文档中内嵌了一个exe文件。当用户打开Word文档时,可以看到如下信息:
图1. 打开恶意Word文档
如上图所示,文档要求用户双击蓝色图标,启用“清晰视图”。一旦用户被误导,恶意文档就会从内嵌的对象中提取出一个exe文件,将其释放到系统的临时目录中,然后运行这个程序。在本文分析的样本中,这个exe文件名为POM.exe
。
图2. 在临时目录中创建的POM.exe
二、分析POM.exe
图3. 使用分析工具观察POM.exe
在图3中,我们可以看到恶意软件的开发语言为MS Visual Basic。根据我的分析,这是一种安装程序。当程序运行时,会将两个文件(filename.exe
以及filename.vbs
)释放到%temp%subfolder
目录中。程序会在运行filename.vbs
后自动退出,filename.vbs
的具体内容如图4所示:
图4. filename.vbs具体内容
为了在系统启动时能自动运行,恶意脚本会将自己以启动程序形式添加到系统注册表中,然后再运行%temp%filename.exe
。
图5. 恶意软件将自身添加到系统注册表的RunOnce
键值中
三、分析filename.exe
与其他大多数恶意软件类似,filename.exe
启动时会创建具有相同名称的、处于挂起状态的子进程来保护自己,然后从程序的资源区中提取一个新的PE文件,覆盖子进程的内存空间,完成这些步骤后再恢复子进程的执行流程。恶意软件通过这种方式来执行新PE文件代码,新PE文件是该恶意软件的主要组成部分。
图6. 恶意软件检查mscorjit.dll模块是否已加载
接来下继续分析一下子进程。子进程首先会检查Cor_Enable_Profiling
环境变量是否设置为1、mscorjit.dll
以及clrjit.dll
模块是否已加载(如图6所示)。如果上述条件满足其一,则会直接退出运行,不做任何处理。目前为止我并不清楚恶意软件为何这么做,可能是想规避某些东西。
如果进程没有退出执行,则会加载一个指定的资源。该资源名称为__
,解码自一个本地变量。随后,进程会调用FindResource
以及LoadResource
API函数,将资源数据读取到进程的内存空间中。我们可以使用CFF Explorer工具查看__
资源,如图7所示。直接查看的话,我们发现这段数据经过加密处理。
图7. 经过加密处理的__
资源
解密__
数据后,我们可以得到另一个PE文件,这是一个.Net程序,会被恶意软件加载到子进程内存空间中。恶意软件会根据PE文件头信息,将.Net程序的区段(section)数据读入内存中,导入.Net程序导入表中定义的API,重新定位_CorExeMain
函数的偏移,然后调用多个API来构建.Net运行环境。最后,恶意软件会跳转到.Net程序的入口点,然后再跳转到_CorExeMain
函数(这是所有.Net程序的入口点)来执行这个.Net程序。如图8所示,我们可以了解到恶意软件如何跳转到_CorExeMain
函数:
图8. 跳转到.Net程序的入口点
为了进一步分析这个.Net程序,我从子进程的内存空间中提取出相应数据,将其导出为一个本地文件。这样我就可以直接运行这个程序,无需依赖于这个子进程。我也可以将其载入.Net程序分析工具中,分析起来更加方便。
四、深入分析.Net程序
导出文件的PE头并不正确,我手动修复了头部信息,使程序能够被正确执行、调试以及被.Net程序分析工具分析。使用分析工具分析这款.Net程序后,我们可以看到程序的主函数,如图9所示:
图9. .Net程序的主函数
大家可能会注意到一点,该程序采用了代码混淆技术,试图增加代码分析的复杂度。在下文中,我修改了某些方法、类、变量等的名称,以便大家更好地理解程序代码。
.Net程序中的所有常量字符串都经过编码处理,保存在一个大型缓冲区中,每个字符串都对应一个具体的索引值。如果程序需要使用某个字符串,则会使用字符串索引来调用某个函数,以获取正确的字符串。如果字符串经过编码处理,则会递交给另一个函数进行解码。在图10中,我们可以看到程序将大型字符串读入一个大缓冲区中(Pkky9noglfauhKN1Fjq.QOZ4uWBaWw
)。
以XtL6rF5GoidQVxdCxi.R6ybT342I(Pkky9noglfauhKN1Fjq.Y3LpEpC6nY(3172));
为例,其中3172
为字符串的索引,Pkky9noglfauhKN1Fjq.Y3LpEpC6nY
函数会从大缓冲区的3172
索引处提取处字符串,在这个样本中,该字符串为hyNN5z+7qAsS695lDXLuHg==
。
解码函数为XtL6rF5GoidQVxdCxi.R6ybT342I
。解码完毕后,我们可以得到一个字符串Truex00x00x00x00x00x00x00x00
,即True
。
图10. 从大缓冲区中读取字符串
主函数被调用时,会先调用Thread::Sleep()
函数休眠15秒,这样有可能会绕过沙箱检测技术。
在我前一篇分析博客中,Agent Tesla是一款间谍软件。该软件会监控并收集受害者的键盘输入、系统剪贴板、屏幕截图信息,也会收集已安装的各种软件的凭据。为了完成这个任务,该软件会在主函数中创建许多线程以及计时器函数。到目前为止,根据我的分析这款变种与老版本恶意软件类似。由于我并没有发现特别多的变化点,因此本文不会详细讨论这方面内容,如有需要大家可以回头看前一篇文章。
然而,该样本将数据提交给C&C服务器的方式有所改变。之前的样本采用HTTP POST请求将收集到的数据发送给服务器,现在这款变种使用的是SMTPS协议,将收集到的数据发送给攻击者的电子邮箱。
根据我的分析,恶意软件在SMTP方法中用到了多种命令,包括“Passwords Recovered(密码恢复)”、“Screen Capture(屏幕截图)”以及“Keystrokes(键盘记录)”等。恶意软件通过电子邮件的“Subject(主题)”字段来识别具体命令。比如:
“System user name/computer name Screen Capture From: victim’s IP”
举个例子,我们来看一下恶意软件如何将收集到的凭据信息发送给攻击者的邮箱地址。比如,恶意软件会将我的主机信息以及收集到的凭据信息添加到邮件内容中,如图11所示。恶意软件启用SSL功能,使用了TCP 587端口。邮件的“Body”字段为收集到的数据,采用HTML格式。“Subject”字段包含“Passwords Recovered”命令,这样收件人就能理解该邮件包含一些凭据信息。
图11. 包含已收集数据的电子邮件
攻击者注册了免费的zoho邮箱账户以收取受害者的凭据信息。如图12所示,我们可以看到相应的SMTP服务器以及登录信息,包括攻击者的SMTP “UserName(用户名)”以及“Password(密码)”。
图12. 攻击者的SMTP凭据
当邮件发送时,我们可以使用Wireshark工具捕捉到相应的数据包,如图13所示。
图13. 使用SMTPS协议提交收集到的数据
前面提到过,邮件正文所包含的数据采用HTML格式。我将这段内容拷贝到一个html文件中,使用IE浏览器打开该文件,观察恶意软件从我的测试环境中具体收集了哪些信息,我发现其中包括主机信息以及IE浏览器的凭据信息。
五、守护程序
恶意软件也会从.Net程序的Player
资源区中提取一个守护程序,释放到%temp%
目录中,避免filename.exe
结束运行。
图14. 释放并运行守护程序
守护程序的名称包含3个随机字母,如图14所示。该程序也是一个.Net程序,主要目的非常简单明确。在分析工具中,我们可以看到守护程序的完整代码,如图15所示。
图15. 守护程序代码
从上图可知,守护程序的主函数接受一个命令行参数(对于该样本,这个参数为filename.exe
的完整路径),将其保存到filePath
这个字符串变量中,然后在线程函数中每隔900毫秒检查一次filename.exe
是否正在运行,一旦filename.exe
结束运行则再次启动这个程序。
六、解决方案
FortiGuard反病毒服务已经将PPSATV.doc
恶意文档标记为W32/VBKrypt.DWSS!tr
,将POM.exe
标记为W32/VBKrypt.DWSS!tr
。
此外,我们也向Zoho通报了此次Agent Tesla攻击活动中所使用的恶意邮箱账户。
七、IoC
样本SHA256值如下:
PPSATV.doc
13E9CDE3F15E642E754AAE63259BB79ED08D1ACDA93A3244862399C44703C007
POM.exe
A859765D990F1216F65A8319DBFE52DBA7F24731FBD2672D8D7200CC236863D7
filename.exe
B4F81D9D74E010714CD227D3106B5E70928D495E3FD54F535B665F25EB581D3A
使用随机名称的守护程序
C2CAE82E01D954E3A50FEAEBCD3F75DE7416A851EA855D6F0E8AAAC84A507CA3