Translated ['src/network-services-pentesting/pentesting-web/electron-des

This commit is contained in:
Translator 2025-01-07 18:15:58 +00:00
parent 48da87fee0
commit 4aa03203b2
3 changed files with 155 additions and 44 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@ scripts/*
book book
book/* book/*
hacktricks-preprocessor.log hacktricks-preprocessor.log
hacktricks-preprocessor-error.log

View File

@ -7,7 +7,14 @@ from os import path
from urllib.request import urlopen, Request from urllib.request import urlopen, Request
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
logging.basicConfig(filename='hacktricks-preprocessor.log', filemode='w', encoding='utf-8', level=logging.DEBUG) logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='hacktricks-preprocessor.log', mode='w', encoding='utf-8')
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
handler2 = logging.FileHandler(filename='hacktricks-preprocessor-error.log', mode='w', encoding='utf-8')
handler2.setLevel(logging.ERROR)
logger.addHandler(handler2)
def findtitle(search ,obj, key, path=(),): def findtitle(search ,obj, key, path=(),):
@ -27,7 +34,7 @@ def findtitle(search ,obj, key, path=(),):
def ref(matchobj): def ref(matchobj):
logger.debug(f'Match: {matchobj.groups(0)[0].strip()}') logger.debug(f'Ref match: {matchobj.groups(0)[0].strip()}')
href = matchobj.groups(0)[0].strip() href = matchobj.groups(0)[0].strip()
title = href title = href
if href.startswith("http://") or href.startswith("https://"): if href.startswith("http://") or href.startswith("https://"):
@ -45,19 +52,29 @@ def ref(matchobj):
try: try:
if href.endswith("/"): if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder href = href+"README.md" # Fix if ref points to a folder
chapter, _path = findtitle(href, book, "source_path") if "#" in href:
logger.debug(f'Recursive title search result: {chapter["name"]}') chapter, _path = findtitle(href.split("#")[0], book, "source_path")
title = chapter['name'] title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
except Exception as e: except Exception as e:
try: try:
dir = path.dirname(current_chapter['source_path']) dir = path.dirname(current_chapter['source_path'])
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}') logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path") if "#" in href:
logger.debug(f'Recursive title search result: {chapter["name"]}') chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = chapter['name'] title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = chapter["name"]
logger.debug(f'Recursive title search result: {chapter["name"]}')
except Exception as e: except Exception as e:
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}') logger.debug(e)
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}') logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
sys.exit(1) sys.exit(1)
@ -69,6 +86,7 @@ def ref(matchobj):
return result return result
def files(matchobj): def files(matchobj):
logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}') logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}')
href = matchobj.groups(0)[0].strip() href = matchobj.groups(0)[0].strip()
@ -76,19 +94,19 @@ def files(matchobj):
try: try:
for root, dirs, files in os.walk(os.getcwd()+'/src/files'): for root, dirs, files in os.walk(os.getcwd()+'/src/files'):
logger.debug(root)
logger.debug(files)
if href in files: if href in files:
title = href title = href
logger.debug(f'File search result: {os.path.join(root, href)}') logger.debug(f'File search result: {os.path.join(root, href)}')
except Exception as e: except Exception as e:
logger.debug(e) logger.debug(e)
logger.debug(f'Error searching file: {href}') logger.error(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1) sys.exit(1)
if title=="": if title=="":
logger.debug(f'Error searching file: {href}') logger.error(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1) sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>""" template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
@ -97,6 +115,7 @@ def files(matchobj):
return result return result
def add_read_time(content): def add_read_time(content):
regex = r'(<\/style>\n# .*(?=\n))' regex = r'(<\/style>\n# .*(?=\n))'
new_content = re.sub(regex, lambda x: x.group(0) + "\n\nReading time: {{ #reading_time }}", content) new_content = re.sub(regex, lambda x: x.group(0) + "\n\nReading time: {{ #reading_time }}", content)
@ -126,15 +145,15 @@ if __name__ == '__main__':
context, book = json.load(sys.stdin) context, book = json.load(sys.stdin)
logger.debug(f"Context: {context}") logger.debug(f"Context: {context}")
logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}")
for chapter in iterate_chapters(book['sections']): for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}") logger.debug(f"Chapter: {chapter['path']}")
current_chapter = chapter current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}' # regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n#]*(?:#(.*))?)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content']) new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}' regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
new_content = re.sub(regex, files, chapter['content']) new_content = re.sub(regex, files, new_content)
new_content = add_read_time(new_content) new_content = add_read_time(new_content)
chapter['content'] = new_content chapter['content'] = new_content

View File

@ -4,7 +4,7 @@
## Εισαγωγή ## Εισαγωγή
Το Electron συνδυάζει έναν τοπικό backend (με **NodeJS**) και έναν frontend (**Chromium**), αν και του λείπουν ορισμένοι από τους μηχανισμούς ασφαλείας των σύγχρονων προγραμμάτων περιήγησης. Το Electron συνδυάζει ένα τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν μερικοί από τους μηχανισμούς ασφαλείας των σύγχρονων προγραμμάτων περιήγησης.
Συνήθως μπορείς να βρεις τον κώδικα της εφαρμογής electron μέσα σε μια εφαρμογή `.asar`, προκειμένου να αποκτήσεις τον κώδικα πρέπει να τον εξαγάγεις: Συνήθως μπορείς να βρεις τον κώδικα της εφαρμογής electron μέσα σε μια εφαρμογή `.asar`, προκειμένου να αποκτήσεις τον κώδικα πρέπει να τον εξαγάγεις:
```bash ```bash
@ -32,15 +32,15 @@ let win = new BrowserWindow()
//Open Renderer Process //Open Renderer Process
win.loadURL(`file://path/to/index.html`) win.loadURL(`file://path/to/index.html`)
``` ```
Οι ρυθμίσεις της **διαδικασίας renderer** μπορούν να **ρυθμιστούν** στη **κύρια διαδικασία** μέσα στο αρχείο main.js. Ορισμένες από τις ρυθμίσεις θα **αποτρέψουν την εφαρμογή Electron να αποκτήσει RCE** ή άλλες ευπάθειες αν οι **ρυθμίσεις είναι σωστά ρυθμισμένες**. Οι ρυθμίσεις της **διαδικασίας απόδοσης** μπορούν να **ρυθμιστούν** στη **κύρια διαδικασία** μέσα στο αρχείο main.js. Ορισμένες από τις ρυθμίσεις θα **αποτρέψουν την εφαρμογή Electron να αποκτήσει RCE** ή άλλες ευπάθειες αν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
Η εφαρμογή electron **μπορεί να έχει πρόσβαση στη συσκευή** μέσω των Node APIs, αν και μπορεί να ρυθμιστεί για να το αποτρέψει: Η εφαρμογή electron **μπορεί να έχει πρόσβαση στη συσκευή** μέσω των Node APIs, αν και μπορεί να ρυθμιστεί για να το αποτρέψει:
- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι ενεργοποιημένο, επιτρέπει την πρόσβαση σε χαρακτηριστικά του node από τη διαδικασία renderer. - **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι ενεργοποιημένο, επιτρέπει την πρόσβαση σε χαρακτηριστικά του node από τη διαδικασία απόδοσης.
- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι απενεργοποιημένο, οι κύριες και οι διαδικασίες renderer δεν είναι απομονωμένες. - **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι απενεργοποιημένο, οι κύριες και οι διαδικασίες απόδοσης δεν είναι απομονωμένες.
- **`preload`** - κενό από προεπιλογή. - **`preload`** - κενό από προεπιλογή.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι απενεργοποιημένο από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS. - [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι απενεργοποιημένο από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS.
- Node Integration σε Workers - Node Integration σε Εργάτες
- **`nodeIntegrationInSubframes`** - είναι `off` από προεπιλογή. - **`nodeIntegrationInSubframes`** - είναι `off` από προεπιλογή.
- Αν **`nodeIntegration`** είναι **ενεργοποιημένο**, αυτό θα επιτρέψει τη χρήση των **Node.js APIs** σε ιστοσελίδες που είναι **φορτωμένες σε iframes** μέσα σε μια εφαρμογή Electron. - Αν **`nodeIntegration`** είναι **ενεργοποιημένο**, αυτό θα επιτρέψει τη χρήση των **Node.js APIs** σε ιστοσελίδες που είναι **φορτωμένες σε iframes** μέσα σε μια εφαρμογή Electron.
- Αν **`nodeIntegration`** είναι **απενεργοποιημένο**, τότε τα preload θα φορτωθούν στο iframe. - Αν **`nodeIntegration`** είναι **απενεργοποιημένο**, τότε τα preload θα φορτωθούν στο iframe.
@ -152,16 +152,16 @@ runCalc()
## RCE: XSS + contextIsolation ## RCE: XSS + contextIsolation
Η _**contextIsolation**_ εισάγει **χωριστά συμφραζόμενα μεταξύ των σεναρίων της ιστοσελίδας και του εσωτερικού κώδικα JavaScript του Electron** έτσι ώστε η εκτέλεση JavaScript κάθε κώδικα να μην επηρεάζει η μία την άλλη. Αυτή είναι μια απαραίτητη δυνατότητα για την εξάλειψη της πιθανότητας RCE. Το _**contextIsolation**_ εισάγει **χωριστά συμφραζόμενα μεταξύ των σεναρίων της ιστοσελίδας και του εσωτερικού κώδικα JavaScript του Electron** έτσι ώστε η εκτέλεση JavaScript κάθε κώδικα να μην επηρεάζει η μία την άλλη. Αυτή είναι μια απαραίτητη δυνατότητα για την εξάλειψη της πιθανότητας RCE.
Αν τα συμφραζόμενα δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί να: Αν τα συμφραζόμενα δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί να:
1. Εκτελέσει **τυχαίο JavaScript στον renderer** (XSS ή πλοήγηση σε εξωτερικές τοποθεσίες) 1. Εκτελέσει **τυχαίο JavaScript στον renderer** (XSS ή πλοήγηση σε εξωτερικές τοποθεσίες)
2. **Επαναγράψει τη встроμένη μέθοδο** που χρησιμοποιείται στον preload ή στον εσωτερικό κώδικα του Electron σε δική του συνάρτηση 2. **Αντικαταστήσει τη встроμένη μέθοδο** που χρησιμοποιείται στον preload ή στον εσωτερικό κώδικα του Electron με τη δική του συνάρτηση
3. **Ενεργοποιήσει** τη χρήση της **επαναγραμμένης συνάρτησης** 3. **Ενεργοποιήσει** τη χρήση της **αντικατεστημένης συνάρτησης**
4. RCE; 4. RCE;
Υπάρχουν 2 μέρη όπου οι встроμένες μέθοδοι μπορούν να επαναγραφούν: Στον κώδικα preload ή στον εσωτερικό κώδικα του Electron: Υπάρχουν 2 μέρη όπου οι встроμένες μέθοδοι μπορούν να αντικατασταθούν: Στον κώδικα preload ή στον εσωτερικό κώδικα του Electron:
{{#ref}} {{#ref}}
electron-contextisolation-rce-via-preload-code.md electron-contextisolation-rce-via-preload-code.md
@ -181,18 +181,18 @@ electron-contextisolation-rce-via-ipc.md
```javascript ```javascript
window.addEventListener('click', (e) => { window.addEventListener('click', (e) => {
``` ```
## RCE μέσω του shell.openExternal ## RCE μέσω 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`. Είναι αποδεδειγμένο ότι η **εκτέλεση απομακρυσμένου κώδικα (RCE)** από την πλευρά του πελάτη που στοχεύει σε preload scripts ή στον εγγενή κώδικα του Electron από τη βασική διαδικασία αποτρέπεται αποτελεσματικά με αυτές τις ρυθμίσεις σε εφαρμογή.
Κατά την αλληλεπίδραση ενός χρήστη με συνδέσμους ή το άνοιγμα νέων παραθύρων, ενεργοποιούνται συγκεκριμένοι ακροατές γεγονότων, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής: Όταν ένας χρήστης αλληλεπιδρά με συνδέσμους ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένοι ακροατές γεγονότων, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:
```javascript ```javascript
webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {} webContents.on("will-navigate", function (event, url) {}
``` ```
Αυτοί οι ακροατές είναι **υπερκαλυμμένοι από την επιτραπέζια εφαρμογή** για να υλοποιήσουν τη δική τους **επιχειρηματική λογική**. Η εφαρμογή αξιολογεί αν ένας πλοηγημένος σύνδεσμος θα πρέπει να ανοιχτεί εσωτερικά ή σε έναν εξωτερικό φυλλομετρητή ιστού. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, υποδεικνύει ότι ο σύνδεσμος θα πρέπει να ανοιχτεί εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`. Αυτοί οι ακροατές είναι **υπερκαλυμμένοι από την επιτραπέζια εφαρμογή** για να υλοποιήσουν τη δική τους **επιχειρηματική λογική**. Η εφαρμογή αξιολογεί αν ένας πλοηγημένος σύνδεσμος θα πρέπει να ανοιχτεί εσωτερικά ή σε έναν εξωτερικό φυλλομετρητή. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, υποδεικνύει ότι ο σύνδεσμος θα πρέπει να ανοιχτεί εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
**Εδώ είναι ένας απλοποιημένος ψευδοκώδικας:** **Εδώ είναι ένας απλοποιημένος ψευδοκώδικας:**
@ -200,9 +200,11 @@ webContents.on("will-navigate", function (event, url) {}
![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) ![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 ικανά να εκμεταλλευτούν αυτή την ευπάθεια.
**Παραδείγματα εκμετάλλευσης πρωτοκόλλων Windows περιλαμβάνουν:** Στο macos, η συνάρτηση `openExternal` μπορεί να εκμεταλλευτεί για να εκτελέσει αυθαίρετες εντολές όπως στο `shell.openExternal('file:///System/Applications/Calculator.app')`.
**Παραδείγματα εκμεταλλεύσεων πρωτοκόλλων Windows περιλαμβάνουν:**
```html ```html
<script> <script>
window.open( window.open(
@ -228,7 +230,7 @@ window.open(
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>) ![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>)
Επιπλέον, μια άλλη μέθοδος για **την ανάγνωση ενός εσωτερικού αρχείου** κοινοποιείται, επισημαίνοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικών αρχείων σε μια εφαρμογή Electron desktop. Αυτό περιλαμβάνει την εισαγωγή ενός script για την εκμετάλλευση της εφαρμογής και την εξαγωγή δεδομένων: Επιπλέον, μια άλλη μέθοδος για **την ανάγνωση ενός εσωτερικού αρχείου** κοινοποιείται, επισημαίνοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικών αρχείων σε μια εφαρμογή Electron desktop. Αυτό περιλαμβάνει την έγχυση ενός script για την εκμετάλλευση της εφαρμογής και την εξαγωγή δεδομένων:
```html ```html
<br /><br /><br /><br /> <br /><br /><br /><br />
<h1> <h1>
@ -244,36 +246,124 @@ frames[0].document.body.innerText
</script> </script>
</h1> </h1>
``` ```
## **RCE: XSS + Παλιός Chromium** ## **RCE: XSS + Old Chromium**
Αν ο **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλιός** και υπάρχουν **γνωστές** **ευπάθειες** σε αυτόν, μπορεί να είναι δυνατό να **εκμεταλλευτείς το και να αποκτήσεις RCE μέσω ενός XSS**.\ Αν ο **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλιός** και υπάρχουν **γνωστές** **ευπάθειες** σε αυτόν, μπορεί να είναι δυνατό να **εκμεταλλευτείτε και να αποκτήσετε RCE μέσω ενός XSS**.\
Μπορείς να δεις ένα παράδειγμα σε αυτή τη **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/) Μπορείτε να δείτε ένα παράδειγμα σε αυτή τη **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
## **XSS Phishing μέσω εσωτερικού URL regex bypass** ## **XSS Phishing μέσω εσωτερικού URL regex bypass**
Υποθέτοντας ότι βρήκες ένα XSS αλλά **δεν μπορείς να ενεργοποιήσεις RCE ή να κλέψεις εσωτερικά αρχεία**, θα μπορούσες να προσπαθήσεις να το χρησιμοποιήσεις για να **κλέψεις διαπιστευτήρια μέσω phishing**. Υποθέτοντας ότι βρήκατε ένα XSS αλλά **δεν μπορείτε να ενεργοποιήσετε RCE ή να κλέψετε εσωτερικά αρχεία**, θα μπορούσατε να προσπαθήσετε να το χρησιμοποιήσετε για να **κλέψετε διαπιστευτήρια μέσω phishing**.
Πρώτα απ' όλα, πρέπει να ξέρεις τι συμβαίνει όταν προσπαθείς να ανοίξεις μια νέα διεύθυνση URL, ελέγχοντας τον κωδικό JS στο front-end: Πρώτα απ' όλα, πρέπει να ξέρετε τι συμβαίνει όταν προσπαθείτε να ανοίξετε μια νέα διεύθυνση URL, ελέγχοντας τον κωδικό JS στο front-end:
```javascript ```javascript
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below) 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) webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
``` ```
Η κλήση στο **`openInternally`** θα αποφασίσει αν το **link** θα **ανοίξει** στο **παράθυρο επιφάνειας εργασίας** καθώς είναι ένα link που ανήκει στην πλατφόρμα, **ή** αν θα ανοίξει στον **φυλλομετρητή ως πόρος τρίτου μέρους**. Η κλήση στο **`openInternally`** θα αποφασίσει αν το **link** θα **ανοίξει** στο **παράθυρο επιφάνειας εργασίας** καθώς είναι ένα link που ανήκει στην πλατφόρμα, **ή** αν θα ανοίξει στον **φυλλομετρητή ως πόρος τρίτου μέρους**.
Σε περίπτωση που η **regex** που χρησιμοποιείται από τη συνάρτηση είναι **ευάλωτη σε παρακάμψεις** (για παράδειγμα, **μη διαφεύγοντας τα σημεία των υποτομέων**) ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί το XSS για να **ανοίξει ένα νέο παράθυρο το οποίο** θα βρίσκεται στην υποδομή του επιτιθέμενου **ζητώντας διαπιστευτήρια** από τον χρήστη: Στην περίπτωση που η **regex** που χρησιμοποιείται από τη συνάρτηση είναι **ευάλωτη σε παρακάμψεις** (για παράδειγμα, **μη διαφεύγοντας τα σημεία των υποτομέων**) ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί το XSS για να **ανοίξει ένα νέο παράθυρο το οποίο** θα βρίσκεται στην υποδομή του επιτιθέμενου **ζητώντας διαπιστευτήρια** από τον χρήστη:
```html ```html
<script> <script>
window.open("<http://subdomainagoogleq.com/index.html>") window.open("<http://subdomainagoogleq.com/index.html>")
</script> </script>
``` ```
## **Εργαλεία** ## Remote module
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για την αναγνώριση κακών ρυθμίσεων και αντιανασφαλιστικών προτύπων σε εφαρμογές βασισμένες σε Electron. Το Electron Remote module επιτρέπει **στιγμιότυπα απόδοσης να έχουν πρόσβαση σε APIs της κύριας διαδικασίας**, διευκολύνοντας την επικοινωνία εντός μιας εφαρμογής Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφαλείας. Επεκτείνει την επιφάνεια επίθεσης της εφαρμογής, καθιστώντας την πιο ευάλωτη σε ευπάθειες όπως οι επιθέσεις cross-site scripting (XSS).
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) είναι ένα ανοιχτού κώδικα πρόσθετο για το VS Code για εφαρμογές Electron που χρησιμοποιεί το Electronegativity.
> [!TIP]
> Αν και το **remote** module εκθέτει ορισμένα APIs από την κύρια διαδικασία στις διαδικασίες απόδοσης, δεν είναι απλό να αποκτηθεί RCE μόνο με την κακή χρήση των συστατικών. Ωστόσο, τα συστατικά μπορεί να εκθέσουν ευαίσθητες πληροφορίες.
> [!WARNING]
> Πολλές εφαρμογές που εξακολουθούν να χρησιμοποιούν το remote module το κάνουν με τρόπο που **απαιτεί να είναι ενεργοποιημένο το NodeIntegration** στη διαδικασία απόδοσης, το οποίο είναι **μεγάλος κίνδυνος ασφαλείας**.
Από το Electron 14, το `remote` module του Electron μπορεί να ενεργοποιηθεί σε αρκετά βήματα λόγω λόγων ασφαλείας και απόδοσης, είναι **συνιστώμενο να μην το χρησιμοποιείτε**.
Για να το ενεργοποιήσετε, θα πρέπει πρώτα να **το ενεργοποιήσετε στη κύρια διαδικασία**:
```javascript
const remoteMain = require('@electron/remote/main')
remoteMain.initialize()
[...]
function createMainWindow() {
mainWindow = new BrowserWindow({
[...]
})
remoteMain.enable(mainWindow.webContents)
```
Στη συνέχεια, η διαδικασία απόδοσης μπορεί να εισάγει αντικείμενα από το module όπως:
```javascript
import { dialog, getCurrentWindow } from '@electron/remote'
```
Το **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** υποδεικνύει μερικές ενδιαφέρουσες **λειτουργίες** που εκτίθενται από το αντικείμενο **`app`** από το απομακρυσμένο module:
- **`app.relaunch([options])`**
- **Επαναλαμβάνει** την εφαρμογή **αποχωρώντας** από την τρέχουσα παρουσία και **εκκινώντας** μια νέα. Χρήσιμο για **ενημερώσεις εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
- **`app.setAppLogsPath([path])`**
- **Ορίζει** ή **δημιουργεί** έναν φάκελο για την αποθήκευση **καταγραφών εφαρμογής**. Οι καταγραφές μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- **Καταχωρεί** το τρέχον εκτελέσιμο ως τον **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε μια **προσαρμοσμένη διαδρομή** και **παραμέτρους** αν χρειαστεί.
- **`app.setUserTasks(tasks)`**
- **Προσθέτει** εργασίες στην **κατηγορία Εργασιών** στη **Λίστα Γρήγορων Συνδέσμων** (σε Windows). Κάθε εργασία μπορεί να ελέγξει πώς η εφαρμογή **εκκινείται** ή ποιες **παράμετροι** περνούν.
- **`app.importCertificate(options, callback)`**
- **Εισάγει** ένα **πιστοποιητικό PKCS#12** στο **κατάστημα πιστοποιητικών** του συστήματος (μόνο Linux). Ένα **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
- **`app.moveToApplicationsFolder([options])`**
- **Μετακινεί** την εφαρμογή στον **φάκελο Εφαρμογών** (σε macOS). Βοηθά να διασφαλιστεί μια **τυπική εγκατάσταση** για τους χρήστες Mac.
- **`app.setJumpList(categories)`**
- **Ορίζει** ή **αφαιρεί** μια **προσαρμοσμένη Λίστα Γρήγορων Συνδέσμων** σε **Windows**. Μπορείτε να καθορίσετε **κατηγορίες** για να οργανώσετε πώς εμφανίζονται οι εργασίες στον χρήστη.
- **`app.setLoginItemSettings(settings)`**
- **Ρυθμίζει** ποια **εκτελέσιμα** εκκινούν κατά την **είσοδο** μαζί με τις **επιλογές** τους (μόνο macOS και Windows).
```javascript
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
Native.app.exit()
```
## systemPreferences module
Η **κύρια API** για την πρόσβαση στις ρυθμίσεις συστήματος και **την εκπομπή συστημικών γεγονότων** στο Electron. Μέθοδοι όπως **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** και **setUserDefault** είναι όλες **μέρος αυτού** του module.
**Παράδειγμα χρήσης:**
```javascript
const { systemPreferences } = require('electron');
// Subscribe to a specific notification
systemPreferences.subscribeNotification('MyCustomNotification', (event, userInfo) => {
console.log('Received custom notification:', userInfo);
});
// Get a user default key from macOS
const recentPlaces = systemPreferences.getUserDefault('NSNavRecentPlaces', 'array');
console.log('Recent Places:', recentPlaces);
```
### **subscribeNotification / subscribeWorkspaceNotification**
* **Ακούει** για **εγγενείς ειδοποιήσεις macOS** χρησιμοποιώντας NSDistributedNotificationCenter.
* Πριν από **macOS Catalina**, μπορούσατε να καταγράψετε **όλες** τις διανεμόμενες ειδοποιήσεις περνώντας **nil** στο CFNotificationCenterAddObserver.
* Μετά από **Catalina / Big Sur**, οι εφαρμογές σε sandbox μπορούν ακόμα να **εγγραφούν** σε **πολλές εκδηλώσεις** (για παράδειγμα, **κλειδώματα/ξεκλειδώματα οθόνης**, **τοποθετήσεις όγκου**, **δραστηριότητα δικτύου**, κ.λπ.) καταχωρώντας ειδοποιήσεις **κατά όνομα**.
### **getUserDefault / setUserDefault**
* **Διασυνδέεται** με **NSUserDefaults**, το οποίο αποθηκεύει **προτιμήσεις** εφαρμογής ή **παγκόσμιες** προτιμήσεις στο macOS.
* **getUserDefault** μπορεί να **ανακτήσει** ευαίσθητες πληροφορίες, όπως **τοποθεσίες πρόσφατων αρχείων** ή **γεωγραφική τοποθεσία χρήστη**.
* **setUserDefault** μπορεί να **τροποποιήσει** αυτές τις προτιμήσεις, επηρεάζοντας ενδεχομένως τη **διαμόρφωση** μιας εφαρμογής.
* Σε **παλαιότερες εκδόσεις Electron** (πριν από v8.3.0), μόνο η **τυπική σουίτα** του NSUserDefaults ήταν **προσβάσιμη**.
## Shell.showItemInFolder
Αυτή η λειτουργία εμφανίζει το δεδομένο αρχείο σε έναν διαχειριστή αρχείων, ο οποίος **μπορεί να εκτελέσει αυτόματα το αρχείο**.
Για περισσότερες πληροφορίες ελέγξτε [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
## **Tools**
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για την αναγνώριση κακών ρυθμίσεων και προτύπων ασφαλείας σε εφαρμογές βασισμένες σε Electron.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) είναι ένα ανοιχτού κώδικα plugin VS Code για εφαρμογές Electron που χρησιμοποιεί το Electronegativity.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) για να ελέγξετε για ευάλωτες βιβλιοθήκες τρίτων. - [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) για να ελέγξετε για ευάλωτες βιβλιοθήκες τρίτων.
- [**Electro.ng**](https://electro.ng/): Πρέπει να το αγοράσετε. - [**Electro.ng**](https://electro.ng/): Πρέπει να το αγοράσετε.
## Εργαστήρια ## Labs
Στο [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) μπορείτε να βρείτε ένα εργαστήριο για την εκμετάλλευση ευάλωτων εφαρμογών Electron. Στο [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) μπορείτε να βρείτε ένα εργαστήριο για την εκμετάλλευση ευάλωτων εφαρμογών Electron.
@ -307,7 +397,8 @@ npm start
- [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8) - [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8)
- [https://www.youtube.com/watch?v=a-YnG3Mx-Tg](https://www.youtube.com/watch?v=a-YnG3Mx-Tg) - [https://www.youtube.com/watch?v=a-YnG3Mx-Tg](https://www.youtube.com/watch?v=a-YnG3Mx-Tg)
- [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) - [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s)
- Περισσότερες έρευνες και αναφορές σχετικά με την ασφάλεια του Electron στο [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking) - Περισσότερες έρευνες και αναλύσεις σχετικά με την ασφάλεια του Electron στο [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
- [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81) - [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81)
- [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}