Το προφίλ μας στο Google Plus
1

Session fixation, baby!

Λοιπόν, θα σας πούμε ένα μυστικό. Οι τεχνικές επίθεσης για site είναι πολλές. OK. Ψέμματα. Είναι πάρα πολλές. Υπάρχουν μάλιστα κάποιοι που ισχυρίζονται ότι είναι άπειρες — αλλά αριθμήσιμες, βιάζονται να προσθέσουν. Πάλι καλά, λέμε εμείς. Αν τώρα κάποιος προσπαθήσει να κατηγοριοποιήσει τις τεχνικές επίθεσης σε site, ίσως ξεκινήσει από τις πιο απλές, όπως, π.χ., η εύρεση του password του administrator σε κάποιο ξεχασμένο αρχείο στον server, και προχωρήσει σε πιο σύνθετες, όπως η στατιστική ανάλυση ώστε να μπορέσει να μαντέψει το περίφημο session ID! Σε κάθε περίπτωση, ο στόχος είναι πάντα ένας: Να μπει μέσα στο site, forum ή ό,τι άλλο είν’ αυτό, σαν κάποιος άλλος (impersonation). Για μια στιγμή, όμως. Τι είναι αυτό το session ID που αναφέραμε πιο πάνω; Χμ, νομίζουμε αξίζει ν’ αναφερθούμε και σ’ αυτόν τον τύπο επίθεσης, ο οποίος εντάσσεται στο advanced session hijacking. H μέθοδος που θα περιγράψουμε μοιάζει λίγο με το Cross Site Request Forgery, αφού χρησιμοποιεί παρόμοια τεχνική. Για να πούμε όμως την αλήθεια, είναι λίγο πιο πονηρή! Αλλά ας πάρουμε τα πράγματα από την αρχή.

Το web, ως γνωστόν, είναι stateless. Κάθε φορά δηλαδή που επισκεπτόμαστε ένα web site και βάζουμε κάποιον κωδικό για να κάνουμε login ή κάθε φορά που πατάμε σε κάποιο link, ο απομακρυσμένος server είναι σαν να μας βλέπει για πρώτη φορά! Η λειτουργία του πρωτοκόλλου HTTP είναι τέτοια που δεν παρέχει καμία απολύτως δυνατότητα στον server για να μας θυμάται. Μ’ αυτή την λογική, θα ρωτήσει κάποιος, δεν θα ‘πρεπε να ζητάει συνέχεια να του δίνουμε τον κωδικό μας, αφού ανά πάσα στιγμή δεν έχει ιδέα για το ποιοι είμαστε; Η απάντηση είναι θετική. Αυτό θα έπρεπε να κάνει ο server. Δεν θα ήταν όμως πάρα πολύ εκνευριστικό; Φυσικά και θα ήταν. Άρα τι πρέπει να κάνει ο server για να ξεπεράσει αυτά τα προβλήματα; Κάθε φορά που δίνουμε το password, ο server στέλνει στον υπολογιστή μας έναν ειδικό κωδικό και κάθε φορά που ζητάμε κάτι απ’ αυτόν, τότε, μέσω του web browser, κοιτάει αν έχουμε αυτόν τον κωδικό. Αν τον έχουμε τότε πράγματι είμαστε εμείς, αλλιώς είναι κάποιος άλλος (duh!)

Ο κωδικός αυτός που αποθηκεύει ο server στον υπολογιστή μας είναι το περίφημο session ID, το οποίο αναφέραμε στην αρχή. Αυτό μπορεί αποθηκεύεται στον υπολογιστή με διάφορους τρόπους. Ο πιο συνηθισμένος είναι μέσω ενός cookie ή ως συνδυασμός μιας εντολής _GET κι ενός cookie, περνώντας το session ID ως παράμετρο στο URL. Αν δεν το καταλαβαίνετε το τελευταίο, μην ανησυχείτε: Χρειάζονται λίγες μόνο γνώσεις web development, αλλά μπορείτε να συνεχίσετε το διάβασμα του παρόντος ακόμα και χωρίς αυτές.

