From 5efd0b6cd1a8d04e7b1826037ec8af16cf2a325b Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 8 Sep 2025 02:44:13 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/electron --- .../electron-desktop-apps/README.md | 314 ++++++++++++------ 1 file changed, 217 insertions(+), 97 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index d9d672d4b..34c6618c8 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -1,17 +1,17 @@ -# Electron Desktop Apps +# Εφαρμογές Electron για Desktop {{#include ../../../banners/hacktricks-training.md}} ## Εισαγωγή -Το Electron συνδυάζει έναν τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν ορισμένοι από τους μηχανισμούς ασφαλείας των σύγχρονων προγραμμάτων περιήγησης. +Electron συνδυάζει ένα τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν κάποιοι μηχανισμοί ασφάλειας των σύγχρονων browsers. -Συνήθως μπορείς να βρεις τον κώδικα της εφαρμογής electron μέσα σε μια εφαρμογή `.asar`, προκειμένου να αποκτήσεις τον κώδικα πρέπει να τον εξαγάγεις: +Συνήθως μπορείς να βρεις τον κώδικα της εφαρμογής Electron μέσα σε ένα αρχείο `.asar`. Για να αποκτήσεις τον κώδικα πρέπει να τον εξαγάγεις: ```bash 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` όπου έχουν ρυθμιστεί οι ρυθμίσεις ασφαλείας. +Στον πηγαίο κώδικα μιας Electron app, μέσα στο `packet.json`, μπορείτε να βρείτε το `main.js` που έχει οριστεί και στο οποίο ορίζονται οι ρυθμίσεις ασφάλειας. ```json { "name": "standard-notes", @@ -19,12 +19,12 @@ npx asar extract-file app.asar main.js #Extract just a file ``` Το Electron έχει 2 τύπους διεργασιών: -- Κύρια Διεργασία (έχει πλήρη πρόσβαση στο NodeJS) -- Διεργασία Απόδοσης (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφαλείας) +- Main Process (έχει πλήρη πρόσβαση στο NodeJS) +- Renderer Process (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφαλείας) ![](<../../../images/image (182).png>) -Μια **διεργασία απόδοσης** θα είναι ένα παράθυρο προγράμματος περιήγησης που φορτώνει ένα αρχείο: +Μια **renderer process** θα είναι ένα παράθυρο browser που φορτώνει ένα αρχείο: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,20 +32,20 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Οι ρυθμίσεις της **διαδικασίας renderer** μπορούν να **ρυθμιστούν** στη **κύρια διαδικασία** μέσα στο αρχείο main.js. Ορισμένες από τις ρυθμίσεις θα **αποτρέψουν την εφαρμογή Electron να αποκτήσει RCE** ή άλλες ευπάθειες αν οι **ρυθμίσεις είναι σωστά ρυθμισμένες**. +Οι ρυθμίσεις της **renderer process** μπορούν να **διαμορφωθούν** στην **main process** μέσα στο αρχείο main.js. Ορισμένες από αυτές τις ρυθμίσεις θα **αποτρέψουν το Electron application από το να αποκτήσει RCE** ή άλλες ευπάθειες εάν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**. -Η εφαρμογή electron **μπορεί να έχει πρόσβαση στη συσκευή** μέσω των Node APIs, αν και μπορεί να ρυθμιστεί για να το αποτρέψει: +Η εφαρμογή Electron μπορεί να αποκτήσει πρόσβαση στη συσκευή μέσω Node apis, αν και μπορεί να ρυθμιστεί ώστε να το αποτρέψει: -- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι ενεργοποιημένο, επιτρέπει την πρόσβαση σε χαρακτηριστικά του node από τη διαδικασία renderer. -- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι απενεργοποιημένο, οι κύριες και οι διαδικασίες renderer δεν είναι απομονωμένες. -- **`preload`** - κενό από προεπιλογή. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι απενεργοποιημένο από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS. +- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι `on`, επιτρέπει την πρόσβαση σε Node features από τη renderer process. +- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι `off`, οι main και renderer processes δεν είναι απομονωμένες. +- **`preload`** - είναι κενό από προεπιλογή. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι `off` από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS. - Node Integration σε Workers -- **`nodeIntegrationInSubframes`** - είναι `off` από προεπιλογή. -- Αν η **`nodeIntegration`** είναι **ενεργοποιημένη**, αυτό θα επιτρέψει τη χρήση των **Node.js APIs** σε ιστοσελίδες που είναι **φορτωμένες σε iframes** μέσα σε μια εφαρμογή Electron. -- Αν η **`nodeIntegration`** είναι **απενεργοποιημένη**, τότε τα preload θα φορτωθούν στο iframe. +- **`nodeIntegrationInSubframes`**- είναι `off` από προεπιλογή. +- Αν το **`nodeIntegration`** είναι **enabled**, αυτό θα επέτρεπε τη χρήση των **Node.js APIs** σε web pages που είναι **φορτωμένες σε iframes** μέσα σε μια Electron application. +- Αν το **`nodeIntegration`** είναι **disabled**, τότε τα preloads θα φορτωθούν στο iframe -Παράδειγμα ρύθμισης: +Παράδειγμα διαμόρφωσης: ```javascript const mainWindowOptions = { title: "Discord", @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Ορισμένα **RCE payloads** από [εδώ](https://7as.es/electron/nodeIntegration_rce.txt): +Μερικά **RCE payloads** από [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### Capture traffic +### Καταγραφή traffic -Τροποποιήστε τη ρύθμιση start-main και προσθέστε τη χρήση ενός proxy όπως: +Τροποποιήστε τη διαμόρφωση start-main και προσθέστε τη χρήση ενός proxy όπως: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` ## Electron Local Code Injection -Αν μπορείτε να εκτελέσετε το Electron App τοπικά, είναι πιθανό να μπορέσετε να το κάνετε να εκτελεί αυθαίρετο κώδικα javascript. Δείτε πώς στο: +Αν μπορείτε να εκτελέσετε τοπικά μια Electron App, είναι πιθανό να καταφέρετε να την κάνετε να εκτελέσει αυθαίρετο javascript κώδικα. Δείτε πώς στο: {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -111,7 +111,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" /> ## RCE: XSS + nodeIntegration -Αν το **nodeIntegration** είναι ρυθμισμένο σε **on**, το JavaScript μιας ιστοσελίδας μπορεί να χρησιμοποιήσει εύκολα τις δυνατότητες του Node.js απλά καλώντας το `require()`. Για παράδειγμα, ο τρόπος εκτέλεσης της εφαρμογής calc στα Windows είναι: +Αν το **nodeIntegration** είναι ρυθμισμένο σε **on**, το JavaScript μιας σελίδας web μπορεί να χρησιμοποιήσει λειτουργίες του Node.js εύκολα απλώς καλώντας τη `require()`. Για παράδειγμα, ο τρόπος εκτέλεσης της εφαρμογής calc στα Windows είναι: ```html ``` -> [!NOTE] > **Αν το `contextIsolation` είναι ενεργοποιημένο, αυτό δεν θα λειτουργήσει** +> [!NOTE] > **Αν το `contextIsolation` είναι ενεργοποιημένο, αυτό δεν θα δουλέψει** ## RCE: XSS + contextIsolation -Το _**contextIsolation**_ εισάγει **χωριστά συμφραζόμενα μεταξύ των σεναρίων της ιστοσελίδας και του εσωτερικού κώδικα JavaScript του Electron** έτσι ώστε η εκτέλεση JavaScript κάθε κώδικα να μην επηρεάζει η μία την άλλη. Αυτή είναι μια απαραίτητη δυνατότητα για να εξαλειφθεί η πιθανότητα RCE. +Το _**contextIsolation**_ εισάγει τους **διαχωρισμένους contexts μεταξύ των scripts της web σελίδας και του internal JavaScript κώδικα του Electron** ώστε η εκτέλεση JavaScript του κάθε κομματιού κώδικα να μην επηρεάζει το άλλο. Πρόκειται για μια απαραίτητη λειτουργία για να εξαλειφθεί η πιθανότητα RCE. -Αν τα συμφραζόμενα δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί να: +Αν τα contexts δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί: -1. Εκτελέσει **τυχαίο JavaScript στον renderer** (XSS ή πλοήγηση σε εξωτερικές ιστοσελίδες) -2. **Επαναγράψει τη встроμένη μέθοδο** που χρησιμοποιείται στον preload ή στον εσωτερικό κώδικα του Electron σε δική του συνάρτηση -3. **Ενεργοποιήσει** τη χρήση της **επαναγραμμένης συνάρτησης** -4. RCE; +1. Εκτελέσει **arbitrary JavaScript in renderer** (XSS ή πλοήγηση σε εξωτερικές σελίδες) +2. **Αντικαταστήσει την built-in μέθοδο** που χρησιμοποιείται στο preload ή στον internal κώδικα του Electron για να αποκτήσει έλεγχο της συνάρτησης +3. **Προκαλέσει** τη χρήση της **αντικαταστημένης συνάρτησης** +4. RCE? + +There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: -Υπάρχουν 2 μέρη όπου οι встроμένες μέθοδοι μπορούν να επαναγραφούν: Στον κώδικα preload ή στον εσωτερικό κώδικα του 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}} -### Παράκαμψη γεγονότος κλικ +### Παράκαμψη click event -Αν υπάρχουν περιορισμοί που εφαρμόζονται όταν κάνετε κλικ σε έναν σύνδεσμο, μπορεί να είστε σε θέση να τους παρακάμψετε **κάνοντας ένα μεσαίο κλικ** αντί για ένα κανονικό αριστερό κλικ. +Αν υπάρχουν περιορισμοί όταν κάνετε click σε ένα link, ίσως να μπορείτε να τους παρακάμψετε **κάνoντας middle click** αντί για το κανονικό left click ```javascript window.addEventListener('click', (e) => { ``` -## RCE μέσω shell.openExternal +## RCE via shell.openExternal -Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα, ελέγξτε [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) και [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) +Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα δείτε [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) και [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -Κατά την ανάπτυξη μιας εφαρμογής Electron desktop, είναι κρίσιμο να διασφαλιστούν οι σωστές ρυθμίσεις για το `nodeIntegration` και το `contextIsolation`. Είναι αποδεκτό ότι η **εκτέλεση απομακρυσμένου κώδικα (RCE)** από την πλευρά του πελάτη που στοχεύει σε preload scripts ή στον εγγενή κώδικα του Electron από τη βασική διαδικασία αποτρέπεται αποτελεσματικά με αυτές τις ρυθμίσεις σε εφαρμογή. +Κατά την ανάπτυξη μιας Electron desktop εφαρμογής, η διασφάλιση των σωστών ρυθμίσεων για `nodeIntegration` και `contextIsolation` είναι κρίσιμη. Έχει αποδειχθεί ότι **client-side remote code execution (RCE)** που στοχεύει preload scripts ή Electron's native code από τη main process αποτρέπεται αποτελεσματικά με αυτές τις ρυθμίσεις. -Όταν ένας χρήστης αλληλεπιδρά με συνδέσμους ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένοι ακροατές γεγονότων, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής: +Όταν ένας χρήστης αλληλεπιδρά με links ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένα event listeners, τα οποία είναι κρίσιμα για την ασφάλεια και τη λειτουργικότητα της εφαρμογής: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -Αυτοί οι ακροατές είναι **υπερκαλυμμένοι από την επιτραπέζια εφαρμογή** για να υλοποιήσουν τη δική τους **λογική επιχειρήσεων**. Η εφαρμογή αξιολογεί αν ένας πλοηγημένος σύνδεσμος θα πρέπει να ανοιχτεί εσωτερικά ή σε έναν εξωτερικό φυλλομετρητή. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, υποδεικνύει ότι ο σύνδεσμος θα πρέπει να ανοιχτεί εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`. +Αυτοί οι listeners είναι **υπερκαθορισμένοι από την επιτραπέζια εφαρμογή** για να υλοποιήσουν τη δική της **business logic**. Η εφαρμογή αξιολογεί εάν ένας πλοηγημένος σύνδεσμος πρέπει να ανοίξει εσωτερικά ή σε εξωτερικό web browser. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοίξει εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`. **Εδώ είναι ένας απλοποιημένος ψευδοκώδικας:** @@ -200,11 +203,11 @@ webContents.on("will-navigate", function (event, url) {} ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Οι καλύτερες πρακτικές ασφαλείας του Electron JS προειδοποιούν κατά της αποδοχής μη αξιόπιστου περιεχομένου με τη συνάρτηση `openExternal`, καθώς αυτό θα μπορούσε να οδηγήσει σε RCE μέσω διαφόρων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να ενεργοποιήσουν RCE. Για λεπτομερείς παραδείγματα και περαιτέρω εξήγηση σχετικά με αυτό το θέμα, μπορεί κανείς να ανατρέξει [σε αυτό το πόρο](https://positive.security/blog/url-open-rce#windows-10-19042), ο οποίος περιλαμβάνει παραδείγματα πρωτοκόλλων Windows ικανά να εκμεταλλευτούν αυτή την ευπάθεια. +Οι βέλτιστες πρακτικές ασφαλείας για το Electron JS συστήνουν να μην γίνεται αποδοχή μη αξιόπιστου περιεχομένου με τη συνάρτηση `openExternal`, καθώς αυτό μπορεί να οδηγήσει σε RCE μέσω διάφορων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να ενεργοποιήσουν RCE. Για αναλυτικά παραδείγματα και περαιτέρω εξήγηση πάνω σε αυτό το θέμα, μπορείτε να ανατρέξετε σε [αυτόν τον πόρο](https://positive.security/blog/url-open-rce#windows-10-19042), ο οποίος περιλαμβάνει παραδείγματα Windows protocol ικανά να εκμεταλλευτούν αυτή την ευπάθεια. -Στο macos, η συνάρτηση `openExternal` μπορεί να εκμεταλλευτεί για να εκτελέσει αυθαίρετες εντολές όπως στο `shell.openExternal('file:///System/Applications/Calculator.app')`. +Στο macos, η συνάρτηση `openExternal` μπορεί να εκμεταλλευτεί για την εκτέλεση αυθαίρετων εντολών, π.χ. `shell.openExternal('file:///System/Applications/Calculator.app')`. -**Παραδείγματα εκμεταλλεύσεων πρωτοκόλλων Windows περιλαμβάνουν:** +**Παραδείγματα Windows protocol exploits περιλαμβάνουν:** ```html ``` -## RCE: webviewTag + ευάλωτο preload IPC + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -Αυτή η ευπάθεια μπορεί να βρεθεί σε **[αυτή την αναφορά](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +Αυτή η vuln μπορεί να βρεθεί στο **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. -Το **webviewTag** είναι μια **παρωχημένη δυνατότητα** που επιτρέπει τη χρήση του **NodeJS** στη **διαδικασία απόδοσης**, η οποία θα πρέπει να απενεργοποιείται καθώς επιτρέπει τη φόρτωση ενός script μέσα στο πλαίσιο preload όπως: +Το **webviewTag** είναι μια **deprecated feature** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, η οποία πρέπει να απενεργοποιηθεί καθώς επιτρέπει τη φόρτωση ενός script μέσα στο preload context όπως: ```xml ``` -Ως εκ τούτου, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτή την ετικέτα για να **φορτώσει ένα αυθαίρετο script προφόρτωσης**. +Επομένως, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτό το tag για να **load an arbitrary preload script**. -Αυτό το script προφόρτωσης καταχράστηκε στη συνέχεια για να καλέσει μια **ευάλωτη υπηρεσία IPC (`skype-new-window`)** που καλούσε **`shell.openExternal`** για να αποκτήσει RCE: +Αυτό το preload script αξιοποιήθηκε στη συνέχεια για να καλέσει μια **vulnerable IPC service (`skype-new-window`)**, η οποία με τη σειρά της καλούσε **`shell.openExternal`** για να επιτύχει RCE: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -247,11 +250,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## Ανάγνωση Εσωτερικών Αρχείων: XSS + contextIsolation -**Η απενεργοποίηση του `contextIsolation` επιτρέπει τη χρήση των ετικετών ``**, παρόμοια με τις `