使用复杂的隐藏技术:深入分析QBot恶意活动(一)
2020-06-24 12:00:00 Author: www.4hou.com(查看原文) 阅读量:297 收藏

一、概述

受影响的平台:Microsoft Windows

受影响的范围:Windows 用户

影响:从受害者的计算机收集敏感信息

严重程度:高

QBot,也称为QakBot,是一种已经活跃多年的木马。最初,该木马被称为金融恶意软件,旨在通过窃取用户的凭据和键盘输入,以针对政府和企业进行金融敲诈。威胁研究人员发现该木马通过网络钓鱼活动或其他恶意软件(例如Emotet)的方式实现分发。

最近,FortiGuard Labs在野外捕获了一个MS Office Word文档,该文档传播了一个QBot变种。通常情况下,此类Word文档仅仅会以网络钓鱼电子邮件的方式提供,并欺骗受害者打开该文档。但遗憾的是,我们仅仅捕获了Word文件,所以并不知道它是如何传递的。

我们对该恶意文件展开了深入分析,发现QBot会使用复杂的技术和精心设计的框架,隐蔽地在受害者的系统上运行。在这篇文章中,我们将详细分析它在受害者主机上的工作方式以及使用的技术。

二、恶意Word文档分析

与一般的恶意文档相同,在恶意Word文档中包含一个恶意宏。我们在Word程序打开文件后,它会要求受害者单机一个黄色的按钮,如下图左侧所示。而下图右侧展示了单击“Enable Content”(启用内容)后的样式,它会欺骗受害者以为正在努力加载数据。

在Word程序中打开Word文档:

picture1.png

但是,实际上,恶意宏(VBA代码)会在后台执行。它包含一个名为Document_Open()的函数,该函数在打开文件时自动被调用。

宏会在C:\Users\Public\中创建一个名为tmpdir的文件夹。然后,它尝试将QBot Payload下载到该文件夹中。攻击者将QBot Payload文件放在五个位置,分别是:

hxxp://pickap[.]io/wp-content/uploads/2020/04/evolving/888888[.]png
hxxp://decons[.]vn/wp-content/uploads/2020/04/evolving/888888[.]png
hxxp://econspiracy[.]se/evolving/888888[.]png
hxxp://enlightened-education[.]com/wpcontent/uploads/2020/04/evolving/888888[.]png
hxxp://kslanrung[.]com/evolving/888888[.]png

在这里,会使用PowerShell代码从5个Base64编码的字符串中解码URL。在执行过程中,恶意软件向受害者展示了上图中所展示的内容(右侧图片)。

PowerShell代码在一个循环中选择五个URL之中的一个,以将Payload文件888888.png(实际为EXE文件)下载到C:\Users\Public\tmpdir\。然后,将该文件重命名为file*.exe,该文件最终被执行。在下载第一个Payload文件后,它将停止循环。其中,文件名使用的“*”符号可以是1、2、3、4或5。在我们分析的场景中,下载的Payload文件名称为“file1.exe”。

下图展示了恶意宏解码后的PowerShell代码,这段代码用于下载QBot Payload文件。

用于下载并执行QBot Payload的PowerShell代码:

picture2.png

查看上述这5个URL,我们会注意到,它们使用的都是相同的网站框架,该网站框架上可能存在允许使用PNG作为扩展名上传EXE文件的漏洞。

三、执行下载的Payload

下载的file1.exe是使用加壳程序保护的Payload。在启动时,加壳程序会将受保护的QBot提取到内存中,然后覆盖加壳程序的代码。在完成后,将会调用其注入点。

QBot提供了一些命令行参数,例如/C、/W、/I、/P、/Q等等,以执行不同的功能。当由PowerShell代码启动时,不会使用任何参数,因此就会转到无参数的分支,首先使用命令行参数/C生成自身的正常子进程。下图展示了要使用该命令行参数创建子进程的过程。

生成带有/C参数的子进程:

picture3.png

/C功能用于检查其是否在分析环境中运行,以下是它执行该检测的方式。

1、使用关键字VMXh执行ASM代码,如果它在虚拟机中,则会在其中触发异常。异常处理程序可以捕获异常并返回1,否则将返回0。下面是ASM代码片段。

