Cookies Hacking

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

Άλλοι τρόποι υποστήριξης του HackTricks:

Try Hard Security Group


Χαρακτηριστικά των Cookies

Τα cookies έρχονται με διάφορα χαρακτηριστικά που ελέγχουν τη συμπεριφορά τους στον περιηγητή του χρήστη. Εδώ έχουμε μια ανασκόπηση αυτών των χαρακτηριστικών με μια πιο παθητική φωνή:

Λήξη και Max-Age

Η ημερομηνία λήξης ενός cookie καθορίζεται από το χαρακτηριστικό Expires. Αντίστροφα, το χαρακτηριστικό Max-age ορίζει το χρόνο σε δευτερόλεπτα μέχρι το cookie να διαγραφεί. Επιλέξτε το Max-age καθώς αντικατοπτρίζει πιο σύγχρονες πρακτικές.

Domain

Οι φιλοξενούμενοι που λαμβάνουν ένα cookie καθορίζονται από το χαρακτηριστικό Domain. Από προεπιλογή, αυτό ορίζεται στον φιλοξενούντα που εξέδωσε το cookie, χωρίς να συμπεριλαμβάνει τα υποτομεία του. Ωστόσο, όταν το χαρακτηριστικό Domain ορίζεται ρητά, περιλαμβάνει επίσης τα υποτομεία. Αυτό καθιστά την καθορισμό του χαρακτηριστικού Domain μια λιγότερο περιοριστική επιλογή, χρήσιμη για περιπτώσεις όπου είναι απαραίτητο το κοινή χρήση των cookies σε υποτομεία. Για παράδειγμα, η ρύθμιση Domain=mozilla.org καθιστά τα cookies προσβάσιμα στα υποτομέα της όπως το developer.mozilla.org.

Διαδρομή

Μια συγκεκριμένη διαδρομή URL που πρέπει να υπάρχει στο αιτούμενο URL για να σταλεί η κεφαλίδα Cookie υποδεικνύεται από το χαρακτηριστικό Path. Αυτό το χαρακτηριστικό θεωρεί τον χαρακτήρα / ως διαχωριστικό καταλόγου, επιτρέποντας ταιριάσματα σε υποκαταλόγους επίσης.

Κανόνες Ταξινόμησης

Όταν δύο cookies έχουν το ίδιο όνομα, το επιλεγόμενο για αποστολή βασίζεται σε:

  • Το cookie που ταιριάζει με τη μεγαλύτερη διαδρομή στο αιτούμενο URL.

  • Το πιο πρόσφατα ορισμένο cookie αν οι διαδρομές είναι ίδιες.

SameSite

  • Το χαρακτηριστικό SameSite καθορίζει εάν τα cookies στέλνονται σε αιτήσεις που προέρχονται από τομείς τρίτων. Προσφέρει τρεις ρυθμίσεις:

  • Αυστηρό: Περιορίζει το cookie από το να σταλεί σε αιτήσεις τρίτων.

  • Χαλαρό: Επιτρέπει στο cookie να σταλεί με αιτήσεις GET που ξεκινούν από ιστοσελίδες τρίτων.

  • Κανένα: Επιτρέπει στο cookie να σταλεί από οποιοδήποτε τομέα τρίτων.

Να θυμάστε, κατά τη διαμόρφωση των cookies, η κατανόηση αυτών των χαρακτηριστικών μπορεί να βοηθήσει να εξασφαλιστεί ότι θα συμπεριφέρονται όπως αναμένεται σε διαφορετικά σενάρια.

Τύπος Αιτήματος

Παράδειγμα Κώδικα

Cookies Που Στέλνονται Όταν

Σύνδεσμος

<a href="..."></a>

NotSet*, Lax, None

Προεκτέλεση

<link rel="prerender" href=".."/>

NotSet*, Lax, None

Φόρμα GET

<form method="GET" action="...">

NotSet*, Lax, None

Φόρμα POST

<form method="POST" action="...">

NotSet*, None

iframe

<iframe src="..."></iframe>

NotSet*, None

AJAX

$.get("...")

NotSet*, None

Εικόνα

<img src="...">

NetSet*, None

