Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=race-condition) γιανα δημιουργήσετε και να**αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα **πιο προηγμένα** εργαλεία της κοινότητας.\
Μάθετε και εξασκηθείτε στο AWS Hacking:<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">\
Μάθετε και εξασκηθείτε στο GCP Hacking: <imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* **Εγγραφείτε** 💬 [**στην ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
Για να αποκτήσετε βαθιά κατανόηση αυτής της τεχνικής, ελέγξτε την αρχική αναφορά στο [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
Το κύριο εμπόδιο στην εκμετάλλευση των race conditions είναι η διασφάλιση ότι πολλαπλά αιτήματα χειρίζονται ταυτόχρονα, με **πολύ μικρή διαφορά στους χρόνους επεξεργασίας τους—ιδανικά, λιγότερο από 1ms**.
* **HTTP/2**: Υποστηρίζει την αποστολή δύο αιτημάτων μέσω μιας μόνο σύνδεσης TCP, μειώνοντας την επίδραση του jitter στο δίκτυο. Ωστόσο, λόγω παραλλαγών στην πλευρά του διακομιστή, δύο αιτήματα μπορεί να μην είναι αρκετά για μια συνεπή εκμετάλλευση race condition.
* **HTTP/1.1 'Συγχρονισμός Τελευταίου Byte'**: Επιτρέπει την προ-αποστολή των περισσότερων τμημάτων 20-30 αιτημάτων, κρατώντας ένα μικρό κομμάτι, το οποίο αποστέλλεται στη συνέχεια μαζί, επιτυγχάνοντας ταυτόχρονη άφιξη στον διακομιστή.
Η επόμενη αποστολή των συγκρατημένων πλαισίων θα πρέπει να έχει ως αποτέλεσμα την άφιξή τους σε ένα μόνο πακέτο, επαληθεύσιμο μέσω του Wireshark. Αυτή η μέθοδος δεν ισχύει για στατικά αρχεία, τα οποία δεν εμπλέκονται συνήθως σε επιθέσεις RC.
Η κατανόηση της αρχιτεκτονικής του στόχου είναι κρίσιμη. Οι διακομιστές front-end μπορεί να δρομολογούν τα αιτήματα διαφορετικά, επηρεάζοντας το χρονοδιάγραμμα. Η προληπτική θέρμανση της σύνδεσης στην πλευρά του διακομιστή, μέσω ασήμαντων αιτημάτων, μπορεί να κανονικοποιήσει το χρονοδιάγραμμα των αιτημάτων.
Πλαίσια όπως ο χειριστής συνεδριών PHP σειριοποιούν τα αιτήματα κατά συνεδρία, ενδεχομένως αποκρύπτοντας ευπάθειες. Η χρήση διαφορετικών tokens συνεδρίας για κάθε αίτημα μπορεί να παρακάμψει αυτό το ζήτημα.
Εάν η θέρμανση της σύνδεσης είναι αναποτελεσματική, η πρόκληση καθυστερήσεων περιορισμού ρυθμού ή πόρων στους διακομιστές ιστού σκόπιμα μέσω πλημμύρας ψεύτικων αιτημάτων μπορεί να διευκολύνει την επίθεση ενός πακέτου, προκαλώντας μια καθυστέρηση στην πλευρά του διακομιστή που ευνοεί τις race conditions.
* **Tubo Intruder - Επίθεση HTTP2 μοναδικού πακέτου (1 endpoint)**: Μπορείτε να στείλετε το αίτημα στο **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), μπορείτε να αλλάξετε στην αίτηση την τιμή που θέλετε να σπάσετε για**`%s`** όπως στο `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` και στη συνέχεια να επιλέξετε το **`examples/race-single-packer-attack.py`** από την αναπτυσσόμενη λίστα:
* **Tubo Intruder - HTTP2 επίθεση μεμονωμένου πακέτου (Πολλές τελικές διευθύνσεις)**: Σε περίπτωση που χρειαστεί να στείλετε ένα αίτημα σε 1 τελική διεύθυνση και στη συνέχεια πολλαπλά σε άλλες τελικές διευθύνσεις γιανα ενεργοποιήσετε το RCE, μπορείτε να αλλάξετε το σενάριο `race-single-packet-attack.py` με κάτι σαν:
* Για **limit-overrun** θα μπορούσατε απλά να προσθέσετε το **ίδιο αίτημα 50 φορές** στην ομάδα.
* Για **connection warming**, θα μπορούσατε να**προσθέσετε** στην **αρχή** της **ομάδας** κάποια **αιτήματα** σε κάποιο μη στατικό μέρος του web server.
* Για **delaying** τη διαδικασία **μεταξύ** της επεξεργασίας **ενός αιτήματος και ενός άλλου** σε 2 υποστάσεις βημάτων, θα μπορούσατε να**προσθέσετε επιπλέον αιτήματα μεταξύ** και των δύο αιτημάτων.
* Για ένα **multi-endpoint** RC θα μπορούσατε να αρχίσετε να στέλνετε το **αίτημα** που **πηγαίνει στην κρυφή κατάσταση** και στη συνέχεια **50 αιτήματα** αμέσως μετά που **εκμεταλλεύονται την κρυφή κατάσταση**.
* **Automated python script**: Ο στόχος αυτού του script είναι να αλλάξει το email ενός χρήστη ενώ συνεχώς το επαληθεύει μέχρι να φτάσει το verification token του νέου email στο τελευταίο email (αυτό συμβαίνει επειδή στον κώδικα παρατηρήθηκε μια RC όπου ήταν δυνατό να τροποποιηθεί ένα email αλλά να σταλεί η επαλήθευση στο παλιό επειδή η μεταβλητή που υποδεικνύει το email ήταν ήδη γεμάτη με το πρώτο).\
Όταν η λέξη "objetivo" βρεθεί στα ληφθέντα emails, γνωρίζουμε ότι λάβαμε το verification token του αλλάγμένου email και τερματίζουμε την επίθεση.
Στην αρχική έρευνα εξηγείται ότι αυτή η επίθεση έχει όριο 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. 
Σημειώστε ότι αν και αυτή η βελτίωση καθιστά την επίθεση πιο αξιόπιστη σε RC που απαιτεί εκατοντάδες/χιλιάδες πακέτα να φτάσουν ταυτόχρονα, μπορεί επίσης να έχει κάποιους περιορισμούς λογισμικού. Ορισμένοι δημοφιλείς διακομιστές HTTP όπως οι Apache, Nginx και Go έχουν αυστηρή ρύθμιση `SETTINGS_MAX_CONCURRENT_STREAMS` σε 100, 128 και 250. Ωστόσο, άλλοι όπως οι NodeJS και nghttp2 το έχουν απεριόριστο.\
Αυτό σημαίνει βασικά ότι ο Apache θα εξετάσει μόνο 100 HTTP συνδέσεις από μια μοναδική TCP σύνδεση (περιορίζοντας αυτή την επίθεση RC).
Μπορείτε να βρείτε μερικά παραδείγματα χρησιμοποιώντας αυτή την τεχνική στο repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
Πριν από την προηγούμενη έρευνα, αυτά ήταν μερικά payloads που χρησιμοποιήθηκαν και απλώς προσπαθούσαν να στείλουν τα πακέτα όσο το δυνατόν πιο γρήγορα γιανα προκαλέσουν μια RC.
* **Εισβολέας**: Στείλτε το **αίτημα** στον **Εισβολέα**, ρυθμίστε τον **αριθμό νημάτων** σε **30** μέσα στο **μενού Επιλογών** και, επιλέξτε ως payload **Null payloads** και δημιουργήστε **30.**
Αυτός είναι ο πιο βασικός τύπος συνθήκης αγώνα όπου **ευπάθειες** που **εμφανίζονται** σε μέρη που **περιορίζουν τον αριθμό των φορών που μπορείτε να εκτελέσετε μια ενέργεια**. Όπως η χρήση του ίδιου κωδικού έκπτωσης σε ένα διαδικτυακό κατάστημα πολλές φορές. Ένα πολύ εύκολο παράδειγμα μπορεί να βρεθεί σε [**αυτή την αναφορά**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ή σε [**αυτό το σφάλμα**](https://hackerone.com/reports/759247)**.**
Η εκμετάλλευση σύνθετων συνθηκών αγώνα συχνά περιλαμβάνει την εκμετάλλευση σύντομων ευκαιριών για αλληλεπίδραση με κρυφές ή **μη προγραμματισμένες υποκαταστάσεις μηχανής**. Να πώς να προσεγγίσετε αυτό:
* Ξεκινήστε εντοπίζοντας σημεία που τροποποιούν ή αλληλεπιδρούν με κρίσιμα δεδομένα, όπως προφίλ χρηστών ή διαδικασίες επαναφοράς κωδικού πρόσβασης. Επικεντρωθείτε σε:
* **Αποθήκευση**: Προτιμήστε σημεία που χειρίζονται μόνιμα δεδομένα στον διακομιστή σε σχέση με αυτά που χειρίζονται δεδομένα στον πελάτη.
* **Ενέργεια**: Αναζητήστε λειτουργίες που τροποποιούν υπάρχοντα δεδομένα, οι οποίες είναι πιο πιθανό να δημιουργήσουν εκμεταλλεύσιμες συνθήκες σε σύγκριση με αυτές που προσθέτουν νέα δεδομένα.
* **Κλειδώματα**: Οι επιτυχείς επιθέσεις συνήθως περιλαμβάνουν λειτουργίες που βασίζονται στον ίδιο αναγνωριστικό, π.χ., όνομα χρήστη ή διακριτικό επαναφοράς.
* Δοκιμάστε τα εντοπισμένα σημεία με επιθέσεις συνθήκης αγώνα, παρατηρώντας τυχόν αποκλίσεις από τις αναμενόμενες εκβάσεις. Απροσδόκητες απαντήσεις ή αλλαγές στη συμπεριφορά της εφαρμογής μπορεί να υποδηλώνουν μια ευπάθεια.
* Στενέψτε την επίθεση στον ελάχιστο αριθμό αιτημάτων που απαιτούνται γιανα εκμεταλλευτείτε την ευπάθεια, συχνά μόλις δύο. Αυτό το βήμα μπορεί να απαιτεί πολλές προσπάθειες ή αυτοματοποίηση λόγω της ακριβούς χρονικής στιγμής που εμπλέκεται.
Η ακρίβεια στο χρονοδιάγραμμα των αιτημάτων μπορεί να αποκαλύψει ευπάθειες, ειδικά όταν χρησιμοποιούνται προβλέψιμες μέθοδοι όπως οι χρονικές σφραγίδες για τα διακριτικά ασφαλείας. Για παράδειγμα, η δημιουργία διακριτικών επαναφοράς κωδικού πρόσβασης με βάση τις χρονικές σφραγίδες θα μπορούσε να επιτρέψει ταυτόσημα διακριτικά για ταυτόχρονες αιτήσεις.
* Χρησιμοποιήστε ακριβή χρονοδιάγραμμα, όπως μια επίθεση με ένα μόνο πακέτο, γιανα κάνετε ταυτόχρονες αιτήσεις επαναφοράς κωδικού πρόσβασης. Τα ταυτόσημα διακριτικά υποδηλώνουν μια ευπάθεια.
* Ζητήστε δύο διακριτικά επαναφοράς κωδικού πρόσβασης ταυτόχρονα και συγκρίνετέ τα. Τα ταυτοποιημένα διακριτικά υποδηλώνουν ένα σφάλμα στη δημιουργία διακριτικών.
Δείτε αυτό το [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) γιανα δείτε πώς να**πληρώσετε** σε ένα κατάστημα και να**προσθέσετε ένα επιπλέον** αντικείμενο που **δεν θα χρειαστεί να πληρώσετε γι' αυτό**.
Η ιδέα είναι να**επιβεβαιώσετε μια διεύθυνση email και να την αλλάξετε σε μια διαφορετική ταυτόχρονα**γιανα διαπιστώσετε αν η πλατφόρμα επιβεβαιώνει τη νέα που έχει αλλάξει.
Σύμφωνα με [**αυτή την έρευνα**](https://portswigger.net/research/smashing-the-state-machine) το Gitlab ήταν ευάλωτο σε κατάληψη με αυτόν τον τρόπο επειδή μπορεί να**στείλει** το **διακριτικό επιβεβαίωσης email μιας διεύθυνσης στο άλλο email**.
Εάν **χρησιμοποιηθούν 2 διαφορετικές εγγραφές**γιανα**προσθέσουν****πληροφορίες** μέσα σε μια **βάση δεδομένων**, υπάρχει μια μικρή χρονική περίοδος όπου **μόνο τα πρώτα δεδομένα έχουν γραφεί** μέσα στη βάση δεδομένων. Για παράδειγμα, όταν δημιουργείτε έναν χρήστη, το **όνομα χρήστη** και ο**κωδικός πρόσβασης** μπορεί να**γραφούν** και **στη συνέχεια το διακριτικό**γιανα επιβεβαιωθεί ο νεοδημιουργημένος λογαριασμός γράφεται. Αυτό σημαίνει ότι για μια μικρή χρονική περίοδο το **διακριτικό για την επιβεβαίωση ενός λογαριασμού είναι κενό**.
Επομένως, **η εγγραφή ενός λογαριασμού και η αποστολή αρκετών αιτημάτων με ένα κενό διακριτικό** (`token=` ή `token[]=` ή οποιαδήποτε άλλη παραλλαγή) γιανα επιβεβαιώσετε τον λογαριασμό αμέσως θα μπορούσε να επιτρέψει την **επιβεβαίωση ενός λογαριασμού** όπου δεν ελέγχετε το email.
Υπάρχουν αρκετοί [**παροχείς OAUth**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers). Αυτές οι υπηρεσίες θα σας επιτρέψουν να δημιουργήσετε μια εφαρμογή και να πιστοποιήσετε χρήστες που έχει καταχωρίσει ο παροχέας. Για να το κάνετε αυτό, ο**πελάτης** θα χρειαστεί να**επιτρέψει στην εφαρμογή σας**να έχει πρόσβαση σε ορισμένα από τα δεδομένα τους μέσα στον **παροχέα OAUth**.\
Έτσι, μέχρι εδώ είναι απλώς μια κοινή σύνδεση με google/linkedin/github... όπου σας ζητείται μια σελίδα που λέει: "_Η εφαρμογή \<InsertCoolName> θέλει να έχει πρόσβαση στις πληροφορίες σας, θέλετε να το επιτρέψετε;_"
Το**πρόβλημα** εμφανίζεται όταν **το αποδεχτείτε** και αυτόματα στέλνει έναν **`authorization_code`** στην κακόβουλη εφαρμογή. Στη συνέχεια, αυτή η **εφαρμογή εκμεταλλεύεται μια Race Condition στον παροχέα υπηρεσιών OAUth γιανα δημιουργήσει περισσότερα από ένα AT/RT** (_Authentication Token/Refresh Token_) από τον **`authorization_code`** για τον λογαριασμό σας. Βασικά, θα εκμεταλλευτεί το γεγονός ότι έχετε αποδεχτεί την εφαρμογή να έχει πρόσβαση στα δεδομένα σας γιανα**δημιουργήσει αρκετούς λογαριασμούς**. Στη συνέχεια, αν**σταματήσετε να επιτρέπετε στην εφαρμογή να έχει πρόσβαση στα δεδομένα σας, ένα ζευγάρι AT/RT θα διαγραφεί, αλλά τα άλλα θα παραμείνουν έγκυρα**.
Μόλις έχετε **αποκτήσει ένα έγκυρο RT**, μπορείτε να προσπαθήσετε να**το εκμεταλλευτείτε γιανα δημιουργήσετε αρκετά AT/RT** και **ακόμα και ανο χρήστης ακυρώσει τις άδειες**για την κακόβουλη εφαρμογή να έχει πρόσβαση στα δεδομένα του, **αρκετά RT θα παραμείνουν έγκυρα.**
Στο [**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) μπορείτε να βρείτε ένα PoC σε Java γιανα στείλετε μηνύματα websocket σε **παράλληλη** εκμετάλλευση **Race Conditions και σε Web Sockets**.
Learn & practice AWS Hacking:<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* 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.
Use [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=race-condition) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\