Το session ID έχει συγκεκριμένη διάρκεια ζωής, δηλαδή συγκεκριμένο διάστημα που παραμένει έγκυρο. Αυτή η διάρκεια ζωής του είναι σχετικά μικρή, εξαρτάται από το πρόγραμμα που το δημιούργησε, συνήθως είναι μία ή λίγες ώρες κι ανανεώνεται κάθε φορά καλούμε τον server, δηλαδή κάθε φορά που κάνουμε μια ενέργεια στο site. Υπάρχει βέβαια και η επιλογή να κάνουμε το session ID αθάνατο ώστε να είναι έγκυρο ες αεί, χωρίς να χρειάζεται ανανέωση με τη γνωστή επιλογή “Remember me” (βλ. εικόνα 1).

Εικόνα 1: Μια επιλογή στο στιλ 'Remember me' κρατάει το session ID ζωντανό!

H ουσία της μεθόδου που θα περιγράψουμε είναι η εξής: Θα προσπαθήσουμε να δούμε πόσο εύκολο είναι να κλέψουμε το session ID κάποιου -ας πούμε του κου Χ- και να το χρησιμοποιήσουμε για μας! Έτσι, ο απομακρυσμένος server θα νομίζει ότι ο κος Χ είναι εμείς ή ότι εμείς είμαστε ο κος Χ – καταλαβαίνετε, τέλος πάντων. Φανταστείτε τώρα ο κος Χ να ‘ναι ο ίδιος ο διαχειριστής του απομακρυσμένου server! Δεν θα είχε εξαιρετική πλακίτσα, αν έπεφτε το session ID στα χέρια τρίτων; Χμ, σίγουρα θα είχε, αρκεί βέβαια να έμενε εκεί το θέμα και η όλη επιχείρηση να είχε στηθεί με μοναδικό στόχο τον εμπλουτισμό της γνώσης!

Στόχος της επίδειξής μας, λοιπόν, είναι να χρησιμοποιήσουμε εμείς το session ID του κου Χ, αφού πρώτα του το υποκλέψουμε. Ας σκεφτούμε ακόμα πιο προχωρημένα: Τι θα λέγατε να δανείζαμε εμείς ένα session ID στον κο Χ και να τον κάναμε μ’ αυτό να έμπαινε στον server του; Αν το πετυχαίναμε, μετά θα χρειαζόταν μόνο ένα απλό refresh στον browser μας για να μας θεωρούσε ο server ως …διαχειριστές. Το καταλάβαμε; Χμ, όχι εντελώς, ε; Δεν έχετε κι άδικο, φαίνεται λίγο μπερδεμένο. Και πραγματικά είναι μπερδεμένο, οπότε ίσως λίγο δύσκολο στην κατανόηση. Αν όμως εξηγήσουμε λίγα ακόμα πραγματάκια, πιστεύουμε ότι θα γίνει εντελώς κατανοητό.

Υπάρχουν αρκετά προγράμματα που τρέχουν σε αρκετούς severs ανά τον κόσμο, τα οποία δημιουργούν το session ID *πριν* ακόμα δώσουμε τον κωδικό μας. Δηλαδή, μόλις τους επισκεφτούμε, μας πλασάρουν ένα cookie και μέσα σε αυτό έχουν το session ID μας. Μάλιστα κρατάνε το ίδιο session ID και *μετά* την εισαγωγή του κωδικού, αφού ο server μάς έχει αναγνωρίσει! Αυτό είναι πολύ κακό και θα εξηγήσουμε γιατί με δύο μικρές ιστοριούλες.

Ιστορία 1η
Διατηρούμε ένα λογαριασμό στην τράπεζα Α. Κάθε φορά που την επισκεπτόμαστε online παίρνουμε ένα session ID, ας πούμε το 123456, μέσω ενός URL σαν το επόμενο:

<br />
http://www.BankOfLamer.gr/index.php?session=123456<br />

Φυσικά, κάθε φορά που συνδεόμαστε η τράπεζα μάς δίνει ένα διαφορετικό session ID, με βάση κάποιον αλγόριθμο δημιουργίας τυχαίων αριθμών. Εντάξει, όχι και τόσο τυχαίων, αλλά αν κάτσουμε τώρα ν’ αναλύσουμε τι σημαίνει τυχαίο και πόσο εύκολο είναι να προβλεφτεί αυτή η τυχαιότητα, ε, τότε α) θα ξεφύγουμε από το θέμα μας και β) θα γράψουμε καμιά δεκαριά άρθρα ακόμα, πράγμα όχι κατ’ ανάγκη κακό αλλά σίγουρα -στην προκειμένη περίπτωση- εκτός θέματος. Κάνουμε λοιπόν login στο λογαριασμό μας κι αρχίζουμε να πληρώνουμε λογαριασμούς, να εκτελούμε εντολές μεταφοράς χρημάτων κ.ο.κ., με λίγα λόγια κάνουμε ό,τι κάνει ένας φυσιολογικός άνθρωπος ;) Να πούμε εδώ ότι το session ID μας έχει παραμείνει ίδιο και είναι το 123456. Μετά από λίγο βγαίνουμε από το λογαριασμό. Κάποια στιγμή στο μέλλον θα ξαναμπούμε, θα πάρουμε ένα νέο Session ID κ.ο.κ. κι ούτε γάτα ούτε ζημιά. Όταν όμως υπάρχει η γάτα, τι γίνεται; Χμ, ας δούμε τη δεύτερη ιστοριούλα…

Ιστορία 2η
Ο καλός μας φίλος, ο κος Πονηρίδης, μάς στέλνει ένα link προς την τράπεζά μας και μας παροτρύνει να μπούμε μέσα για να διαπιστώσουμε ότι μας κατέθεσε πράγματι αυτά τα 100 ευρώ που μας χρωστούσε. Μας δίνει, λοιπόν, το παρακάτω link:

<br />
http://www.BankOfLamer.gr/index.php?session=123489<br />

Εμείς πάμε σ’ αυτό το link, βλέπουμε ότι πρόκειται όντως για την τράπεζά μας κι έτσι κάνουμε login στο λογαριασμό μας (δίνοντας κωδικό και password), ώστε να δούμε αν το υπόλοιπο αυξήθηκε κατά 100 ευρώ. Πράγματι, βλέπουμε ότι από 200 ευρώ που είχαμε χθες σήμερα έχουμε 300. Όχι όμως για πολύ. Ήδη την έχουμε πατήσει! Είμαστε μέσα στο λογαριασμό μας με το session ID 123489, το οποίο το έχει κι ο κος Πονηρίδης! Για να το πούμε πιο καλά, αυτό το session ID το ‘χε ήδη ο κος Πονηρίδης, αφού είχε πάει στην τράπεζά μας ως ένας απλός επισκέπτης. Πήρε, λοιπόν, το valid session ID που του ‘δωσε η τράπεζα κι ακολούθως μάς το πάσαρε ενσωματωμένο σ΄εκείνο το URL που μας έστειλε. Εμείς, λίγο αφελείς αλλά και χωρίς να γνωρίζουμε ότι η τράπεζά μας πάσχει από το σύνδρομο δεν-αλλάζω-sessionIDs-με-κάθε-login-so-help-me-god, κάναμε login και μπήκαμε στο λογαριασμό μας. Πλέον, ο server πιστεύει ότι αυτός που ‘χει το session ID 123489 είμαστε εμείς! Το μόνο που θα κάνει ο κος Πονηρίδης, λοιπόν, είναι ένα refresh στον browser του για να διαπιστώσει, με χαρά, ότι βρίσκεται μέσα στο λογαριασμό μας. Από κει και πέρα νομίζουμε ότι δεν χρειάζεται μεγάλη φαντασία για να καταλάβουμε το τέλος της ιστοριούλας μας.

Να πούμε εδώ βέβαια ότι ο κος Πονηρίδης δεν έχει κι άπλετο χρόνο… Όταν εμείς βγούμε από το session με κλικ στο log out (μην το ξεχνάτε ποτέ αυτό!) θα χάσει το session κι αυτός, αφού ο server θα δει ότι βγήκαμε και θα ενημερώσει τη βάση του ώστε να διαγράψει την εγγραφή που περιέχει το session ID που ‘χε συνδέσει με μας.

Μην μας πείτε ότι δεν είναι πονηρό το προηγούμενο τρικ! Μπορεί όμως να συμβεί *και* στην πράξη; Χμ, αυτό είναι το πραγματικά καυτό ερώτημα! Στη συνέχεια θα δούμε πώς μπορούμε να εφαρμόσουμε την τεχνική αυτή ώστε να μπούμε ως administrators σε κάποιο site που τρέχει ένα γνωστό CMS (Content Management System). Για να το καταλάβουμε καλύτερα θα κάνουμε δύο υποθέσεις: Ότι ο αγαθός διαχειριστής του συστήματος χρησιμοποιεί Opera κι ότι ο κος Πονηρίδης χρησιμοποιεί Firefox. Ας πούμε ότι η επίθεση ξεκίνησε στις 17.30 το απόγευμα. Έχουμε, λοιπόν:

17.30: Ο κος Πονηρίδης βρίσκει ότι το site που θέλει να παραβιάσει είναι ευπαθές σε session hijacking και συγκεκριμένα σε session fixation. Το επισκέπτεται, λοιπόν, χωρίς να βάλει κωδικό (βλ. εικόνα 2). Δώστε βάση στο PHPSESSID. Εδώ θα παιχτεί όλο το παιχνίδι!

Εικόνα 2: Εικόνα 2: Ο κος Πονηρίδης πηγαίνει στο ευπαθές κατά session fixation site ως απλός επισκέπτης, μόνο και μόνο για να πάρει ένα session ID...

17.35: Κάνει copy/paste το URL της εικόνας 2 και το στέλνει στο διαχειριστή του site σε e-mail, εξηγώντας του πως κάποιο μέλος τον βρίζει πολύ άσχημα και, τέλος πάντων, καλό είναι να μπει για να διαγράψει το post!

17.40: Ο διαχειριστής διαβάζει το mail και θορυβείται. “Α, απαράδεκτα πράγματα”, σκέφτεται, “…για να πάω να βάλω μια τάξη” και χωρίς καθυστέρηση κάνει κλικ στο link που του έστειλε ο κος Πονηρίδης για να μεταβεί απευθείας στο επίμαχο μέρος. Τώρα, με δεδομένο ότι ο διαχειριστής δεν ήταν από πριν logged-in στο site του, γεγονός που αποτελεί πολύ καλή τύχη για τον κο Πονηρίδη, ο server ζητά από τον administrator να δώσει username και password (βλ. εικόνα 3).

Εικόνα 3: Για καλή τύχη του κου Πονηρίδη, αφού ο διαχειριστής πατήσει το link του ζητούνται τα credentials του! Ήταν logged-off, βλέπετε...

17.41: Ο διαχειριστής έχει ήδη μπει μέσα στο site του και είναι πανέτοιμος ν’ απονείμει δικαιοσύνη (βλ. εικόνα 4).

Εικόνα 4: Ο διαχειριστής, τσιμπώντας το δόλωμα, είναι ήδη μέσα στο site του με το session ID του κου Πονηρίδη!

17.45: Ο κος Πονηρίδης περιμένει υπομονετικά, κάνοντας κάθε τόσο refresh στο Firefox. Και ξαφνικά, ως δια μαγείας γίνεται διαχειριστής! Η όλη επιχείρηση του πήρε μόλις 15 λεπτά! (βλ. εικόνα 5).

