概括
Brute Ratel C4是一款红队与对手模拟软件,可视为 Cobalt Strike 的替代品。在这篇博文中,我们将对未实现该框架所有最新功能的 Brute Ratel 獾/代理进行技术分析。目前,野外可用的 Brute Ratel 样本并不多。该恶意软件实现了 API 哈希技术,并提出了一个配置,其中包含 C2 服务器、网络通信期间使用的用户代理、用于与 C2 服务器进行身份验证的密码以及用于加密传输到 C2 服务器的数据的密钥。獾通过执行 C2 服务器发出的 63 个不同命令来控制受感染的机器。前 20 个命令将在本博文中描述,其余命令将在即将发布的博文中详细介绍。
技术分析
SHA256:
d71dc7ba8523947e08c6eec43a726fe75aed248dfd3a7c4f6537224e9ed05f6f
这是一个 64 位可执行文件。恶意软件将要执行的代码推送到堆栈上,以逃避防病毒和 EDR 软件的检测:
图 1
它实现了 API 哈希技术,该技术使用“ROR EDI,0xD”指令计算 4 字节哈希值,然后与预先计算的哈希值进行比较(图 2)。
图 2
VirtualAllocEx API 用于分配一个将存储 DLL 文件的新内存区域(0x3000 = MEM_COMMIT | MEM_RESERVE,0x40 = PAGE_EXECUTE_READWRITE):
图 3
Brute Ratel C4 配置以明文形式存储,但在最近的版本中,配置已加密并采用 Base64 编码。它包含 C2 IP 地址和端口号、网络通信期间使用的用户代理、用于与 C2 服务器进行身份验证的密码、用于加密传输到 C2 服务器的数据的密钥以及 URI:
图 4
图 5
通过调用 CreateRemoteThread 函数创建执行新 DLL 入口点的线程:
图 6
该进程从 gs:[0x60] 中提取一个指向 PEB 的指针,并提取另一个指向PEB_LDR_DATA结构 (+0x18) 的指针,其中包含有关已加载 DLL 的信息。InMemoryOrderModuleList 双向链接列表包含当前进程已加载的 DLL:
图 7
恶意二进制文件使用 VirtualAlloc 为实现主要功能的另一个 DLL 分配新内存:
图 8
LoadLibraryA 用于将多个 DLL 加载到当前进程的地址空间中:
图 9
恶意软件通过调用GetProcAddress方法检索相关函数的地址:
图 10
二进制文件使用 NtFlushInstructionCache 函数刷新当前进程的指令缓存(见图 11)。
图 11
最后,恶意软件将执行流传递给新构造的DLL:
图 12
正如我们在下面看到的,DLL 的导出函数之一称为“badger_http_1”,它揭示了一个 Brute Ratel 代理/badger。
图 13
图 14
FreeConsole 方法用于将进程与其控制台分离:
图 15
DLL 重复查找函数地址的过程,如图 16 所示。
图 16
该进程提取系统时间并将结果传递给srand函数:
图 17
使用 atoi 方法将端口号转换为整数:
图 18
恶意进程通过调用CreateMutexA API创建一个未命名的互斥对象,如图19所示。
图 19
GetUserNameW 用于获取与当前线程关联的用户名:
图 20
GetComputerNameExW 用于获取与本地计算机关联的 NetBIOS 名称:
图 21
獾使用 GetCurrentProcess 检索当前进程的伪句柄:
图 22
OpenProcessToken API 用于打开与进程关联的访问令牌 (0x8 = TOKEN_QUERY ):
图 23
恶意软件使用 GetTokenInformation 方法(0x14 = TokenElevation )来验证令牌是否被提升:
图 24
它通过调用 GetCurrentProcessId 函数获取当前进程 ID:
图 25
利用GetModuleFileNameW提取进程的可执行文件路径:
图 26
上述路径使用 CryptBinaryToStringW API(0x40000001 = CRYPT_STRING_NOCRLF | CRYPT_STRING_BASE64)进行 Base64 编码:
图 27
该进程使用 RtlGetVersion 检索有关当前操作系统的版本信息:
图 28
WSAStartup 函数启动当前进程对 Winsock DLL 的使用:
图 29
badger 构造了一个 JSON,其中存储了从配置中提取的密码、计算机名称、操作系统版本、Base64 编码的可执行路径、用户名和进程 ID:
图 30
JSON 使用 XOR 运算符(配置中的 key =“abcd@123”)进行加密,并通过其他操作进行转换:
图 31
图 32
图 33
传递给InternetOpenW函数的用户代理似乎表明该产品由德勤中国使用(图34)。
图 34
该进程通过调用InternetConnectW函数连接到端口80上的C2服务器:
图 35
它使用 HttpOpenRequestW 向“/content.php”资源创建 POST 请求,如下所示。
图 36
使用 InternetSetOptionW API (0x1100 = SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_UNKNOWN_CA )更改句柄的安全标志:
图 37
HttpAddRequestHeadersW 可用于向句柄添加一个或多个 HTTP 请求标头,但是,第二个参数在恶意软件执行期间为 NULL(0x20000000 = HTTP_ADDREQ_FLAG_ADD):
图 38
该过程使用 Base64 对加密的 JSON 进行编码,并使用 HttpSendRequestW 泄露结果数据:
图 39
它通过对 InternetQueryDataAvailable 函数调用来验证 C2 服务器是否发回任何数据:
图 40
使用 InternetReadFile 读取 C2 服务器的响应:
图 41
响应经过 Base64 解码,并使用前面提到的相同密钥进行解密。“auth”字段设置为解密后的信息,并向 C2 服务器发出另一个请求,要求输入命令:
图 42
FakeNet-NG用于模拟与 C2 服务器的网络通信。解码和解密响应后,前 2 个字节代表要执行的命令,后面跟着其他参数(如果需要)。新线程负责处理命令的执行:
图 43
现在我们将描述 C2 服务器可以发出的命令。
0x2C74 ID – 将文件内容泄露到 C2 服务器
PathFileExistsA API 用于确认目标文件是否存在于系统中:
图 44
该文件通过调用 CreateFileA 函数打开(0x80000000 = GENERIC_READ、0x1 = FILE_SHARE_READ、0x3 = OPEN_EXISTING):
图 45
通过调用ReadFile方法读取内容,如图46所示。
图 46
数据与“[+] 下载完成”消息或下图所示的消息一起发送到 C2 服务器。
图 47
0xA905 ID–复制文件
恶意软件使用 CopyFileA 将现有文件复制到新文件:
图 48
0x9B84 ID –移动文件
该过程使用 MoveFileA 函数将现有文件移动到另一个文件(图 49)。
图 49
0x13A1 ID – 创建文件并使用从 C2 服务器接收的内容填充文件
首先,通过调用 CreateFileA 函数创建文件:
图 50
接收到的数据使用 CryptStringToBinaryA 进行 Base64 解码并写入文件:
0xE993 ID–删除文件
DeleteFileA用于删除目标文件,如下所示:
图 52
0x0605 ID – 关闭句柄
獾使用 CloseHandle API 关闭对象句柄(即文件,进程):
图 53
0x3F61 ID – 创建目录
恶意二进制文件能够使用 CreateDirectoryA 方法创建目录:
图 54
0x1139 ID——更改进程的当前目录
SetCurrentDirectoryA 用于执行所需的操作(见图 55)。
图 55
0x3C9F ID——获取进程的当前目录
恶意软件通过调用 GetCurrentDirectoryW API 提取进程的当前目录:
图 56
0x8F40 ID – 删除目录
仅当目标目录为空时,该过程才会使用 RemoveDirectoryA 删除该目录:
图 57
0x0A32 ID – 检索文件/目录的最后写入时间
使用 FindFirstFileW 和 FindNextFileW 函数在当前目录中枚举文件:
图 58
图 59
对于与模式匹配的每个文件或目录,二进制文件都会调用 CreateFileW API:
图 60
该过程通过调用 GetFileTime 函数来检索上次写入时间:
图 61
使用 FileTimeToSystemTime 将文件时间转换为系统时间格式:
图 62
最后,将上述时间转换为当前活动时区:
图 63
0x3D1D ID – 更改桌面壁纸
恶意进程打开包含桌面壁纸的“TranscodedWallpaper”文件:
图 64
上述文件填充了从 C2 服务器接收的内容(图 65)。
图 65
SystemParametersInfoA 方法用于更改桌面壁纸(0x14 = SPI_SETDESKWALLPAPER,0x1 = SPIF_UPDATEINIFILE):
图 66
0xD53F ID – 检索用户名
该命令用于获取与当前线程关联的用户名:
图 67
0x0609 ID – 检索可用的磁盘驱动器
恶意软件通过调用 GetLogicalDrives API 提取包含可用磁盘驱动器的位掩码,如图 68 所示。
图 68
0xC144 ID – 提取所有设备驱动程序
EnumDeviceDrivers 用于获取所有设备驱动程序的加载地址:
图 69
使用上述地址,进程通过调用GetDeviceDriverBaseNameA方法来检索设备驱动程序的名称:
图 70
0x0A01 ID – 计算自系统启动以来经过的分钟数
GetTickCount函数用于提取毫秒数,并执行简单的计算(见图71)。
图 71
0x73E6 ID——参数欺骗
獾有能力通过修改进程环境块(PEB)来隐藏参数:
图 72
0x8AFA ID – 父 PID 欺骗
此命令可用于欺骗父进程 ID,以逃避 EDR 软件或其他解决方案:
图 73
0xC929 ID – 提取子进程名称
该二进制文件可以产生多个进程,可以使用此命令显示这些进程(图 74)。
图 74
0x9E72 ID – 显示管道名称
恶意软件显示先前创建的管道的名称:
图 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 暴力攻击载荷
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论