深入研究 Ratel C4 暴力攻击载荷

admin 2024年10月21日16:03:43评论19 views字数 4431阅读14分46秒阅读模式

深入研究 Ratel C4 暴力攻击载荷

概括

Brute Ratel C4是一款红队与对手模拟软件,可视为 Cobalt Strike 的替代品。在这篇博文中,我们将对未实现该框架所有最新功能的 Brute Ratel 獾/代理进行技术分析。目前,野外可用的 Brute Ratel 样本并不多。该恶意软件实现了 API 哈希技术,并提出了一个配置,其中包含 C2 服务器、网络通信期间使用的用户代理、用于与 C2 服务器进行身份验证的密码以及用于加密传输到 C2 服务器的数据的密钥。獾通过执行 C2 服务器发出的 63 个不同命令来控制受感染的机器。前 20 个命令将在本博文中描述,其余命令将在即将发布的博文中详细介绍。

技术分析

SHA256:

d71dc7ba8523947e08c6eec43a726fe75aed248dfd3a7c4f6537224e9ed05f6f

这是一个 64 位可执行文件。恶意软件将要执行的代码推送到堆栈上,以逃避防病毒和 EDR 软件的检测:

深入研究 Ratel C4 暴力攻击载荷

图 1

它实现了 API 哈希技术,该技术使用“ROR EDI,0xD”指令计算 4 字节哈希值,然后与预先计算的哈希值进行比较(图 2)。

深入研究 Ratel C4 暴力攻击载荷

图 2

VirtualAllocEx API 用于分配一个将存储 DLL 文件的新内存区域(0x3000 = MEM_COMMIT | MEM_RESERVE,0x40 = PAGE_EXECUTE_READWRITE):

深入研究 Ratel C4 暴力攻击载荷

图 3

Brute Ratel C4 配置以明文形式存储,但在最近的版本中,配置已加密并采用 Base64 编码。它包含 C2 IP 地址和端口号、网络通信期间使用的用户代理、用于与 C2 服务器进行身份验证的密码、用于加密传输到 C2 服务器的数据的密钥以及 URI:

深入研究 Ratel C4 暴力攻击载荷

图 4

深入研究 Ratel C4 暴力攻击载荷

图 5

通过调用 CreateRemoteThread 函数创建执行新 DLL 入口点的线程:

深入研究 Ratel C4 暴力攻击载荷

图 6

该进程从 gs:[0x60] 中提取一个指向 PEB 的指针,并提取另一个指向PEB_LDR_DATA结构 (+0x18) 的指针,其中包含有关已加载 DLL 的信息。InMemoryOrderModuleList 双向链接列表包含当前进程已加载的 DLL:

深入研究 Ratel C4 暴力攻击载荷

图 7

恶意二进制文件使用 VirtualAlloc 为实现主要功能的另一个 DLL 分配新内存:

深入研究 Ratel C4 暴力攻击载荷

图 8

LoadLibraryA 用于将多个 DLL 加载到当前进程的地址空间中:

深入研究 Ratel C4 暴力攻击载荷

图 9

恶意软件通过调用GetProcAddress方法检索相关函数的地址:

深入研究 Ratel C4 暴力攻击载荷

图 10

二进制文件使用 NtFlushInstructionCache 函数刷新当前进程的指令缓存(见图 11)。

深入研究 Ratel C4 暴力攻击载荷

图 11

最后,恶意软件将执行流传递给新构造的DLL:

深入研究 Ratel C4 暴力攻击载荷

图 12

正如我们在下面看到的,DLL 的导出函数之一称为“badger_http_1”,它揭示了一个 Brute Ratel 代理/badger。

深入研究 Ratel C4 暴力攻击载荷

图 13

深入研究 Ratel C4 暴力攻击载荷

图 14

FreeConsole 方法用于将进程与其控制台分离:

深入研究 Ratel C4 暴力攻击载荷

图 15

DLL 重复查找函数地址的过程,如图 16 所示。

深入研究 Ratel C4 暴力攻击载荷

图 16

该进程提取系统时间并将结果传递给srand函数:

深入研究 Ratel C4 暴力攻击载荷

图 17

使用 atoi 方法将端口号转换为整数:

深入研究 Ratel C4 暴力攻击载荷

图 18

恶意进程通过调用CreateMutexA API创建一个未命名的互斥对象,如图19所示。

深入研究 Ratel C4 暴力攻击载荷

图 19

GetUserNameW 用于获取与当前线程关联的用户名:

深入研究 Ratel C4 暴力攻击载荷

图 20

GetComputerNameExW 用于获取与本地计算机关联的 NetBIOS 名称:

深入研究 Ratel C4 暴力攻击载荷

图 21

獾使用 GetCurrentProcess 检索当前进程的伪句柄:

深入研究 Ratel C4 暴力攻击载荷

图 22

OpenProcessToken API 用于打开与进程关联的访问令牌 (0x8 = TOKEN_QUERY ):

深入研究 Ratel C4 暴力攻击载荷