Εικόνα 5: Πώς να γίνετε διαχειριστής στη θέση του διαχειριστή μ' ένα απλό refresh, μέσα σε 15 λεπτά!

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

1. Μην εμπιστεύεστε ποτέ links που σας αποστέλλουν φίλοι ή “φίλοι”.
2. Κάντε πάντα log-out από ευαίσθητα sites.
3. Ποτέ, μα ποτέ μην πατάτε την επιλογή “Remember Me”, όταν είστε σε ευαίσθητα sites.

Ακολουθούν ηθικά διδάγματα που ενδιαφέρουν τον προγραμματιστή που έφτιαξε το software για τον server της τράπεζας BankOfLamer.

1. Δεν περνάμε ποτέ το session ID ως παράμετρο από το URL!
2. Κάθε φορά που ένας χρήστης κάνει login στο σύστημά μας του αποδίδουμε *νέο* session ID και με κανέναν τρόπο δεν κρατάμε το παλιό!
3. Προτιμάμε τις ασφαλείς συνδέσεις HTTPS!
4. Δημιουργούμε το session ID με βάση μια καλή γεννήτρια τυχαίων αριθμών ή χαρακτήρων, το κωδικοποιούμε και προσαρτούμε σ’ αυτό στοιχεία που έχουν να κάνουν με τον ίδιο το χρήστη, όπως, π.χ., το IP του, όνομα του web browser που χρησιμοποιεί κ.λπ. Έτσι, ακόμα κι αν κλαπεί το ID δεν θα μπορεί να ταυτιστεί απόλυτα με τον αρχικό χρήστη, μιας κι ο επιτιθέμενος -ακόμα κι αν χρησιμοποιεί την ίδια ακριβώς έκδοση του ίδιου web browser- θα είναι πολύ δύσκολο να ‘χει και το ίδιο (public) IP, εκτός βέβαια κι αν αμφότεροι προέρχονται από το ίδιο τοπικό δίκτυο (LAN).

Παρουσιάσαμε τη μέθοδο του session fixation μέσα από απλά και σύντομα παραδείγματα. Η συγκεκριμένη τακτική παρουσιάστηκε πρώτη φορά το 2001 κι έγινε revised το 2007 από τον Mitja Kolšek της ACROS Security. Θεωρούμε ότι μαζί με τη μέθοδο του Cross Site Request Forgery αποτελούν δυνατές τεχνικές της κατηγορίας Session Hijacking, οι οποίες είναι ικανές να φέρουν σε εξαιρετικά δύσκολη θέση υπευθύνους site τραπεζών, δημόσιων οργανισμών και γενικά site με κακογραμμένο ή μη ενημερωμένο -πάντα από πλευράς ασφαλείας- software. Όπως ήδη είπαμε, τρόποι για ν’ αποφευχθούν τα βάσανα, τόσο από την πλευρά του χρήστη όσο κι από την πλευρά του προγραμματιστή, ευτυχώς υπάρχουν.

Το θέμα εδώ είναι πόσο μπορεί να αισθανόμαστε ασφαλείς σ’ ένα τέτοιο τοπίο; Η απάντηση είναι μια και είναι και πολύ απλή: Μένετε διαρκώς ενημερωμένοι και πάντα κοντά στις εξελίξεις, ώστε να ξέρετε πώς να φυλάγεστε. Μερικές φορές, μάλιστα, αν χρειαστεί μη διστάσετε να σκεφτείτε όπως κι ο κάθε Πονηρίδης.

One Response to “Session fixation, baby!”

  1. mkosmas | 30/08/2011 at 01:25

    “Tο σύνδρομο δεν-αλλάζω-sessionIDs-με-κάθε-login-so-help-me-god” χαχαχαχα! ωραίος!

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων