译者:知道创宇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之间的通信部分

图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

表1:bot和C2之间的通信部分

创建DNS查询

与C2的通信(图1)的每个部分都遵循3个不同的DNS查询序列(图2)。NTT先前发表了一篇文章,探讨了bot如何向Anchor C2服务器创建DNS查询。在这篇文章中,我们做了进一步的研究,以便更好地理解DNS查询的每个部分的作用。

图2:DNS查询的高级概述

图2给出了DNS查询的高级概述。对于发送到恶意软件C2的数据类型,每个查询都有自己的格式,如下所述:

Query 0

Bot DNS 查询

0/anchor_dns////

  • 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 //1001/<64 bytes random bytes><32 bytes random alphanumeric characters>/
1 /<32 bytes random alphanumeric characters>/
10 ////
5 //

表2:c2_command的内容

由于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提到的完全相同。

图3:C2发送的IP记录

IP的第一个带点十进制数表示bot解析IP列表的顺序。

  • 本表格的IP地址4.?.?.?显示C2发送了多少数据,IP的最后3个点状十进制数字表示大小。
  • 本表格的IP地址8.?.?.?显示当前记录列表中数据的大小,IP的最后3个点十进制数字表示该值。
  • 图3中的附加IP都是IP的最后3个点号十进制数连接在一起的数据。

在下面的图4中,我们看到C2发送的IP记录的PE文件有效负载示例。

图4:PE文件有效负载示例

Windows Anchor

从C2收到的最终数据具有以下结构:

//anchor_dns//<32_bytes_random_alphanumeric>//\r\n<base64_e

  • 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)

图5:正在运行64位Anchor PE

图6:执行DLL的64位Anchor PE

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

Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1392/