图 23

恶意软件使用 GetTokenInformation 方法(0x14 = TokenElevation )来验证令牌是否被提升:

深入研究 Ratel C4 暴力攻击载荷

图 24

它通过调用 GetCurrentProcessId 函数获取当前进程 ID:

深入研究 Ratel C4 暴力攻击载荷

图 25

利用GetModuleFileNameW提取进程的可执行文件路径:

深入研究 Ratel C4 暴力攻击载荷

图 26

上述路径使用 CryptBinaryToStringW API(0x40000001 = CRYPT_STRING_NOCRLF | CRYPT_STRING_BASE64)进行 Base64 编码:

深入研究 Ratel C4 暴力攻击载荷

图 27

该进程使用 RtlGetVersion 检索有关当前操作系统的版本信息:

深入研究 Ratel C4 暴力攻击载荷

图 28

WSAStartup 函数启动当前进程对 Winsock DLL 的使用:

深入研究 Ratel C4 暴力攻击载荷

图 29

badger 构造了一个 JSON,其中存储了从配置中提取的密码、计算机名称、操作系统版本、Base64 编码的可执行路径、用户名和进程 ID:

深入研究 Ratel C4 暴力攻击载荷

图 30

JSON 使用 XOR 运算符(配置中的 key =“abcd@123”)进行加密,并通过其他操作进行转换:

深入研究 Ratel C4 暴力攻击载荷

图 31

深入研究 Ratel C4 暴力攻击载荷

图 32

深入研究 Ratel C4 暴力攻击载荷

图 33

传递给InternetOpenW函数的用户代理似乎表明该产品由德勤中国使用(图34)。

深入研究 Ratel C4 暴力攻击载荷

图 34

该进程通过调用InternetConnectW函数连接到端口80上的C2服务器:

深入研究 Ratel C4 暴力攻击载荷

图 35

它使用 HttpOpenRequestW 向“/content.php”资源创建 POST 请求,如下所示。

深入研究 Ratel C4 暴力攻击载荷

图 36

使用 InternetSetOptionW API (0x1100 = SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_UNKNOWN_CA )更改句柄的安全标志:

深入研究 Ratel C4 暴力攻击载荷

图 37

HttpAddRequestHeadersW 可用于向句柄添加一个或多个 HTTP 请求标头,但是,第二个参数在恶意软件执行期间为 NULL(0x20000000 = HTTP_ADDREQ_FLAG_ADD):

深入研究 Ratel C4 暴力攻击载荷

图 38

该过程使用 Base64 对加密的 JSON 进行编码,并使用 HttpSendRequestW 泄露结果数据:

深入研究 Ratel C4 暴力攻击载荷

图 39

它通过对 InternetQueryDataAvailable 函数调用来验证 C2 服务器是否发回任何数据:

深入研究 Ratel C4 暴力攻击载荷

图 40

使用 InternetReadFile 读取 C2 服务器的响应:

深入研究 Ratel C4 暴力攻击载荷

图 41

响应经过 Base64 解码,并使用前面提到的相同密钥进行解密。“auth”字段设置为解密后的信息,并向 C2 服务器发出另一个请求,要求输入命令:

深入研究 Ratel C4 暴力攻击载荷

图 42

FakeNet-NG用于模拟与 C2 服务器的网络通信。解码和解密响应后,前 2 个字节代表要执行的命令,后面跟着其他参数(如果需要)。新线程负责处理命令的执行:

深入研究 Ratel C4 暴力攻击载荷

图 43

现在我们将描述 C2 服务器可以发出的命令。

0x2C74 ID – 将文件内容泄露到 C2 服务器

PathFileExistsA API 用于确认目标文件是否存在于系统中:

深入研究 Ratel C4 暴力攻击载荷

图 44

该文件通过调用 CreateFileA 函数打开(0x80000000 = GENERIC_READ、0x1 = FILE_SHARE_READ、0x3 = OPEN_EXISTING):

深入研究 Ratel C4 暴力攻击载荷

图 45

通过调用ReadFile方法读取内容,如图46所示。

深入研究 Ratel C4 暴力攻击载荷

图 46

数据与“[+] 下载完成”消息或下图所示的消息一起发送到 C2 服务器。

深入研究 Ratel C4 暴力攻击载荷

图 47

0xA905 ID–复制文件

恶意软件使用 CopyFileA 将现有文件复制到新文件:

深入研究 Ratel C4 暴力攻击载荷

图 48

0x9B84 ID –移动文件

该过程使用 MoveFileA 函数将现有文件移动到另一个文件(图 49)。

深入研究 Ratel C4 暴力攻击载荷

图 49

0x13A1 ID – 创建文件并使用从 C2 服务器接收的内容填充文件

首先,通过调用 CreateFileA 函数创建文件:

深入研究 Ratel C4 暴力攻击载荷

图 50

接收到的数据使用 CryptStringToBinaryA 进行 Base64 解码并写入文件:

深入研究 Ratel C4 暴力攻击载荷

0xE993 ID–删除文件

DeleteFileA用于删除目标文件,如下所示:

深入研究 Ratel C4 暴力攻击载荷

图 52

0x0605 ID – 关闭句柄

獾使用 CloseHandle API 关闭对象句柄(即文件,进程):

深入研究 Ratel C4 暴力攻击载荷

图 53

0x3F61 ID – 创建目录

恶意二进制文件能够使用 CreateDirectoryA 方法创建目录:

深入研究 Ratel C4 暴力攻击载荷

图 54

0x1139 ID——更改进程的当前目录

SetCurrentDirectoryA 用于执行所需的操作(见图 55)。

深入研究 Ratel C4 暴力攻击载荷

图 55

0x3C9F ID——获取进程的当前目录

恶意软件通过调用 GetCurrentDirectoryW API 提取进程的当前目录:

深入研究 Ratel C4 暴力攻击载荷

图 56

0x8F40 ID – 删除目录

仅当目标目录为空时,该过程才会使用 RemoveDirectoryA 删除该目录:

深入研究 Ratel C4 暴力攻击载荷

图 57

0x0A32 ID – 检索文件/目录的最后写入时间

使用 FindFirstFileW 和 FindNextFileW 函数在当前目录中枚举文件:

深入研究 Ratel C4 暴力攻击载荷

图 58

深入研究 Ratel C4 暴力攻击载荷

图 59

对于与模式匹配的每个文件或目录,二进制文件都会调用 CreateFileW API:

深入研究 Ratel C4 暴力攻击载荷

图 60

该过程通过调用 GetFileTime 函数来检索上次写入时间:

深入研究 Ratel C4 暴力攻击载荷

图 61

使用 FileTimeToSystemTime 将文件时间转换为系统时间格式:

深入研究 Ratel C4 暴力攻击载荷

图 62

最后,将上述时间转换为当前活动时区:

深入研究 Ratel C4 暴力攻击载荷

图 63

0x3D1D ID – 更改桌面壁纸

恶意进程打开包含桌面壁纸的“TranscodedWallpaper”文件:

深入研究 Ratel C4 暴力攻击载荷

图 64

上述文件填充了从 C2 服务器接收的内容(图 65)。

深入研究 Ratel C4 暴力攻击载荷

图 65

SystemParametersInfoA 方法用于更改桌面壁纸(0x14 = SPI_SETDESKWALLPAPER,0x1 = SPIF_UPDATEINIFILE):

深入研究 Ratel C4 暴力攻击载荷

图 66

0xD53F ID – 检索用户名

该命令用于获取与当前线程关联的用户名:

深入研究 Ratel C4 暴力攻击载荷

图 67

0x0609 ID – 检索可用的磁盘驱动器

恶意软件通过调用 GetLogicalDrives API 提取包含可用磁盘驱动器的位掩码,如图 68 所示。

深入研究 Ratel C4 暴力攻击载荷

图 68

0xC144 ID – 提取所有设备驱动程序

EnumDeviceDrivers 用于获取所有设备驱动程序的加载地址:

深入研究 Ratel C4 暴力攻击载荷

图 69

使用上述地址,进程通过调用GetDeviceDriverBaseNameA方法来检索设备驱动程序的名称:

深入研究 Ratel C4 暴力攻击载荷

图 70

0x0A01 ID – 计算自系统启动以来经过的分钟数

GetTickCount函数用于提取毫秒数,并执行简单的计算(见图71)。

深入研究 Ratel C4 暴力攻击载荷

图 71

0x73E6 ID——参数欺骗

獾有能力通过修改进程环境块(PEB)来隐藏参数:

深入研究 Ratel C4 暴力攻击载荷

图 72

0x8AFA ID – 父 PID 欺骗

此命令可用于欺骗父进程 ID,以逃避 EDR 软件或其他解决方案:

深入研究 Ratel C4 暴力攻击载荷

图 73

0xC929 ID – 提取子进程名称

该二进制文件可以产生多个进程,可以使用此命令显示这些进程(图 74)。

深入研究 Ratel C4 暴力攻击载荷

图 74

0x9E72 ID – 显示管道名称

恶意软件显示先前创建的管道的名称:

深入研究 Ratel C4 暴力攻击载荷

图 75

其他 30 个相关命令将在第二篇博文中详细介绍。

妥协指标

SHA256:

d71dc7ba8523947e08c6eec43a726fe75aed248dfd3a7c4f6537224e9ed05f6f

C2服务器:45.77.172.28

用户代理:[email protected]

参考

MSDN:  https ://docs.microsoft.com/en-us/windows/win32/api/

FakeNet-NG:https://github.com/mandiant/flare-fakenet-ng

Unit42:https ://unit42.paloaltonetworks.com/brute-ratel-c4-tool/

原文始发于微信公众号(Ots安全):深入研究 Ratel C4 暴力攻击载荷

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月21日16:03:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   深入研究 Ratel C4 暴力攻击载荷https://cn-sec.com/archives/3295080.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息