漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-085567
漏洞标题:搜狗浏览器远程命令执行三
相关厂商:搜狗
漏洞作者: gainover
提交时间:2014-12-02 14:43
修复时间:2015-03-02 14:44
公开时间:2015-03-02 14:44
漏洞类型:远程代码执行
危害等级:高
自评Rank:20
漏洞状态:厂商已经确认
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-12-02: 细节已通知厂商并且等待厂商处理中
2014-12-05: 厂商已经确认,细节仅向厂商公开
2014-12-08: 细节向第三方安全合作伙伴开放
2015-01-29: 细节向核心白帽子及相关领域专家公开
2015-02-08: 细节向普通白帽子公开
2015-02-18: 细节向实习白帽子公开
2015-03-02: 细节向公众公开
简要描述:
搜狗浏览器又发布更新了,是不是修好了呢?
这一次,搜狗针对性的对上一个漏洞中的多个点进行了修改,但是有些地方依然欠缺考虑。使得我们可以继续绕过搜狗的修复措施,实现远程命令执行。
另外,不用故意压低rank值了,我不会去SGSRC的。
详细说明:
1. 首先列一列搜狗针对上一个漏洞做了哪些修复性的措施。
A. 限制了 location.href 直接向 se-extension跳转,即
location.href='se-extension://ext-1055834318/signin.html'; 会打开一个“空白页”。
同理:
window.open('se-extension://ext-1055834318/signin.html'); 也会打开一个“空白页”
B. 修复了 se-extension://ext-1055834318/signin.html 中的XSS,即 com.sogou.snapTaker 这个插件更新至了0.89版本。
这一次对url的判断,没有再次犯错,因此这个XSS这次确实是被修复了
C. 改变了npgamecenterlite.dll中startExe API的代码,即com.sogou.gamecenter这个插件升级到了1.0.7版本。(不过目录下的js/seed.js里的代码的插件版本号忘了改了哦?,var PLUG_VERSION = global['PLUG_VERSION'] = "1.0.6";)
http://img.wan.sogou.com/cdn/gamehelperV0.3/v1.0.6/app.js?t=1.0.6
里的startExe的代码如下:
进过分析发现,这个版本中,startExe具有3个参数,函数伪代码大概如下:
而在上一个版本中,startExe只有2个参数,startExe("EXE路径",回调函数);
这里改为3个参数的目的,应该是为了让startExe只能调用某一个路径下的sogouminigamepacker.exe程序。
---------------------------------------------------------------------
2. 接着我们一一来绕过或是寻找新的漏洞来应对上面的修复措施。
A. 无法location.href了,而window.open也是打开了一个 about:blank,但是分析发现,在about:blank时可以使用 location.href='se-extension://ext-1055834318/signin.html' 跳转到se-extension页面。这样一来,我们可以使用下面的方法:
如下图所示:
当然,在我们自己域名下执行window.open 会被拦截,但是由于搜狗浏览器的机制,如果window.open在 *.sogou.com下执行则不会被浏览器所拦截。因此,我们要自动执行window.open,可以结合sogou.com域下的一个XSS来进行,由于比较懒,我翻了翻乌云上以前的搜狗的漏洞,有一个没有修复的XSS。
该XSS来自一个一年前的漏洞报告:《 WooYun: 搜狗浏览器远程命令执行漏洞 》
到了这里,我们突破了第一个修复,可以实现打开任意 se-extension:// 下的页面。
B. XSS被修复了,我们得找一个新的XSS。
我们分析到se-extension://ext740107210/html/balloon.html时发现该页面会调用http://img.wan.sogou.com/cdn/gamehelperV0.3/v1.0.5/balloon/main.js这个文件,其中有以下一段代码:
可以看到,这里是一个 onmessage,且代码里并没有对 数据的origin以及数据内容进行判断,就进入到了 sogouExplorer.tabs.create 函数,
如果做过chrome插件开发的朋友,可能大概推出这个 sogouExplorer.tabs.create 应该是用来创建新的 浏览器tab页面的API,那么会有什么安全问题呢?
当 url为 javascript:alert(1); 的时候,sogouExplorer.tabs.create 相当于在当前页面下执行了javascript:alert(1); 因此,结合这个XSS,实际上我们可以在se-extension://ext740107210/html/balloon.html下执行任意XSS代码了。
C. startExe函数进行了修改,那么那种修改可以防止执行任意命令吗?
我们首先来猜测一下对方的判断规则,
document.getElementById("embed1").startExe("calc.exe","",function(){console.log(arguments)});
如果是上面这样,按照前面的判断,会执行 calc.exesogouminigamepacker.exe,当然是不会执行,
我们加个空格,
document.getElementById("embed1").startExe("calc.exe ","",function(){console.log(arguments)});
这个理论上会执行 calc.exe sogouminigamepacker.exe ,后面的 sogouminigamepacker.exe 被当作了calc的参数。
但是这样还不行,测试发现只要出现了.exe就不行。
但是这里不需要exe也可以执行。
document.getElementById("embed1").startExe("calc ","",function(){console.log(arguments)});
结合上一个漏洞的利用代码,改改:
D. 最后一步,怎么调用到 document.getElementById("embed1").startExe 呢?
我们存在XSS的页面是
se-extension://ext740107210/html/balloon.html ,
我们存在document.getElementById("embed1").startExe 的页面是:
se-extension://ext740107210/html/back.html
可以看到,这2个页面都是属于同一个插件(ext740107210)的页面,
并且 se-extension://ext740107210/html/back.html 是 se-extension://ext740107210/html/balloon.html 的 backgroud page.
在插件开发中,搜狗浏览器为插件页面提供了一个API,以便快速获得 background page的window对象。
sogouExplorer.runtime.getBackgroundPage(),参见(http://ie.sogou.com/open/doc/?id=2_16&title=runtime)
因此,我们可以很容易把前面的代码变为以下方式:
-----------------------------------------------------------------
3. 最后的利用代码如下:
sogouhehehe.html
sogou2.js
漏洞证明:
修复方案:
1. 继续修复window.open
2. 修复balloon.html的XSS
2. 继续修复startExe函数的设计逻辑
版权声明:转载请注明来源 gainover@乌云
漏洞回应
厂商回应:
危害等级:中
漏洞Rank:5
确认时间:2014-12-05 15:11
厂商回复:
非常感谢您的支持,问题已着手处理,欢迎到SGSRC提交漏洞。
最新状态:
暂无