新的Bazar 木马变体正通过最近的网络钓鱼活动大肆传播(二)

2021-02-20 11:09:097977人阅读

本文,我们将重点介绍在“cmd.exe”进程内运行的Bazar有效载荷文件。你将了解到该Bazar使用了哪些新的反分析技术,如何与C2服务器通信,它可以从受害者的设备收集哪些敏感数据以及如何将其他恶意软件传播到受害者的系统。

Bazar有效载荷的Main()函数

Bazar有效载荷的此变体是使用Microsoft Visual C ++ 8.0编写的64位可执行文件。它是于2021年1月18日星期一被编译的。

在其Main()函数中,我们可以看到它由API SetTimer()设置的“计时器”驱动,然后由GetMessageA()捕获。当条件匹配时,工作函数就被调用一次。下图显示了它们如何一起工作的伪代码。

1613567862211416.png

Bazar Main()函数的伪代码

反分析技术

我还观察到在整个Bazar执行过程中使用了三种主要的反分析技术,我将解释它们是如何工作的。

1.所有关键API均被隐藏

Bazar在代码中隐藏了关键API,仅在需要调用时才使用它们。我调用的函数get_api()用于动态获取具有API名称哈希值及其模块索引的API地址。 get_api()返回时,API地址在RAX寄存器中。通过使用get_api()在此变体中获得了600多个API。分析此API很复杂,因为没有人能够通过其名称哈希值读取它,这确实给动态和静态分析的研究人员带来了麻烦。

当它检索名称为哈希值0x9E6FA842且模块索引为8的API“TerminateProcess”时,这部分ASM代码如下所示。如前所述,当API调用返回时,在RAX中找到了该地址。

1613567875254612.png

2. ASM代码混淆

如果你对代码结构感到好奇,那么伪代码(如下图所示)看起来就很奇怪,因为Bazar使用了一种代码混淆技术。这是威胁研究人员清楚跟踪分析代码的另一个障碍,这是有关如何混淆ASM代码的示例。

原始代码如下:

1613567884937459.png

经过混淆后,它变成了这样(原始代码突出显示):

mov     ecx, 370A6DACh
Label_0:
mov     [rsp+40h+var_18], rdx
mov     rbp, [rsp+40h+var_18]
cmp     rbp, 4
mov     ebp, 0B03F61D0h
cmovb   ebp, ecx
jmp     Label_1
[…]
Label_1:
cmp     ebp, 0F7C9568Bh
jg      short Label_2
cmp     ebp, 0B03F61D0h
jz        Label_3
cmp     ebp, 0BAE74C5Ch
jz      Label_5
cmp     ebp, 0EC1D9526h
jnz     short Label_1
jmp     Label_4
[…]
Label_2:
cmp     ebp, 0F7C9568Ch
jz      Label_6
cmp     ebp, 2BA792A4h
jz      Label_0
cmp     ebp, 370A6DACh
jnz     short Label_1
mov     rdx, [rsp+40h+var_18]
movzx   ebp, [rsp+rdx+40h+var_10]
imul    ebp, -0Bh
mov     ebx, ebp
add     ebx, 273h
[…]
Label_3:
mov     ebp, 0EC1D9526h
jmp     Label_1
[…]
Label_4:
lea     rcx, [rsp+40h+arg_40]
lea     rdx, [rsp+40h+var_10]
call    sub_13F944B2E

如你所见,混淆的ASM代码与大量类似垃圾的代码混合在一起,同时其逻辑也变得非常复杂,Bazar几乎所有函数都采用了这种混淆方法。

3.所有常量字符串均以Bazar编码

另一种形式的混淆会影响常量字符串的使用,Bazar的常量字符串隐藏在整个代码的加密数据中,以执行反分析。

1613567895117140.png

刚刚解密的一个常量字符串“POST”

如上所示,在使用加密数据(“3C 37 4B 50 29”)之前,已将其从堆栈中复制并解密为“POST”。

与C2服务器通信

在Bazar的工作函数中,它还进行了一些初始工作(例如设置环境变量、创建互斥对象、加载API和设置全局变量)之后,它会创建一个线程来执行线程函数中的任务。

线程函数连接到C2服务器并向其发送数据,C2服务器主机字符串是解密的常量字符串。它们是 "miraclecarwashanddetall[.]com:443" 和一组其他主机:“caexidom[.]bazar”, “ektywyom[.]bazar”, “emliwyyw[.]bazar”, “uhymeked[.]bazar”, “ibykwyyw[.]bazar”和“elicuhem[.]bazar"优先连接到第一台C2服务器主机,然后,如果第一台C2服务器主机不工作,它将尝试连接到其他主机。

1.请求

Bazar和它的C2服务器之间的通信通过SSL协议加密,下图是在第一个请求即将通过调用API EncryptMessage()进行ssl加密时截图的。

1613567905183592.png

Bazar通过SSL协议对数据包进行加密

如你所见,这是一个GET请求。 URL " /cgi-bin/req5 "是一个解密后的常量字符串,主机是我上面提到的第一个C2服务器,还有四个“Cookies”:“fpzkgo”、“bcfs”、“hky”和“otxe”。它们的名称是随机字符串,只有“fpzkgo”的值是有效数据,其他的都是随机数据。

让我们看看“fpzkgo” 的含义,根据我的分析,它分为两部分:受害者ID和命令编号。我的测试设备的受害者ID是“a9aadd987308f3a5b28d5a0c552c4324”。它是从我的设备获取的一串信息的MD5哈希值,例如计算机名、分区的卷号和Windows安装信息。

报告命令的格式为“/{Victim-ID}/{command number}”。第一个“GET”数据包的命令号为“2”。因此,最终命令字符串为“/ a9aadd987308f3a5b28d5a0c552c4324 / 2”。

然后,Bazar使用了使用RSA算法的私钥加密技术对100H缓冲区中的命令字符串进行加密。下图在顶部显示了明文数据,在底部显示密文。

1613567918387934.png

使用RSA算法对受害者ID和命令字符串进行加密

最后,Bazar base64对RSA加密数据进行编码,即“Cookies”项“fpzkgo”的值,如图3.1所示。

发送到C2服务器的所有命令包都包含在“cookie”中,并使用相同的步骤和算法生成。

2.响应

C2服务器接收并处理了恶意软件请求和通知后,便会响应Bazar。因此,在接下来的介绍中,我们将分析响应数据包。参考下图,你可以在内存部分看到使用API DecryptMessage()从SSL数据包中解密了一个响应数据包。

1613567931204257.png

显示收到的响应数据包

该响应数据包在标头中包括“Set-Cookies:jklo =…”项,其值是base64编码的。在base64对该值进行解码之后,Bazar将获得一个由RSA加密的100小时长的数据集。使用C2服务器的公钥,Bazar能够解密该数据集,从而从C2服务器获得命令字符串。下图显示了RSA解密命令字符串,“0 302”,通过调用API BCryptDecrypt()发现。“0302”的“0”是命令编号,“302”是命令数据。

1613567943174961.png

来自“ Set-Cookies”项的解密的C2命令字符串

这几乎是Bazar和C2服务器之间所有其他通信数据包所使用的基本数据包结构,接下来我们将讨论更多控制命令。

分析命令和控制(C2)

Bazar能够通过从C2服务器接收到的命令来控制受害者的设备,如上所示我在“0302”字符串中识别了C2的命令“0”。通过检查Bazar的代码,我已经能够识别出它支持以下C2命令编号:“0”、“1”、“10”、“11”、“12”、“13”、“14”、“15”、“16”、“17”、“18”和“100”。

接下来,我将解释该恶意软件中使用的一些已知命令,包括命令包由什么组成,以及使用这些命令的目的。

当Bazar需要发送C2服务器请求的任何数据时,它将发送一个带有URL“/cgi-bin/req5”、包含在“Cookies”中的命令编号字符串和请求的 “body”中的ras加密数据的“POST”请求。

提醒一下,报告命令的格式为“/{Victim-ID}/{command number}” ,测试设备的受害者ID为“a9aadd987308f3a5b28d5a0c552c4324”。

命令0:

C2服务器要求Bazar发送它所连接的主机字符串和端口以及受害者设备上Bazar的运行时间。以下是此数据的示例,"/a9aadd987308f3a5b28d5a0c552c4324/4" 。 Bazar使用其私钥作为发送到C2服务器的“POST”的 “body” 中的数据对其进行加密。

“Cookies”中包含“/a9aadd987308f3a5b28d5a0c552c4324/4”,以提供受害者ID和命令编号。

命令1:

该命令要求Bazar从受害者的系统中收集数据,例如OS信息、域、用户名、公共IP地址、位置和语言、所有已安装的软件、网络信息、共享文件夹、运行进程列表、时区、CPU信息、硬盘驱动器容量、物理内存容量以及Bazar是否在VM中运行。它调用GetVersionExA()和GetProductInfo() API来获取Windows的版本和服务包信息。

为了获取受害者设备的公共IP地址,Bazar将STUN请求(UDP数据包)发送到Google的一台STUN服务器,例如“stun2.l.google.com”,以检索公共IP地址。以下是请求Bazar发送STUN数据包的命令的Wireshark屏幕截图。

1613567975157865.png

使用Google STUN服务获取受害者的公共IP地址

Bazar执行多个命令以从受害者的设备获取网络相关信息和域信任,命令是“net view /all”,“net view /all /domain”和“nltest.exe /domain_trusts /all_trusts”。

然后它列举系统注册表来收集受害者设备上已安装软件的列表,下图是系统注册表的截屏,显示在“HKLM\ software \Microsoft\Windows\CurrentVersion\Uninstall\” 子项下的已安装软件的部分列表。

1613568628133757.png

受害者设备上安装的软件信息

Bazar调用CreateToolhelp32Snapshot(),Process32First(),Process32Next()和OpenProcess()API来收集有关受害者系统上正在运行的进程的信息。

Bazar还会执行一些WMI查询字符串,例如“Select * From Win32_Processor”、“Select * From Win32_DiskDrive”和“Select * From Win32_PhysicalMemory”来获取有关CPU、驱动器和物理内存的信息。

它从系统注册表中的“HKLM \SYSTEM\CurrentControlSet\Services\ disk \Enum”中获取硬盘描述。我的研究环境(Oracle VM VirtualBox),它是“IDE\DiskVBOX_HARDDISK ___________________________ 1.0 _____\5 &33d1638a&0&0.0.0”。然后,Bazar搜索关键字“VBOX”和“VMware”,以确定Bazar是否在虚拟机上运行。

完成此收集后,它将“POST”请求的“body”中收集的所有信息发送到C2服务器。报告命令字符串“/ a9aadd987308f3a5b28d5a0c552c4324 /3”包含在“Cookies”中,下图显示了恶意软件即将通过调用BCryptEncrypt()加密收集的数据时的情况。

1613568640214397.png

RSA算法用于加密从受害者设备收集的敏感信息

命令10、11:

这些命令可以包含下载其他恶意软件的链接,也可以直接包含恶意软件。 Bazar将此恶意软件注入到以下列表中的一个新创建的进程中,这些进程是解密后的常量字符串。

"c:\windows\system32\calc.exe"
"c:\windows\system32\cmd.exe"
"c:\windows\system32\notepad.exe"
"c:\windows\system32\svchost.exe"
"c:\windows\system32\explorer.exe"
"c:\windows\syswow64\calc.exe"
"c:\windows\syswow64\explorer.exe"
"c:\windows\syswow64\cmd.exe"
"c:\windows\syswow64\svchost.exe"
"c:\windows\syswow64\notepad.exe"

然后在“POST”请求中回复“文件未下载”、“加载程序已启动”、“程序正在运行”或“程序启动错误”,并报告命令串“/a9aadd987308f3a5b28d5a0c552c4324/3”,从而更新C2服务器的状态。

命令12、13:

C2服务器用一个脚本文件在命令中回应Bazar,然后,Bazar解密脚本文件并将其保存到Windows临时文件夹中。最后,Bazar通过调用API CreateProcessA()来运行它。

当发生错误时,Bazar会通过响应“程序正在运行”或错误消息“程序启动错误”,“无脚本”或“无内存”来通知C2服务器该脚本的状态。

该消息采用rsa加密,作为POST请求的“body”数据发送,并附上“Cookies”值的报告命令字符串“/a9aadd987308f3a5b28d5a0c552c4324/3”。

命令16:

Bazar从C2服务器的命令中读取文件路径,并收集文件的内容。它将收集到的数据作为“POST”请求的“body”发送回C2服务器,报告命令字符串为“/a9aadd987308f3a5b28d5a0c552c4324/3”。

命令17:

C2服务器用一段在命令中经过rsa加密的本机代码进行响应,Bazar使用C2服务器的公钥解密本机代码(ASM代码),并将其部署到要执行的新创建线程上。为此,它需要调用一些API,如VirtualAlloc()、memcpy()、VirtualProtect()和CreateThread()。下图提供了相关ASM代码的部分视图。

1613568655240269.png

Bazar处理接收到的本机代码的代码片段

与其他命令一样,它也以相同的方式向C2服务器响应状态。消息可能是“程序正在运行”或错误状态,例如“无代码”,“无内存”和“程序启动错误”等。

命令100:

当Bazar收到此命令时,它将通过调用API TerminateProcess()来自我终止。

总结

本文全部涉及由Bazar下载程序下载的Bazar载荷,本文已经介绍了Bazar变体使用的三种主要的反分析技术。此外,本文还展示了Bazar如何与C2服务器通信,Bazar支持哪些控制命令以及Bazar能够使用哪些命令在受害设备上执行哪些恶意操作。


本文转载自:嘶吼

作者:我们会有自己的猫

原文地址:https://www.4hou.com/posts/Vo55

本文翻译自:https://www.fortinet.com/blog/threat-research/new-bazar-trojan-variant-is-being-spread-in-recent-phishing-campaign-part-II

0
现金券
0
兑换券
立即领取
领取成功