译者:知道创宇404实验室翻译组
原文链接:https://www.netscout.com/blog/asert/dropping-anchor
摘要
长期以来,Trickbot一直是主要的银行恶意软件家族之一。尽管最近发生了一些干扰事件,但攻击者仍在继续推动恶意软件的发展,并在最近开始将其部分代码移植到Linux操作系统。正如本次技术深入研究所显示的,命令与控制(C2)服务器与bot之间的通信极其复杂。此外,我们还分析了Linux2版Trickbots的Anchor模块的C2通信过程。
主要发现
- Trickbot攻击者利用复杂的通信模式来控制受感染的机器。
- 最近的研究表明,攻击者将部分代码转移到Linux上,从而增加了可移植性和潜在受害者的范围。
- Anchor模块可以使用过程化技术来规避分析。
- 基于Windows和Linux的机器能够在受害者的系统中安装额外的模块。
通信设置
Trickbot的Anchor框架是2018年发现的一个后门模块。该Anchor只部署在选定的目标上。目前Anchor与C2的通信使用DNS通道,我们将在后面介绍。
图1显示了bot与C2之间的通信流程。在整个沟通过程中,有一些用于bot的命令(称为bot_commands)以及用于C2的命令(称为c2_commands)。下表1中提供了图1中所示命令的说明。
通信的第1部分是Bot与C2之间的初始设置。僵尸程序将c2_command 0发送到C2,其中包含有关客户端的信息,包括僵尸程序ID(图1的第1部分)。建立初始通信后,C2会以一条包含信号/ 1 /的消息作为响应。
在通信的第2部分中,bot发送回相同的信号(也是c2_command 1),而C2则用bot_command响应(图1的第2部分)。
根据收到的初始bot命令(图1的第3部分),bot可以进一步请求C2发送可执行文件。
最后,bot将执行结果发送回C2(图1的第4部分)。
C2 Commands | Purpose | Bot Commands (Windows) | Purpose | Bot Commands (Linux) | Purpose |
---|---|---|---|---|---|
Obtain PE file | 5 or 6 | Execute PE file using process hollowing | 10, 11, or 12 | Execute Linux file | |
14 | Uninstall the bot | ||||
11 or 12 | Inject PE into multiple process | ||||
9 | Execute instruction via pipe object to cmd.exe | ||||
10 | Execute instruction via pip object to powershell.exe | ||||
13 | Change the bot's scheduled task | ||||
0 | Initial C2 Comms setup/register bot | 0 | execute instruction via cmd.exe | 0 | Execute instruction via cmd.exe in the Windows shares |
1 | Ask C2 for bot_command | 1 or 2 | Execute EXE in %TEMP% | 1 or 2 | Execute file in Windows share |
10 | Result of the execution of the bot_command | 7 or 8 | Execute PE using process doppelganging | 100 | Check bot GUID |
5 | Obtain PE file | 3 or 4 | Execute DLL in %TEMP% | 3 or 4 | Execute DLL with export control_RunDLL in Windows shares |
创建DNS查询
与C2的通信(图1)的每个部分都遵循3个不同的DNS查询序列(图2)。NTT先前发表了一篇文章,探讨了bot如何向Anchor C2服务器创建DNS查询。在这篇文章中,我们做了进一步的研究,以便更好地理解DNS查询的每个部分的作用。
图2给出了DNS查询的高级概述。对于发送到恶意软件C2的数据类型,每个查询都有自己的格式,如下所述:
Query 0
Bot DNS 查询
0
- 0 –表示0类型查询
- UUID –bot生成的16字节长度
- current_part –正在发送的数据的当前部分(下面将进一步说明)
- total_parts –数据被分成的部分的总数
- anchor_dns –与C2通信的Anchor bot的类型
- Bot_GUID – Windows和Linux平台生成的GUID不同
- c2_command –用于C2的命令
- content –根据命令类型发送的内容(表2)
Anchor模块生成的GUID对于每个平台都不同:
- Windows-
.<32 bytes client id> - Linux –
.<32 bytes client id>
发送到C2的每个命令后面都有其自己的内容集(表2):
c2_command | Content |
---|---|
N/A | |
0 | / |
1 | /<32 bytes random alphanumeric characters>/ |
10 | / |
5 | / |
由于DNS名称的最大长度为255个字节,因此为第一个查询发送的数据将分部分发送。这也解释了类型0查询中显示的字段current_path和total_parts。下面是关于数据分成多少部分的伪代码:
def get_total_parts(c2, data): divider = ((0xfa - len(c2)) >> 1) - 0x18 size = len(data) return (size / divider) + 1
与密钥进行异或后,发送到C2的数据将被设计为子域。密钥继续保持为0xb9。
下面的示例显示了将数据发送到c2_command 0时该数据的内容以及将其分为多少部分:
-
0
\x00\x03/anchor_dns/WIN-COMP_W617601.HGDJ3748EURIHDGV192873645672DFGW/0/Windows 7/1001/0.0.0.0/ -
0
\x01\x03EAA477CDE0E29EF989E433E633F545A09FD31789937121144906202B0EFD32CB/Tb1i5Xc -
0
\x02\x03Zih0P1wW70rhjGp7G75WsFu69/
C2响应
发送查询的每个部分后,C2会使用IP进行响应。Bot使用此IP来获取将在下一个查询序列中使用的标识符值。
def get_identifier(IP): return inet_aton(IP) >> 6
Query 1:
Bot DNS 查询
两个平台对类型1都有相同的查询。类似地,数据在用0xb9进行异或后创建为子域。
- dw_Identifier – 与C2发送给bot的查询类型为0的值相同
C2响应
指挥与控制系统以IP响应。这个IP也通过与上面伪代码中get_identifier相同的函数例程传递,结果值是最终查询类型中预期的数据大小。
Query 2:
Bot DNS 查询
两个平台对类型2都有相同的查询。
- dw_Identifier – C2发送给bot的查询类型为0的值相同
- dw_DataReceivedSize –到目前为止已接收的数据大小
bot继续发送查询类型2请求,直到从C2接收到的数据的总大小与C2响应查询类型1所发送的值的总大小相匹配。
C2响应
对于bot执行的每个type 2 DNS查询,C2将用一个IP记录列表来响应。这个IP列表(图3)是关于如何构造数据的结构,与NTT提到的完全相同。
IP的第一个带点十进制数表示bot解析IP列表的顺序。
- 本表格的IP地址
4.?.?.?
显示C2发送了多少数据,IP的最后3个点状十进制数字表示大小。 - 本表格的IP地址
8.?.?.?
显示当前记录列表中数据的大小,IP的最后3个点十进制数字表示该值。 - 图3中的附加IP都是IP的最后3个点号十进制数连接在一起的数据。
在下面的图4中,我们看到C2发送的IP记录的PE文件有效负载示例。
Windows Anchor
从C2收到的最终数据具有以下结构:
/
- base64_encoded_data:生成的bot_command子例程使用的信息。
Bot_Command 0
base64_encoded_data from C2–解码为一系列参数
- 通过cmd.exe执行一系列参数
Bot_Command 1 & 2
base64_encoded_data from C2–解码为文件名and/or文件参数
- bot向C2进行PE文件的DNS查询。
- bot_command 1发送c2_command 5
- bot_command 2发送c2_command
- EXE在%TEMP%目录中创建,前缀为tcp并执行。(图5和图6)
Bot_Command 5 & 6
base64_encoded_data from C2–解码为文件名and/or文件参数
- 该漫游器向C2进行PE文件的DNS查询。
- bot_command 5发送c2_command 5
- bot_command 6发送c2_command
- PE文件注入到进程中。
Bot_Command 7&8
base64_encoded_data from C2 –解码为文件名and/or文件参数
- 该漫游器向C2进行PE文件的DNS查询。
- bot_command 5发送c2_command 5
- bot_command 6发送c2_command
- 通过进程doppelgänging将PE文件注入到进程中。
Bot_Command 9
base64_encoded_data from C2 –解码为一系列参数
- 通过管道对象对cmd.exe执行一系列参数
Bot_Command 10
base64_encoded_data from C2 –解码为一系列参数
- 通过管道对象对powershell.exe执行一系列参数
Bot_Command 11&12
base64_encoded_data from C2–解码为文件名
- 该bot向C2进行PE文件的DNS查询。
- bot_command 11发送c2_command 5
- bot_command 12发送c2_command
- 该PE文件被注入创建的3个不同的运行进程中。
- 这些过程是explorer.exe,mstsc.exe和notepad.exe。
Bot_Command 13
base64_encoded_data from C2 –解码为计划的任务字符串
- bot更改了预定任务
Bot_Command 14
- 卸载Anchor
Linux Anchor
Linux Anchor模块是由Stage 2 Security首先发现的。Stage2 Security所做的分析是广泛的,但是我们想用与上面Windows版本相同的方式更仔细地研究C2通信。
0-4中的bot_命令包含Linux模块在尝试连接到任何Windows共享时要使用的smb2信息(包括域、用户和密码)。该模块有一个嵌入式PE文件,用于在Windows共享上执行命令或文件。
Bot_Command 0
base64_encoded_data from C2 -解码为一系列参数
- 通过Windows共享上的cmd.exe执行一系列参数。
Bot_Command 1&2
base64_encoded_data from C2-解码为文件名and/or文件参数
- 该bot向C2进行PE文件的DNS查询。
- bot_command 1发送c2_command 5
- bot_command 2发送c2_command
- 文件被执行。
Bot_Command 3和4
base64_encoded_data from C2-解码为文件名和/或文件参数
- 该bot向C2进行PE文件的DNS查询。
- bot_command 3发送c2_command 5
- bot_command 4发送c2_command
- DLL文件导出功能Control_RunDLL被执行。
Bot_Command 10&11&12
base64_encoded_data from C2
- 对于bot_command 10,编码数据是由bot执行的Linux文件。
- Bot_Commands 11和12向Linux的C2进行DNS查询。
- bot_command 11发送c2_command 5
- bot_command 12发送c2_command
- bot将文件的权限设置为777并执行。
Bot_Command 100
base64_encoded_data from C2-解码为GUID
- bot检查C2发送的GUID是否与bot的GUID相匹配。
- 如果GUID不匹配,bot会终止C2通信。
结论
Anchor的C2通信的复杂性和bot可以执行的有效负载反映了Trickbot攻击者相当大的创新能力,这从他们转向Linux就可以看出。需要注意的是,Trickbot并不是实现瞄准其他操作系统的唯一恶意软件。今年早些时候,我们分析了一个名为Lucifer的DDoS bot,该bot可以在Windows和Linux平台上运行。随着越来越多的攻击者在构建交叉编译恶意软件系列,安全人员必须重新评估Linux系统的安全实践,以确保他们做好充分准备抵御这些日益增长的威胁。
IOC:
Anchor C2s:
- westurn[.]in
- onixcellent[.]com
- wonto[.]pro
- ericrause[.]com
Anchor PE 64bit
- SHA256 - c427a2ce4158cdf1f320a1033de204097c781475889b284f6815b6d6f4819ff8
- SHA256 - 4e5fa5dcd972170bd06c459f9ee4c3a9683427d0487104a92fc0aaffd64363b2
Anchor ELF 64bit
- SHA256 - 4655b4b44f6962e4f9641a52c24373390766c50b62fcc222e40511c0f1ed91d2
Anchor PE 32bit Helper file for Linux
- SHA256 - 7686a3c039b04e285ae2e83647890ea5e886e1a6631890bbf60b9e5a6ca43d0a
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1392/