Πίνακας από Invicti και ελαφρώς τροποποιημένο. Ένα cookie με το χαρακτηριστικό SameSite θα ελαττώσει τις επιθέσεις CSRF όπου απαιτείται μια συνεδρία σύνδεσης.

*Σημειώστε ότι από το Chrome80 (Φεβ/2019) η προεπιλεγμένη συμπεριφορά ενός cookie χωρίς το χαρακτηριστικό samesite θα είναι lax (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/). Σημειώστε ότι προσωρινά, μετά την εφαρμογή αυτής της αλλαγής, τα cookies χωρίς πολιτική SameSite στο Chrome θα χειριστούν ως None κατά τα πρώτα 2 λεπτά και στη συνέχεια ως Lax για αιτήματα POST διασταυρούμενων τομέων κορυφαίου επιπέδου.

Σημαίες των Cookies

HttpOnly

Αυτό αποφεύγει τον πελάτη να έχει πρόσβαση στο cookie (Μέσω Javascript για παράδειγμα: document.cookie)

Παρακάμψεις

  • Αν η σελίδα στέλνει τα cookies ως απάντηση μιας αιτήσεως (για παράδειγμα σε μια σελίδα PHPinfo), είναι δυνατό να καταχραστείτε το XSS για να στείλετε μια αίτηση σε αυτή τη σελίδα και να κλέψετε τα cookies από την απάντηση (ελέγξτε ένα παράδειγμα στο https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/.

  • Αυτό μπορεί να παρακαμφθεί με αιτήσεις TRACE HTTP καθώς η απάντηση από τον διακομιστή (εάν αυτή η μέθοδος HTTP είναι διαθέσιμη) θα αντανακλά τα cookies που στάλθηκαν. Αυτή η τεχνική ονομάζεται Cross-Site Tracking.

  • Αυτή η τεχνική αποφεύγεται από τους σύγχρονους περιηγητές μη επιτρέποντας την αποστολή ενός αιτήματος TRACE από το JS. Ωστόσο, έχουν βρεθεί κάποιες παρακάμψεις σε αυτό σε συγκεκριμένο λογισμικό όπως η αποστολή \r\nTRACE αντί για TRACE στο IE6.0 SP2.

  • Μια άλλη μέθοδος είναι η εκμετάλλευση ευπάθειών μηδέν/ημέρας των περιηγητών.

  • Είναι δυνατό να **αντικατασταθούν τα

Αντικατάσταση cookies

Ένας από τους τρόπους προστασίας των cookies που προσθέτουν το πρόθεμα __Host- είναι να αποτρέπουν την αντικατάστασή τους από υποτομείς. Αποτρέποντας, για παράδειγμα, τις επιθέσεις Cookie Tossing. Στην ομιλία Cookie Crumbles: Αποκάλυψη Ευπάθειας Ακεραιότητας Συνεδρίας Ιστού (άρθρο) παρουσιάζεται ότι ήταν δυνατό να οριστούν cookies με πρόθεμα __HOST- από υποτομές, με τον τρόπο του να εξαπατήσει τον αναλυτή, για παράδειγμα, προσθέτοντας "=" στην αρχή ή στην αρχή και στο τέλος...:

Ή στην PHP ήταν δυνατό να προστεθούν άλλοι χαρακτήρες στην αρχή του ονόματος του cookie που θα αντικαθίσταντο από χαρακτήρες κάτω παυλών, επιτρέποντας την αντικατάσταση των __HOST- cookies:

Επιθέσεις σε Cookies

Αν ένα προσαρμοσμένο cookie περιέχει ευαίσθητα δεδομένα, ελέγξτε το (ειδικά αν παίζετε ένα CTF), καθώς ενδέχεται να είναι ευάλωτο.

Αποκωδικοποίηση και Αλλαγή Cookies

Τα ευαίσθητα δεδομένα που ενσωματώνονται σε cookies πρέπει πάντα να ελέγχονται προσεκτικά. Τα cookies που κωδικοποιούνται σε Base64 ή παρόμοιες μορφές μπορούν συχνά να αποκωδικοποιηθούν. Αυτή η ευπάθεια επιτρέπει στους επιτιθέμενους να τροποποιήσουν το περιεχόμενο του cookie και να υποδυθούν άλλους χρήστες κωδικοποιώντας τα τροποποιημένα τους δεδομένα πίσω στο cookie.

Απαγωγή Συνεδρίας

Αυτή η επίθεση περιλαμβάνει την κλοπή του cookie ενός χρήστη για να αποκτήσει μη εξουσιοδοτημένη πρόσβαση στον λογαριασμό του σε μια εφαρμογή. Χρησιμοποιώντας το κλεμμένο cookie, ένας επιτιθέμενος μπορεί να υποδυθεί τον νόμιμο χρήστη.

Σταθεροποίηση Συνεδρίας

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

Αν βρήκατε ένα XSS σε μια υποτομή ή ελέγχετε μια υποτομή, διαβάστε:

pageCookie Tossing

Δωρεά Συνεδρίας

Εδώ, ο επιτιθέμενος πείθει το θύμα να χρησιμοποιήσει το session cookie του επιτιθέμενου. Το θύμα, πιστεύοντας ότι έχει συνδεθεί στον δικό του λογαριασμό, θα εκτελέσει απροσεξίες στο πλαίσιο του λογαριασμού του επιτιθέμενου.

Αν βρήκατε ένα XSS σε μια υποτομή ή ελέγχετε μια υποτομή, διαβάστε:

pageCookie Tossing

Κάντε κλικ στον προηγούμενο σύνδεσμο για να αποκτήσετε πρόσβαση σε μια σελίδα που εξηγεί πιθανές ευπάθειες στα JWT.

Τα JSON Web Tokens (JWT) που χρησιμοποιούνται σε cookies μπορεί επίσης να παρουσιάζουν ευπάθειες. Για λεπτομερείς πληροφορίες σχετικά με πιθανές ευπάθειες και πώς να τις εκμεταλλευτείτε, συνιστάται η πρόσβαση στο έγγραφο που συνδέεται με το hacking των JWT.

Παραβίαση Αιτήσεων Αναπαραγωγής Ανά Διαδίκτυο (CSRF)

Αυτή η επίθεση αναγκάζει έναν συνδεδεμένο χρήστη να εκτελέσει μη επιθυμητες ενέργειες σε μια ιστοσελίδα στην οποία είναι επί του παρόντος πιστοποιημένος. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν cookies που στέλνονται αυτόματα με κάθε αίτηση στην ευάλωτη ιστοσελίδα.

Κενά Cookies

(Ελέγξτε περαιτέρω λεπτομέρειες στην αρχική έρευνα) Οι περιηγητές επιτρέπουν τη δημιουργία cookies χωρίς όνομα, το οποίο μπορεί να επιδειχθεί μέσω JavaScript ως εξής:

document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"

Το αποτέλεσμα στην κεφαλίδα cookie που στάλθηκε είναι a=v1; test value; b=v2;. Ενδιαφέροντα, αυτό επιτρέπει την παρεμβολή στα cookies εάν ένα cookie με κενό όνομα έχει οριστεί, ενδεχομένως ελέγχοντας άλλα cookies με τον καθορισμό του κενού cookie σε μια συγκεκριμένη τιμή:

function setCookie(name, value) {
document.cookie = `${name}=${value}`;
}

setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value

Chrome Bug: Πρόβλημα με τον Κωδικό Συντροφικού Σημείου Unicode

Στο Chrome, εάν ένα συντροφικό σημείο Unicode είναι μέρος ενός συνόλου cookie, το document.cookie γίνεται δλαλοποιημένο, επιστρέφοντας στη συνέχεια μια κενή συμβολοσειρά:

document.cookie = "\ud800=meep";

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

(Ελέγξτε περισσότερες λεπτομέρειες στην αρχική έρευνα) Πολλοί διακομιστές ιστού, συμπεριλαμβανομένων αυτών από Java (Jetty, TomCat, Undertow) και Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), χειρίζονται εσφαλμένα τις συμβολοσειρές cookie λόγω της ξεπερασμένης υποστήριξης του RFC2965. Διαβάζουν μια τιμή cookie που είναι σε διπλά εισαγωγικά ως μια μοναδική τιμή ακόμα κι αν περιλαμβάνει ερωτηματικά, τα οποία θα έπρεπε να χωρίζουν κανονικά τα ζεύγη κλειδιού-τιμής:

RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";

Ευπάθειες Έγχυσης Cookies

(Ελέγξτε λεπτομέρειες στην αρχική έρευνα) Η εσφαλμένη ανάλυση των cookies από διακομιστές, ειδικά Undertow, Zope, και αυτούς που χρησιμοποιούν τα http.cookie.SimpleCookie και http.cookie.BaseCookie της Python, δημιουργεί ευκαιρίες για επιθέσεις έγχυσης cookies. Αυτοί οι διακομιστές αποτυγχάνουν να ορθώς περιορίσουν την έναρξη νέων cookies, επιτρέποντας σε επιτιθέμενους να πλαστογραφήσουν cookies:

  • Ο Undertow περιμένει ένα νέο cookie αμέσως μετά από μια παραθέση χωρίς ερωτηματικό.

  • Το Zope ψάχνει για ένα κόμμα για να ξεκινήσει την ανάλυση του επόμενου cookie.

  • Οι κλάσεις cookie της Python ξεκινούν την ανάλυση σε ένα χαρακτήρα κενού.

Αυτή η ευπάθεια είναι ιδιαίτερα επικίνδυνη σε web εφαρμογές που βασίζονται στην προστασία CSRF με βάση τα cookies, καθώς επιτρέπει σε επιτιθέμενους να εισάγουν πλαστογραφημένα cookies CSRF-token, πιθανώς παρακάμπτοντας μέτρα ασφαλείας. Το πρόβλημα επιδεινώνεται από τη χειριστική της Python για διπλότυπα ονόματα cookies, όπου η τελευταία εμφάνιση αντικαθιστά τις προηγούμενες. Επίσης, δημιουργεί ανησυχίες για τα cookies __Secure- και __Host- σε ανασφαλείς συμφωνίες και θα μπορούσε να οδηγήσει σε παρακάμψεις εξουσιοδότησης όταν τα cookies περνιούνται σε διακομιστές που είναι ευάλωτοι στην πλαστογράφηση.