[…]
.text:00403452                 push    ebx
.text:00403453                 push    ecx
.text:00403454                 push    edx
.text:00403455                 mov     dx, 5658h
.text:00403459                 mov     ecx, 564D5868h  ;; "VMXh".
.text:0040345E                 mov     eax, ecx
.text:00403460                 mov     ecx, 14h
.text:00403465                 in      eax, dx
.text:00403466                 mov     [ebp+var_1C], eax
.text:00403469                 pop     edx
.text:0040346A                 pop     ecx
[…]

2、通过调用API函数SetupDiEnumDeviceInfo()来枚举设备信息,以检查其是否正在虚拟机环境中运行。然后,它检查设备信息中是否包含以下文本,这些文本都是虚拟机软件的关键字,例如:“VMware”、“VirtualBox”、“CwSandbox”、“Red Hat Virtualization”、“QEMU”等。

"VMware Pointing", "VMware Accelerated", "VMware SCSI", "VMware SVGA", "VMware Replay", "VMware server memory", "CWSandbox", "Virtual HD", "QEMU", "Red Hat VirtIO", "srootkit", "VMware VMaudio", "VMware Vista", "VBoxVideo", "VBoxGuest", "vmxnet", "vmscsi", "VMAUDIO", "vmdebug", "vm3dmp", "vmrawdsk", "vmx_svga", "ansfltr", "sbtisht"

3、检查是否运行任何分析工具,例如“VMware Tools Service”、“ VMware Activation Helper”、“Metasploit Metsvc Backdoor”和“Windump”,其进程名称分别为“vmtoolsd.exe”、“vmacthlp.exe”、“metsvc-server.exe”和“windump.exe”。

4、通过确定是否已加载特殊的DLL文件以及当前进程名称中是否包含字符串“sample”、“mlwr_smpl”或“artifact.exe”,来确定当前进程是否正在Sandboxie中运行。这样做的目的是因为某些沙箱工具可能会将样本文件名更改为这些。

5、除上述方法外,还会通过调用ASM指令cpuid来检查CPU信息。

在检测过程中出现的常量字符串将会被解密。实际上,在默认情况下,不仅这些字符串会被加密,并且所有常量字符串都会被加密,而在引用它们之前会被解密。

在进行所有检测之后,如果触发了上述任何参数,子进程会以退出代码1退出,如果未触发则退出代码为0。

返回父进程

父进程可以调用API GetExitCodeProcess()以获得退出代码。当它检测到QBot在分析设备中运行时,将不会立即退出该进程,而是秘密设置一个全局变量。最后,它会转到另一个代码分支,并在其中执行一些无关的操作,加载核心模块,并在最后退出进程。我们将在后面详细分析核心模块。

如果它判断没有在分析设备中运行,则会继续在%AppData%\Microsoft\文件夹下创建一个主文件夹,以保存QBot的进程和数据。主文件夹的名称是随机生成的,在不同的设备上可能会有所不同。在我的设备中,文件夹的名称是“Vhdktrbeex”。它会检查当前的QBot进程是否来自其主文件夹。当然,这并不是第一次检查文件所在的位置,实际上,它位于文件夹C:\Users\Public\tmpdir\中。

然后,会将file1.exe复制到主文件夹中,并将其命名为mavrihvu.exe。文件名是根据受害者的用户名而生成的,在下图中,我们可以看到用于比较两个文件夹名称的ASM代码片段。

用于比较主文件夹名称的ASM代码片段:

picture4.png

在这个代码分支中,它将继续从当前进程中加载名为307的资源。这是QBot的核心模块。字符307   将会被解密。如果此时恶意软件根据子进程的退出代码(使用参数/C调用)检测到位于分析设备中,那么307字符串的解密将会失败,并且不会产生任何错误警报。然后,恶意软件什么都不做,很快就会退出该进程。我们可以将这一点视为它的反分析技术。

307的内容是加密的PE文件。但是,它并没有真正加载核心模块307来执行其工作。相反,它是从解密的307模块中加载另一个名为308的资源。

解密后308的数据和解密函数:

picture5.png

从308解密后的数据来看,10=spx97中的spx97是QBot的变量标识。3=1586971769是Unix时间戳,表示资源307的创建时间。这部分会在与C2服务器通信过程中用于显示其版本信息。根据该信息,C2服务器可以确定恶意软件是否需要进行升级。

然后,它会创建一个名为mavrihvu.dat的文件,以保存加密的配置数据。下面是加密前的内容。

01AFFB60  D8 88 6C 71 57 93 A7 1D D2 B8 97 4F 1B FC C1 E3  ??lqW“§ò?—Oüá?
01AFFB70  A2 D0 F7 C0 31 31 3D 32 0D 0A 31 3D 32 32 2E 34  ¢D÷à11=2..1=22.4
01AFFB80  31 2E 35 37 2D 31 35  2F 30  35 2F  32 30  32 30 0D  1.57-15/05/2020.
01AFFB90  0A 32  3D 31 35 38 39  36 30  37 37  31 37  0D 0A      .2=1589607717..

其中,包含一些基本信息。前14H个字节是其余内容的SHA-1值,11=2记录硬盘驱动器的类型,1=22.41.57-15/05/2020表示在受害者设备上安装QBot的时间和日期,2=1589607717是安装时间的Unix时间戳表示。这个mavrihvu.dat文件也会在后续频繁使用,以加载和保存QBot的其他配置数据。

恶意软件还会创建一个WMI(Windows管理体系结构)对象,以在不带参数的情况下执行%AppData%\Microsoft\Vhdktrbeex\mavrihvu.exe。为此,恶意软件将使用WMI命名空间ROOT\\CIMV2调用ConnectServer()API,使用Win32_Process调用CoSetProxyBlanket()和GetObject()。最后,使用命令行%AppData%\Microsoft\Vhdktrbeex\mavrihvu.exe调用Put(),并使用ExecMethod()来运行。

下图的ASM代码片段展示了如何调用Put()和ExecMethod()。

WMI对象执行QBot进程:

picture6.png

我认为,使用WMI对象运行QBot比直接调用CreateProcess可以更好地保护进程。众所周知,WMI对象会使用Windows进程wmiprvse.exe进行处理,然后执行mavrihvu.exe进程。下面的截图中展示的屏幕快照,显示了进程树开始运行file1.exe,然后由wmiprvse.exe(WMI Provider Host)启动mavrihvu.exe的过程。

进程树:

picture7.png

我们将在本文的下一章中,详细说明如何通过wmiprvse.exe启动mavrihvu.exe。

然后,file1.exe继续在计划任务中创建一个一次性运行的任务,它使用以下命令:

C:\Windows\system32\schtasks.exe /Create /RU \"NT AUTHORITY\SYSTEM\" /tn qyuoeflyq /tr \"C:\Users\Public\tmpdir\file1.exe\" /I qyuoeflyq /SC ONCE /Z /ST 22:48 /ET 23:00

创建的任务名称为“qyuoeflyq”,它将会执行命令C:\Users\Public\tmpdir\file1.exe /I qyuoeflyq。其中,/I qyuoeflyq是命令行参数,然后代码分支将file1.exe的内容替换为calc.exe,以销毁file.exe,然后删除名称为qyuoeflyq的一次性运行任务,这里使用参数/I。

下图展示了在处理/I代码分支时,调用API CreateProcessW() 以执行命令来替换file1.exe内容的过程。

/I参数处理程序执行命令:

picture8.png

至此,file1.exe的任务完成。随后,恶意软件调用API ExitProcess()退出进程。

四、WMI Provider Host执行Qbot

在之前的截图中,我们可以看到QBot(mavrihvu.exe)是由WMI Provider Host(wmiprvse.exe)启动的,启动时没有使用参数。它会执行file1.exe所做的所有工作,例如会检查是否位于分析设备中(使用参数/C),然后检查它是否来自主文件夹%AppData%\microsoft\Vhdktrbeex\。这一次,检查显然会通过,因此它将转到与file1.exe所在位置不同的分支。

接下来,它将从多个常见进程中挑选一个,创建一个暂停的进程,这些常见进程包括:C:\Windows\explorer.exe、C:\Windows\System32\mobsync.exe和C:\Program Files\Internet Explorer\iexplore.exe。具体使用哪个,取决于哪个最先有效。然后,QBot进入选定的常见进程,以执行其恶意代码,并防止恶意进程被受害者识别出来。默认情况下,这三个常见进程的字符串是加密的。

创建了暂停的explorer.exe:

picture9.png

上图展示了创建带有CREATE_SUSPENDED标志的explorer.exe时的屏幕截图。这样一来,QBot就可以修改explorer.exe的内存数据,然后恢复其运行。

QBot将其所有数据从其内存复制到explorer.exe的内存中。为此,它会调用API ZwCreateSection()、ZwMapViewOfSection()和memcpy()复制数据。然后,它会从PE结构中读取重定位数据,并在explorer.exe中的复制后代码中调整重定位偏移量。最后,它调用API GetThreadContext()以获取explorer.exe的当前入口点,然后对其进行修改,以便能够跳转到复制的QBot的代码(入口点)。然后,它调用ResumeThread()从其入口点继续运行explorer.exe。现在,所有无参数mavrihvu.exe的任务都已经完成,它会调用API ExitProcess()执行最后一项退出任务。至此,QBot就可以在explorer.exe进程中完美运行了。

五、QBot在Explorer.exe中执行

在explorer.exe中运行的代码首先具有一个被调用的新入口点。它的主要任务是加载和解密资源307。它会调用API FindResourceA()、SizeofResource()和LoadResource(),以将资源307加载到内存中。接下来,获取通过调用RC4函数解密的307数据。在下图中,展示了解密后的307数据,这是一个PE文件。

解密后的资源307:

picture10.png

我们对PE文件进行了转储和分析,这是一个DLL文件,是QBot的核心模块。其中包含核心模块使用的三个资源,分别是308、310和311。我之前已经说明过308的内容,而对于其他两个,我们将尝试解密其中的内容。下图展示了使用PE分析工具转储资源307中包含的三个资源。

转储资源307中包含的三个资源:

picture11.png

它通过调用API VirtualAllocate()继续将每个部分从307PE结构加载到新分配的内存中。然后,它会修复重定位数据,并导入必要的API,以使核心模块可以在explorer.exe中执行,这与PE Loader创建进程时的方式相同。

在完成上述步骤后,将调用核心模块的入口点。下图展示了调用保存在var_10中入口点的ASM代码片段。

调用核心模块资源307的var_10中的入口点:

picture12.png

在这一系列文章的下一篇中,我将继续分析explorer.exe中的核心模块,并研究QBot是如何连接到其C2服务器,以及它如何从受害者的设备中窃取数据并发送到C2服务器的。敬请大家关注。

六、总结

在本报告的第一部分中,我详细分析了恶意Office Word文档如何通过使用恶意宏下载QBot的变种,以及如何使用复杂的技术隐藏和保护其自身不被受害者发现。

在我的分析过程中,QBot几乎每天都会升级Payload文件。一旦它添加了一定的新功能后,我会持续跟踪,并发布更多的分析文章。

七、解决方案

传播这些威胁的最常见媒介就是电子邮件,使用部署在本地或云环境的邮件安全产品可以检测恶意网络钓鱼内容。同时,使用沙箱解决方案对邮件附件进行检测可以有效防止附件中存在恶意行为。为了缓解基于PDF和Office文档的威胁,一些邮件系统和邮件网关中支持内容拆解与重建(Content Disarm and Reconstruction)功能,可以从这些文件格式中移除像QBot这种活跃的威胁。

运行FortiGate和FortiMail的客户已经受到FortiGuard的Web过滤服务、反病毒服务和CDR功能的保护,免受QBot变种的攻击。目前,下载URL已经被FortiGuard Web过滤服务判断为“恶意网站”。恶意Word文档和下载的file1.exe被检测为VBA/Qbot.CC!tr.dldr和W32/QBOT.CC!tr,可以被FortiGuard反病毒服务阻止。

八、威胁指标

URL

hxxp://pickap[.]io/wp-content/uploads/2020/04/evolving/888888.png

hxxp://decons[.]vn/wp-content/uploads/2020/04/evolving/888888.png

hxxp://econspiracy[.]se/evolving/888888.png

hxxp://enlightened-education[.]com/wp-content/uploads/2020/04/evolving/888888.png

hxxp://kslanrung[.]com/evolving/888888.png

样本SHA-256

原始Word文档:432B6D767539FD5065593B160128AA7DCE271799AD2088A82A16542E37AD92B0

file1.exe(888888.png):D3B38681DBC87049022A3F33C9888D53713E144A277A7B825CF8D9628B9CA898

九、参考

[1] https://malware.wikia.org/wiki/Qakbot

[2] https://docs.microsoft.com/en-us/powershell/scripting/samples/getting-wmi-objects--get-ciminstance-?view=powershell-7

本文翻译自:https://www.fortinet.com/blog/threat-research/deep-analysis-of-a-qbot-campaign-part-1如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/Wmmo
如有侵权请联系:admin#unsafe.sh