Επιπλέον Ευάλωτοι Έλεγχοι Cookies

Βασικοί Έλεγχοι

  • Το cookie είναι ίδιο κάθε φορά που συνδέεστε.

  • Αποσυνδεθείτε και δοκιμάστε να χρησιμοποιήσετε το ίδιο cookie.

  • Δοκιμάστε να συνδεθείτε με 2 συσκευές (ή περιηγητές) στο ίδιο λογαριασμό χρησιμοποιώντας το ίδιο cookie.

  • Ελέγξτε αν το cookie περιέχει κάποιες πληροφορίες και δοκιμάστε να το τροποποιήσετε.

  • Δοκιμάστε να δημιουργήσετε αρκετούς λογαριασμούς με σχεδόν το ίδιο όνομα χρήστη και ελέγξτε αν μπορείτε να δείτε ομοιότητες.

  • Ελέγξτε την επιλογή "Να με θυμάσαι" αν υπάρχει για να δείτε πώς λειτουργεί. Αν υπάρχει και είναι ευάλωτη, χρησιμοποιήστε πάντα το cookie του να με θυμάσαι χωρίς κανένα άλλο cookie.

  • Ελέγξτε αν το προηγούμενο cookie λειτουργεί ακόμα αφού αλλάξετε τον κωδικό.

Προηγμένες επιθέσεις με cookies

Αν το cookie παραμένει το ίδιο (ή σχεδόν) όταν συνδέεστε, αυτό πιθανότατα σημαίνει ότι το cookie σχετίζεται με κάποιο πεδίο του λογαριασμού σας (πιθανώς το όνομα χρήστη). Τότε μπορείτε:

  • Δοκιμάστε να δημιουργήσετε πολλούς λογαριασμούς με πολύ παρόμοια ονόματα χρηστών και δοκιμάστε να μαντέψετε πώς λειτουργεί ο αλγόριθμος.

  • Δοκιμάστε να bruteforce το όνομα χρήστη. Αν το cookie αποθηκεύει μόνο ως μέθοδος πιστοποίησης για το όνομα χρήστη σας, τότε μπορείτε να δημιουργήσετε ένα λογαριασμό με όνομα χρήστη "Bmin" και να bruteforce κάθε μοναδικό bit του cookie σας επειδή ένα από τα cookies που θα δοκιμάσετε θα είναι αυτό που ανήκει στον "admin".

  • Δοκιμάστε το Padding Oracle (μπορείτε να αποκρυπτογραφήσετε το περιεχόμενο του cookie). Χρησιμοποιήστε το padbuster.

Padding Oracle - Παραδείγματα Padbuster

padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# When cookies and regular Base64
padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies auth=u7bvLewln6PJPSAbMb5pFfnCHSEd6olf

# If Base64 urlsafe or hex-lowercase or hex-uppercase --encoding parameter is needed, for example:
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2

Padbuster θα κάνει αρκετές προσπάθειες και θα σας ρωτήσει ποια συνθήκη είναι η συνθήκη σφάλματος (αυτή που δεν είναι έγκυρη).

Στη συνέχεια θα αρχίσει να αποκρυπτογραφεί το cookie (μπορεί να διαρκέσει αρκετά λεπτά).

Αν η επίθεση έχει πραγματοποιηθεί με επιτυχία, τότε θα μπορούσατε να δοκιμάσετε να κρυπτογραφήσετε μια συμβολοσειρά της επιλογής σας. Για παράδειγμα, αν θέλατε να κρυπτογραφήσετε user=administrator

padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator

Αυτή η εκτέλεση θα σας δώσει το cookie σωστά κρυπτογραφημένο και κωδικοποιημένο με το string user=administrator μέσα.

CBC-MAC

Ίσως ένα cookie μπορεί να έχει κάποια τιμή και να υπογράφεται χρησιμοποιώντας CBC. Στη συνέχεια, η ακεραιότητα της τιμής είναι η υπογραφή που δημιουργείται χρησιμοποιώντας CBC με την ίδια τιμή. Καθώς συνιστάται να χρησιμοποιείται ως IV ένα μηδενικό διάνυσμα, αυτός ο τύπος ελέγχου ακεραιότητας θα μπορούσε να είναι ευάλωτος.

Η επίθεση

  1. Λάβετε την υπογραφή του ονόματος χρήστη administ = t

  2. Λάβετε την υπογραφή του ονόματος χρήστη rator\x00\x00\x00 XOR t = t'

  3. Ορίστε στο cookie την τιμή administrator+t' (t' θα είναι μια έγκυρη υπογραφή του (rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00

ECB

Αν το cookie είναι κρυπτογραφημένο χρησιμοποιώντας ECB μπορεί να είναι ευάλωτο. Όταν συνδέεστε, το cookie που λαμβάνετε πρέπει να είναι πάντα το ίδιο.

Πώς να ανιχνεύσετε και να επιτεθείτε:

Δημιουργήστε 2 χρήστες με σχεδόν τα ίδια δεδομένα (όνομα χρήστη, κωδικό πρόσβασης, email, κλπ.) και προσπαθήστε να ανακαλύψετε κάποιο πρότυπο μέσα στο δεδομένο cookie

Δημιουργήστε ένα χρήστη με το όνομα για παράδειγμα "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" και ελέγξτε αν υπάρχει κάποιο πρότυπο στο cookie (καθώς το ECB κρυπτογραφεί με τον ίδιο κλειδί κάθε block, τα ίδια κρυπτογραφημένα bytes μπορεί να εμφανιστούν αν το όνομα χρήστη είναι κρυπτογραφημένο).

Θα πρέπει να υπάρχει ένα πρότυπο (με το μέγεθος ενός χρησιμοποιούμενου block). Έτσι, γνωρίζοντας πώς κρυπτογραφούνται μια σειρά "a" μπορείτε να δημιουργήσετε ένα όνομα χρήστη: "a"*(μέγεθος του block)+"admin". Στη συνέχεια, μπορείτε να διαγράψετε το κρυπτογραφημένο πρότυπο ενός block από το cookie. Και θα έχετε το cookie του ονόματος χρήστη "admin".

Αναφορές

Try Hard Security Group

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

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated