Η θεωρία πίσω από το σπάσιμο του WEP

Intro
802.11 header
Authentication
Cryptography
Initialization Vector (IV)
Replaying
Integrity Check Value (ICV)
XOR
Going deeper…
Reusable IVs
Weak RC4 Keys
Direct key attack
Conclusion

Για να βρίσκεσαι εδώ, κατά πάσα πιθανότητα έχεις χρησιμοποιήσει τουλάχιστον μια φορά στη ζωή σου το Aircrack, το Kismet και όλα αυτά τα καλούδια που περιέχονται στο Backtrack ή απλά τα κότσαρες στο Linux distro που χρησιμοποιείς. Αν τα χρησιμοποιείς σε Windows, πάτα CTRL + ALT + 2 φορές το DEL για να πας στο αντίστοιχο άρθρο. Τώρα που τους ξεφορτωθήκαμε αυτούς, θα σου πω μερικά πράγματα ξεκινώντας με λίγες γενικές πληροφορίες για τα ασύρματα δίκτυα και όσο πάμε θα εμβαθύνουμε μέχρι να φτάσουμε στο σπάσιμο του WEP.

Δεν θα αναλωθούμε σε ζωγραφιές με κουτάκια να φεύγουν από τον server, να μπαίνουν στο συννεφάκι και να καταλήγουν στο pc σου γιατί αυτά (πρέπει να) τα ξέρεις ήδη. Τα ασύρματα δίκτυα μοιάζουν αρκετά και διέπονται από τους ίδιους κανόνες με τα ενσύρματα μέχρι το επίπεδο των πακέτων. Οι μεγαλύτερες διαφορές εμφανίζονται στα κατώτερα στρώματα του OSI Model και συγκεκριμένα στα δύο τελευταία: Data Link και Physical. Το πρόβλημα είναι πως το μέσο μετάδοσης είναι ο αέρας και μέσα στον αέρα πετάνε άπειρα πακέτα• από ραδιοφωνικά, τηλεοπτικά, κινητής τηλεφωνίας, άλλων ασύρματων δικτύων γύρω σου, από τον φούρνο μικροκυμάτων στην κουζίνα σου κ.ο.κ. Ένας πιο απλός τρόπος να το καταλάβεις, είναι ο εξής: σκέψου πως παίρνεις τηλέφωνο τον κολλητό σου. Ξέρετε και οι δύο με ποιον μιλάτε, ακολουθείτε κάποιους κανόνες επικοινωνίας ώστε να μην μιλάτε και οι δύο ταυτόχρονα και κανείς δεν παρεμβάλλεται στην συζήτησή σας (αν δεν έχει κάνει καμιά μαλακία ο ΟΤΕ). Κάπως έτσι είναι χονδρικά τα ενσύρματα δίκτυα. Τα ασύρματα, είναι σαν να βρίσκεσαι σε ένα δωμάτιο μαζί με άλλους δέκα, με κλειστά φώτα να μην βλέπεστε και να πει κάποιος «γεια σου». Σε ‘σένα μίλησε; Σε άλλον; Να απαντήσεις ή όχι; Γι’ αυτό οι ασύρματες συσκευές είναι κατασκευασμένες να δουλεύουν σε ένα συγκεκριμένο εύρος συχνοτήτων και να αγνοούν τις υπόλοιπες. Στην περίπτωση των ασύρματων δικτύων, οι συχνότητες που χρησιμοποιούνται είναι τα 2,4GHz τα οποία είναι χωρισμένα σε 14 συχνότητες που ονομάζονται κανάλια και ξεκινάνε από το κανάλι 1 στα 2,412GHz και τελειώνουν στο κανάλι 14 στα 2,484GHz. Μπορεί όμως το μόντεμ του γείτονά σου να εκπέμπει στο ίδιο κανάλι με εσένα οπότε και υπάρχει το πρόβλημα που περιγράψαμε παραπάνω. Για να το διευθετήσουμε κι αυτό, χρειαζόμαστε ένα σύνολο κανόνων που θα τους ακολουθούν όλοι ώστε να γνωρίζουν οι συσκευές πού πηγαίνει τι. Αυτό το σύνολο κανόνων ονομάζεται 802.11 Standard και σχεδιάστηκε από το ινστιτούτο IEEE.

Η βασική διαφορά των πακέτων που μεταδίδονται ασύρματα με αυτά που μεταδίδονται ενσύρματα, είναι το 802.11 header. Αυτό το header περιέχει πληροφορίες για το πακέτο καθώς και για το μέσο μετάδοσης στο οποίο μεταδίδεται. Υπάρχουν τρία πακέτα 802.11 (αν έχεις παίξει με το Aircrack, θα δεις πολλές γνωστές φυσιογνωμίες εδώ):

Management χρησιμοποιείται για να καθιερώσει την ασύρματη σύνδεση και έχει μερικές σημαντικές υποκατηγορίες πακέτων για authentication, association και beacon.
Control χρησιμοποιείται για την παράδοση των Management και Data πακέτων και διαχειρίζεται όποια τυχόν συμφόρηση. Οι πιο κοινές υποκατηγορίες πακέτων περιλαμβάνουν τα πακέτα Request-to-Send και Clear-to-Send.
Data αυτό το πακέτο είναι το μοναδικό που περιέχει πληροφορίες και είναι το μοναδικό που μπορεί να προωθηθεί από ένα ασύρματο σε ένα ενσύρματο δίκτυο.

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

Πάμε τώρα στο κομμάτι του authentication όπου το δίκτυο και η συσκευή που θέλει να συνδεθεί σε αυτό, πρέπει να ανταλλάξουν ταυτότητες. Κάθε μετάδοση που κάνει μια συσκευή σε ένα δίκτυο, περιέχει την MAC Address της ώστε να καταλαβαίνει το δίκτυο από ποιόν προέρχεται μιας και η MAC Address είναι μοναδική για κάθε συσκευή. Πως όμως ξέρει το δίκτυο ότι το πακέτο που έλαβε είναι πράγματι από την συσκευή με την συγκεκριμένη MAC Address και όχι από κάποια άλλη που την προσποιείται (πράγμα πανεύκολο); Ένας τρόπος είναι να συμφωνήσουν το δίκτυο και η συσκευή στην πρώτη τους επαφή, σε ένα κρυφό κλειδί που θα προστατεύει κάθε μελλοντικό μήνυμα. Μπορεί κάποιος να αντιγράψει μια MAC Address αλλά δεν θα έχει αυτό το κρυφό κλειδί οπότε και δεν θα μπορεί να μεταδώσει έγκυρα μηνύματα.

Ας δούμε το γνωστό μας WEP το οποίο έχει ένα authentication phase κατά το οποίο μια καινούρια συσκευή, αποδεικνύει πως είναι έμπιστο μέλος της ομάδας. Το δίκτυο (δηλαδή το Access Point, το Router κτλ) θεωρεί ότι αν μια συσκευή μπορεί να αποδείξει πως είναι έμπιστη, είναι λογικό να πιστέψει πως και η MAC Address τής (της συσκευής) είναι πραγματική. Με βάση αυτή την εμπιστοσύνη, θα επιτρέψει στην καινούρια συσκευή να συνδεθεί. Δυστυχώς (ή ευτυχώς;) όμως στην περίπτωση του WEP, κανένα κρυφό κλειδί δεν ανταλλάσσεται μεταξύ δικτύου και συσκευής κατά το authentication οπότε δεν υπάρχει κανένας τρόπος να γνωρίζει το δίκτυο αν τα μελλοντικά μηνύματα που λαμβάνει είναι από την πραγματική συσκευή ή από κάποιον που την προσποιείται. Σκέψου να φωνάξεις μια στριπτιτζού στο σπίτι σου και να σου ‘ρθει με στολή catwoman αλλά δεν βγάζει την μάσκα να δεις το πρόσωπό της (ίσως είναι αξύριστη; Δεν ξέρω!). Άντε και σου δείχνει ταυτότητα για να δεις αν το όνομά της είναι αυτό που σου είπαν απ’ το γραφείο που σου την έστειλε. Λες και είναι δύσκολο να πλαστογραφήσεις μια ταυτότητα (βλ. MAC Address). Anyway, την αφήνεις να περάσει μέσα και μετά από λίγο φεύγει να πάει στο περίπτερο να πάρει τσιγάρα που ξέχασε. Γυρίζει, της ανοίγεις και πάτε στα ενδότερα. Πού ξέρεις ότι την δεύτερη φορά, ήρθε η ίδια και όχι κάποια άλλη μεταμφιεσμένη με την ίδια στολή; Δεν το ξέρεις, αλλά την άφησες να μπει. Έτσι χαζά δουλεύει και το WEP!

Πώς γίνεται λοιπόν το authentication στο WEP; Γίνεται σε τέσσερα βήματα χρησιμοποιώντας πακέτα Management.

Βήμα 1 Η συσκευή στέλνει ένα αίτημα στο δίκτυο για να συνδεθεί.
Βήμα 2 Το δίκτυο στέλνει πίσω ένα μήνυμα που περιέχει ένα κείμενο γνωστό ως challenge text.
Βήμα 3 Η συσκευή, χρησιμοποιώντας τον κωδικό για το δίκτυο, κρυπτογραφεί το challenge text και το στέλνει πίσω.
Βήμα 4 Το δίκτυο αποκρυπτογραφεί το μήνυμα χρησιμοποιώντας τον κωδικό που έχει αποθηκευμένο και συγκρίνει το αποτέλεσμα με το αρχικό μήνυμα που είχε στείλει. Αν είναι το ίδιο, επιτρέπει στην συσκευή να συνδεθεί.

 
Παρατήρησες το κενό ασφαλείας; Όχι;! Τότε μάλλον δεν έδωσες βάση σε όσα διάβασες μέχρι τώρα! Είπαμε πως όλα αυτά τα δεδομένα, ταξιδεύουν στον αέρα και ο καθένας μπορεί να τα λάβει. Έτσι λοιπόν, μπορεί ο οποιοσδήποτε να λάβει το challenge text καθώς και την απάντηση της συσκευής που περιέχει το challenge text κρυπτογραφημένο. Έχοντας στα χέρια του την αρχική μορφή και την κρυπτογραφημένη, μπορεί πλέον να βρει και το κλειδί κρυπτογράφησης, δηλαδή τον κωδικό του δικτύου.

Το 802.11 Standard υποστηρίζει δύο τύπους κρυπτογράφησης WEP: 64-bit και 128-bit:
Η κρυπτογράφηση των 64-bit επιτρέπει κωδικούς 5 χαρακτήρων, δηλαδή 40-bit (ένας χαρακτήρας = 1 byte = 8 bit. 5 χαρακτήρες Χ 8 bit = 40-bit. Έπρεπε να τα ξέρεις αυτά!). Σε αυτά τα 40-bit, προστίθενται άλλα 24-bit από την συσκευή και ο χρήστης δεν μπορεί να τους βάλει χέρι.
Η κρυπτογράφηση των 128-bit επιτρέπει κωδικούς 13 χαρακτήρων (13 χαρακτήρες Χ 8 bit έκαστος = 104-bit). Τα υπόλοιπα 24-bits προστίθενται όπως και στην περίπτωση του 64-bit από την συσκευή.

Τα συστήματα ασφαλείας χρησιμοποιούν για την κρυπτογράφηση το stream cipher ή το block cipher. Το stream cipher παίρνει μια σειρά από δεδομένα και παράγει μια νέα σειρά σε κρυπτογραφημένη μορφή που ονομάζεται ciphertext. Το block cipher χειρίζεται ένα κομμάτι δεδομένων κάθε φορά το οποίο συνήθως έχει μέγεθος 8, 16 ή 32 byte και στη συνέχεια αποστέλλεται στον αλγόριθμο κρυπτογράφησης. Η βασική τους διαφορά είναι ότι στο stream cipher τα δεδομένα ανανεώνονται συνεχώς ενώ το block cipher “αδειάζει” πριν την επεξεργασία (γίνεται reset για να είμαστε και πιο ακριβείς). Θα τα αναλύσουμε εκτενώς σε άλλο άρθρο.

Το WEP λοιπόν, χρησιμοποιεί ένα stream cipher που ονομάζεται RC4 για να κρυπτογραφήσει τα πακέτα δεδομένων. Το RC4 παίρνει κάθε φορά ένα stream μεγέθους 1 byte και παράγει ένα διαφορετικό stream ίσου μεγέθους χρησιμοποιώντας το κλειδί του δικτύου. Αν για παράδειγμα θελήσουμε να στείλουμε το μήνυμα “abc” μέσω δύο δικτύων που έχουν διαφορετικό κωδικό, το μήνυμα στο ένα δίκτυο μπορεί να κρυπτογραφηθεί ως “f7d” και στο άλλο ως “yf3”. Η κρυπτογράφηση και η αποκρυπτογράφηση χρησιμοποιούν το ίδιο κλειδί και γι’ αυτό τον λόγο ο αλγόριθμος κρυπτογράφησης ονομάζεται συμμετρικός αλγόριθμος.

Ένα από τα πλεονεκτήματα του RC4 είναι πως είναι εύκολο στη χρήση και δεν χρειάζεται περίπλοκες και χρονοβόρες διαδικασίες όπως ο πολλαπλασιασμός. Όταν όμως ένας αλγόριθμος δεν είναι περίπλοκος, συνήθως δεν είναι και ασφαλής και αυτός είναι πάντα ο πονοκέφαλος κάθε σχεδιαστή αλγορίθμων: να φτιάξουν έναν αλγόριθμο ασφαλή και εύκολο στην χρήση. Κατά την χρήση του RC4, υπάρχουν δύο φάσεις: στην πρώτη φάση (initialization), δημιουργούνται κάποια εσωτερικά tables δεδομένων βασισμένα στο κλειδί του δικτύου ενώ στην δεύτερη (encryption) τα δεδομένα κρυπτογραφούνται με βάση αυτά τα tables. Στο WEP, κάθε πακέτο δεδομένων περνάει και από τις δύο φάσεις οπότε περιέχει δικά του tables για την αποκρυπτογράφηση. Αυτό βοηθάει σε περιπτώσεις που κάποιο πακέτο χαθεί, τα πακέτα που θα ακολουθήσουν να μπορούν να αποκρυπτογραφηθούν και να μην εξαρτώνται από το πρώτο πακέτο. Μπορεί να ακούγεται καλή τακτική για να κάνει το δίκτυο πιο σταθερό αλλά στην πραγματικότητα πρόκειται για αδυναμία που θα καταλάβεις παρακάτω.

Είπαμε νωρίτερα για αυτά τα 24 bits που προστίθενται στου κωδικούς από την συσκευή και ήρθε η ώρα να καταλάβεις πώς ακριβώς χρησιμοποιούνται. Είναι μεγάλο πρόβλημα να χρησιμοποιεί κανείς το ίδιο κλειδί (κωδικό). Μπορεί που και που να το αλλάζει ο διαχειριστής του δικτύου, αλλά εμείς μιλάμε σε επίπεδο ροής δεδομένων και σε αυτό το επίπεδο, το να αλλάζει κανείς τον κωδικό μια φορά τον μήνα, μοιάζει αιωνιότητα μιας και όλα τα δεδομένα κρυπτογραφούνται με το ίδιο κλειδί. Το κακό εδώ είναι πως όταν κρυπτογραφήσουμε για παράδειγμα το μήνυμα “hello”, θα δώσει (λέμε τώρα) “t43k” και κάθε φορά που κρυπτογραφούμε το ίδιο μήνυμα θα παίρνουμε και το ίδιο αποτέλεσμα. Μπορεί να σκεφτείς ότι αυτό είναι καλό καθώς αν έδινε διαφορετικό αποτέλεσμα η κρυπτογράφηση κάθε φορά, η αποκρυπτογράφηση θα ήταν δύσκολη αλλά στην πραγματικότητα πρόκειται για αδυναμία διότι αυτή η μέθοδος δίνει πληροφορίες στον επιτήδειο που παρακολουθεί το δίκτυο. Μπορεί να μην μπορεί να διαβάσει τα πακέτα γιατί είναι κρυπτογραφημένα, μπορεί όμως να δει την θέση τους. Η IP για παράδειγμα είναι πάντα στην ίδια θέση μέσα σε ένα πακέτο οπότε ακόμα κι αν δεν μπορεί να δει τους αριθμούς, μπορεί να δει το κρυπτογραφημένο κείμενο να επαναλαμβάνεται κι έτσι να γνωρίζει ότι αυτά τα πακέτα προέρχονται από την ίδια συσκευή. Μπορώ να σου πω πολλά παραδείγματα αλλά φαντάζομαι το έπιασες το νόημα. Την λύση λοιπόν σε αυτό το πρόβλημα έρχεται να δώσει το IV (Initialization Vector) με έναν πολύ απλό τρόπο. Αντί να χρησιμοποιείται το ίδιο κλειδί πάντα για την κρυπτογράφηση των δεδομένων, συνδυάζουμε το κλειδί μαζί με έναν 24 bits αριθμό που αλλάζει σε κάθε πακέτο. Αυτός ο αριθμός είναι το IV και αυτός είναι που χρησιμοποιεί τα 24 bits που αναφέραμε νωρίτερα. Το IV όμως δεν είναι κρυφό κι όποιος διαβάζει τα πακέτα μπορεί να το διαβάσει αλλά χωρίς το κλειδί του είναι άχρηστα (θεωρητικά). Για να είναι αποτελεσματικό, δεν πρέπει να χρησιμοποιηθεί το ίδιο IV δεύτερη φορά με το ίδιο κλειδί διότι αλλιώς, θα μπορούσε κάποιος να κρατάει αρχείο και να βλέπει το πότε χρησιμοποιήθηκε πάλι το ίδιο IV, δημιουργώντας έτσι την βάση της επίθεσής του. Δυστυχώς όμως, όσο κι αν ένας αριθμός μεγέθους 24 bits ακούγεται μεγάλος, στην πραγματικότητα μπορεί να πάρει τιμές από το 0 μέχρι το 16.777.216 (κάθε bit μπορεί να πάρει δύο τιμές: 0 ή 1. Άρα \(2^{24}/) μας δίνει 16.777.216 πιθανούς συνδυασμούς). Ένα ασύρματο δίκτυο των 11Mbps μπορεί να μεταδίδει και να λαμβάνει περίπου 700 πακέτα μεσαίου μεγέθους το δευτερόλεπτο. Αν ένα διαφορετικό IV χρησιμοποιείται σε καθένα απ’ αυτά, όλες οι πιθανές τιμές θα έχουν εξαντληθεί σε λιγότερο από 7 ώρες. Επίσης, κάποια συστήματα ξεκινάνε πάντα με το ίδιο IV μετά από κάθε επανεκκίνηση και οι επόμενες τιμές ακολουθούν την ίδια σειρά. Κάποια άλλα συστήματα αλλάζουν το IV με μια ψευδό-τυχαία σειρά. Η παραγωγή τυχαίων αριθμών είναι μεγάλο κεφάλαιο στην πληροφορική για να το αναλύσω εδώ, αλλά εν ολίγοις, μια μέθοδος παραγωγής τυχαίων αριθμών είναι να παίρνει ο αλγόριθμος έναν αριθμό και να τον χρησιμοποιεί ως βάση για την παραγωγή ενός άλλου. Μετά παίρνει τον καινούριο αριθμό και τον χρησιμοποιεί ως βάση για την παραγωγή ενός τρίτου κ.ο.κ. Όταν όμως ξεκινάς την ακολουθία με τον ίδιο αριθμό, όλοι οι “τυχαίοι” αριθμοί που ακολουθούν, είναι πάντα οι ίδιοι. Έτσι, αν συνδεθούν 20 συσκευές ταυτόχρονα με το που ανοίξει ένα δίκτυο και ξεκινήσουν όλες με το ίδιο IV, τότε κάθε τιμή IV θα εμφανίζεται 20 φορές.

Ένα ακόμη σημαντικό σκέλος στην ασφάλεια των ασύρματων δικτύων είναι η διαχείριση και η αποφυγή των Replay, δηλαδή των επαναλήψεων ίδιων μηνυμάτων. Ας πούμε ότι παρακολουθείς (ή πιο σωστά: κάνεις sniffing) ένα ασύρματο δίκτυο και κάποια στιγμή, κάποιος χρήστης συνδέεται. Λογικά η πρώτη επικοινωνία της νέας συσκευής με το δίκτυο, θα είναι η αναγνώριση, δηλαδή το δίκτυο θα στείλει ένα μήνυμα στον χρήστη για να εισάγει τα στοιχεία του κι εκείνος θα τα συμπληρώσει και θα τα στείλει πίσω. Φυσικά εσύ που παρακολουθείς δεν μπορείς να δεις τα πραγματικά δεδομένα που ανταλλάσσονται μιας και είναι κρυπτογραφημένα, αλλά από το μήκος και μόνο των μηνυμάτων μπορείς να έχεις μια πολύ καλή ιδέα του τι γίνεται. Τι κάνεις λοιπόν; Αλλάζεις την MAC Address σου ώστε να είναι ίδια με του χρήστη που είναι συνδεδεμένος στο δίκτυο και προσπαθείς να συνδεθείς στο δίκτυο. Το δίκτυο θα στείλει και σε ‘σένα ένα μήνυμα για να κάνεις log in που φυσικά δεν μπορείς να διαβάσεις, αλλά όπως είπαμε, μπορείς να το καταλάβεις από το μήκος του. Τότε λοιπόν, στέλνεις το μήνυμα που είχες υποκλέψει την ώρα που ο αυθεντικός χρήστης απαντούσε στο μήνυμα του δικτύου, δηλαδή το επαναλαμβάνεις (εξ’ ου και το Replaying) και αν το δίκτυο δεν έχει προστασία για το Replay, θα σε αφήσει να συνδεθείς μιας και το μήνυμα είναι σωστά κρυπτογραφημένο αφού ο αυθεντικός χρήστης είχε το σωστό κλειδί. Το πόσα μπορείς να κάνεις από δω και πέρα, εξαρτάται από τις γνώσεις σου (και απαιτούνται πολλές είναι η αλήθεια), παρ’ όλ’ αυτά, και μόνο που συνδέθηκες στο δίκτυο χωρίς να διαθέτεις τα κατάλληλα πιστοποιητικά, θεωρείται πολύ σοβαρό κενό ασφαλείας. Και όπως σωστά φαντάζεσαι, το WEP αποτυγχάνει παταγωδώς στην ασφάλεια κατά των Replay. Όχι επειδή έχουν βρεθεί τρόποι για να παρακαμφθεί ή να σπάσει αυτή η ασφάλεια, αλλά επειδή απλά δεν υπάρχει!

Είδαμε λοιπόν το IV που μαζί με το κλειδί του δικτύου, τοποθετούνται στην αρχή κάθε πακέτου. Τώρα θα δούμε το ICV (Integrity Check Value) το οποίο μπαίνει στο τέλος του πακέτου και σκοπό έχει να εξασφαλίσει ότι τα δεδομένα που περιέχει το πακέτο, δεν έχουν τροποποιηθεί (μια διαδικασία που ονομάζεται Tampering). Κατά την διάρκεια της κρυπτογράφησης αλλά και της αποκρυπτογράφησης ενός πακέτου, όλα τα bytes συνδυάζονται σε ένα αποτέλεσμα που ονομάζεται CRC (Cyclic Redundancy Check) και αυτή η τιμή μεγέθους 4 bytes προστίθεται στο τέλος του πακέτου πριν την επεξεργασία του για μετάδοση. Έστω κι αν ένα μόλις bit είναι διαφορετικό ή κατεστραμμένο, η συσκευή που λαμβάνει το πακέτο θα καταλάβει ότι η τιμή του CRC δεν είναι σωστή και θα απορρίψει το μήνυμα μιας και μετά την λήψη υπολογίζει πάλι το CRC και συγκρίνει το δικό της αποτέλεσμα με το CRC που έστειλε το δίκτυο. Μπορεί αυτή η τεχνική να προστατεύει το δίκτυο από λάθη λόγω ατυχήματος, δεν το προστατεύει όμως από λάθη που γίνονται επίτηδες διότι ο επιτιθέμενος μπορεί να τροποποιήσει το μήνυμα και να υπολογίσει εκ νέου το CRC ώστε να είναι σωστό. Το ICV λοιπόν, είναι ουσιαστικά το αποτέλεσμα που δίνει ο αλγόριθμος CRC. Τόσο το ICV όσο και το CRC προστίθενται στο πακέτο με την διαφορά ότι το ICV μπαίνει πριν την κρυπτογράφηση. Θεωρητικά λοιπόν, επειδή το ICV είναι κρυπτογραφημένο, ο επιτιθέμενος δεν μπορεί να το επαναϋπολογίσει και να το κρυπτογραφήσει, άρα το μήνυμα δεν επιδέχεται τροποποίηση (tampering). Έτσι λέει η θεωρία, γιατί στην πράξη, τα πράγματα είναι πολύ διαφορετικά! Η μέθοδος CRC που χρησιμοποιείται για τον υπολογισμό του ICV ονομάζεται linear method και όπως φαίνεται, μπορείς να προβλέψεις ποια bits μέσα στο ICV θα αλλάξουν αν αλλάξεις ένα bit μέσα στο μήνυμα. Ας υποθέσουμε ότι έχουμε ένα μήνυμα μεγέθους 8.000 bits και αλλάξουμε το bit στην θέση 3.452. Μπορούμε ύστερα να υπολογίσουμε ποια bits μέσα στο ICV θα αλλάξουν σαν αποτέλεσμα της παρέμβασής μας και χρησιμοποιώ πληθυντικό γιατί συνήθως δεν είναι μόνο ένα το bit που θα αλλάξει. Επίσης, δεν είναι τυχαίο που χρησιμοποιώ το ρήμα “αλλάζω” και όχι το “ορίζω” διότι δεν χρειάζεται να γνωρίζουμε την πραγματική τιμή σε εκείνη την θέση του μηνύματος. Το μόνο που χρειάζεται να γνωρίζουμε είναι ότι άμα αναστρέψουμε την τιμή ενός συγκεκριμένου bit στο μήνυμα, μπορούμε να έχουμε και σωστό ICV αναστρέφοντας κάποιον συγκεκριμένο συνδυασμό bits του ICV. Δυστυχώς όμως, επειδή το WEP χρησιμοποιεί το XOR (θα το αναλύσουμε στην επόμενη παράγραφο) για να δημιουργήσει το ciphertext, η αναστροφή των bit επιβιώνει της κρυπτογράφησης. Αναστρέφοντας ένα bit στο αυθεντικό μήνυμα, αναστρέφεται το ίδιο bit και στο ciphertext. Μπορεί λοιπόν η τιμή του ICV να παραμένει κρυφή αλλά μπορεί κανείς με ασφάλεια να τροποποιήσει το πακέτο δοκιμάζοντας να αλλάξει διάφορα bit και να παρατηρεί τις αλλαγές που προκαλεί στο αυθεντικό μήνυμα. Γι’ αυτό τον λόγο, κι αυτή η προστασία του WEP έχει καταρριφθεί.

Τι είναι όμως το XOR που αναφέραμε παραπάνω; Το XOR (eXclusive OR) είναι η μέθοδος με την οποία ο αλγόριθμος RC4, αφότου παράξει μια σειρά από ψευδο-τυχαίους αριθμούς (που ονομάζεται key stream), την ενώνει με τα δεδομένα του πακέτου παίρνοντας 2 bytes από τα οποία παράγει 1 byte. Το επιτυγχάνει αυτό συγκρίνοντας τα bits του πρώτου byte με τα bits στις αντίστοιχες θέσεις του δεύτερου byte με τρόπο ώστε αν είναι ίσα, το αποτέλεσμα είναι 0 ενώ αν είναι διαφορετικά, το αποτέλεσμα είναι 1. Το μαθηματικό σύμβολο του XOR είναι το \(\oplus\). Ας δούμε ένα παράδειγμα:

Πακέτο 1: 0 1 1 1 0 0 0 1
\( \bigoplus\)
Πακέτο 2: 1 0 1 0 0 1 1 1

=
1 1 0 1 0 1 1 0

 
Βλέπουμε πως το πρώτο bit του πρώτου πακέτου είναι 0 ενώ του δεύτερου είναι 1 οπότε αφού δεν είναι ίσα, σύμφωνα με τον κανόνα που είπαμε παραπάνω, το αποτέλεσμα είναι 1. Το ίδιο ισχύει και για το δεύτερο bit των πακέτων. Στο τρίτο bit, και τα δύο πακέτα έχουν την τιμή 1 οπότε και το αποτέλεσμα είναι 0. Αν θέλαμε να το παραστήσουμε μαθηματικά, θα γράφαμε:

\(01110001 \bigoplus 10100111 = 11010110\)

Ένα σημαντικό χαρακτηριστικό του XOR είναι πως αν δώσεις την ίδια τιμή δυο φορές, παίρνεις ως αποτέλεσμα την αρχική τιμή. Δηλαδή:

\(01110001 \bigoplus 10100111 = 11010110\)
\(11010110 \bigoplus 10100111 = 01110001\)

Με πιο απλά λόγια, αν \(A \bigoplus B = C\), τότε \(C \bigoplus B = A\). Στην περίπτωση λοιπόν του RC4, μπορούμε να εκμεταλλευτούμε αυτή την ιδιότητα ως εξής:

Κρυπτογράφηση:  Plaintext \( \bigoplus\) Random = Ciphertext
Αποκρυπτογράφηση:  Ciphertext \( \bigoplus\) Random = Plaintext

 
Είναι απαραίτητο το “Random” να φαίνεται όντως τυχαίο σε κάποιον επιτιθέμενο αλλά το κακό είναι πως με όποια σειρά κι αν δώσουμε τα πακέτα, το Random θα βγαίνει πάντα το ίδιο και γι’ αυτό ονομάζεται ψευδο-τυχαίο. Η πιο σημαντική ιδιότητα του ψευδο-τυχαίου key stream είναι το γεγονός ότι μπορείς να υπολογίσεις το επόμενο byte της σειράς μόνο αν γνωρίζεις το κλειδί που χρησιμοποιήθηκε για την παραγωγή του stream. Αν δεν γνωρίζεις το κλειδί, τότε το stream φαίνεται όντως τυχαίο. Πρέπει να ‘χεις κατά νου επίσης ότι το XOR κρύβει τελείως τις τιμές του κανονικού μηνύματος (του plaintext δηλαδή), κοινώς, ακόμα κι αν το μήνυμα είναι απλά μια σειρά από μηδενικά, το ciphertext που θα παραχθεί θα μοιάζει πάλι τυχαίο. Το XOR είναι αρκετά εύκολο για έναν υπολογιστή να εκτελεστεί οπότε η μόνη πρόκληση είναι να παραχθεί ένα καλό ψευδο-τυχαίο stream. Χρειαζόμαστε ένα ψευδο-τυχαίο byte για κάθε byte μηνύματος που θέλουμε να κρυπτογραφήσουμε και αυτό μας το προμηθεύει το RC4 περνώντας από δυο φάσεις: το key setup και το pseudo-random generation (δεν τα μεταφράζω γιατί είναι ορολογία κι άμα θελήσεις να τα ψάξεις στο internet, δεν θα βρεις τίποτα αν τα γράψω στα ελληνικά). Στην πρώτη φάση, ο αλγόριθμος του key setup καθιερώνει ένα array μεγέθους 256 bytes με μετατεθειμένους τους αριθμούς από το 0 ως το 255, δηλαδή όλοι οι αριθμοί υπάρχουν μέσα στο array αλλά ανακατεμένοι. Η μετάθεση των αριθμών μέσα στο array ονομάζεται S-box και πραγματοποιείται δημιουργώντας αρχικά ένα array με τους αριθμούς από το 0 ως το 255 σε κανονική σειρά. Στη συνέχεια, ένα δεύτερο array μεγέθους 256 bytes δημιουργείται που ονομάζεται K-box και γεμίζει με το κλειδί επαναλαμβανόμενο τόσες φορές όσες χρειάζεται για να γεμίσει. Τώρα, κάθε byte μέσα στο S-box αλλάζει θέση με κάποιο άλλο byte μέσα στο S-box. Ξεκινώντας από το πρώτο byte, γίνεται ο ακόλουθος υπολογισμός (το \(j\) παίρνει τιμές μεγέθους ενός byte και οποιοδήποτε overflow κατά την πρόσθεση αγνοείται):

\(j\) = (τιμή στο πρώτο byte του S-box) + (τιμή στο πρώτο byte του K-box)

Τώρα το \(j\) χρησιμοποιείται σαν δείκτης μέσα στο S-box και η τιμή στην θέση που δείχνει, αλλάζει θέση με την τιμή που βρίσκεται στην πρώτη θέση. Αυτή η διαδικασία επαναλαμβάνεται άλλες 255 φορές μέχρι όλα τα bytes μέσα στο S-box να έχουν αλλάξει θέση. Σε ψευδοκώδικα, αυτή η διαδικασία θα γραφόταν ως εξής:

i = j = 0;
For i = 0 to 255 do
j = ( j + S(i) + K(i) ) mod 256;
Swap S(i) and S(j);
end;

Αφού λοιπόν το S-Box έχει δημιουργηθεί, πρέπει να πάμε στην δεύτερη φάση του RC4, το pseudorandom generation. Αυτή η φάση περιλαμβάνει κι άλλες μεταθέσεις bytes μέσα στο S-box και παράγει ένα ψευδο-τυχαίο byte σε κάθε επανάληψη (την οποία συμβολίζουμε με το \(R\)). Οι εξισώσεις των επαναλήψεων έχουν ως εξής:

i = ( i + 1 ) mod 256
j = ( j + S(i) ) mod 256
Swap S(i) and S(j);
k = ( S(i) + S(j) ) mod 256
R = S(k)

Τέλος, για να παράγουμε το ciphertext, κάθε byte του plaintext XORίζεται (λολ) με μια τιμή του \(R\) όπως παράγεται από τον αλγόριθμο του RC4. Αυτή η μέθοδος είναι πραγματικά ασφαλής μόνο όταν το \(R\) είναι ένα πραγματικά τυχαίο byte αλλά όπως είπαμε νωρίτερα, η παραγωγή τυχαίων αριθμών είναι μεγάλο κεφάλαιο.

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

Οι στόχοι για να σπάσει η κρυπτογράφηση είναι δυο: να αποκρυπτογραφηθεί ένα μήνυμα ή να περάσει το κλειδί στην κατοχή του επιτιθέμενου. Φυσικά η απόκτηση του κλειδιού είναι και η απόλυτη επιτυχία μιας και από κει και πέρα μπορεί ελεύθερα να αποκρυπτογραφεί όλα τα πακέτα που ανταλλάσσονται μεταξύ του δικτύου και του χρήστη και να ψάχνει για πολύτιμες πληροφορίες. Αυτό βέβαια δεν σημαίνει πως θα αποκτήσει πρόσβαση στα αρχεία του υπολογιστή μας διότι υπάρχουν άλλα συστήματα ασφαλείας που αποτρέπουν κάτι τέτοιο. Μπορεί όμως να δει όλα όσα ανταλλάσσουμε στο δίκτυο. Επίσης, αν ο επιτιθέμενος βρει το κλειδί, μπορεί πρακτικά να περάσει απαρατήρητος και να έχει όλο τον χρόνο να ψάξει για χρήσιμες πληροφορίες. Αν γίνει αντιληπτός, ο διαχειριστής του δικτύου θα αλλάξει τον κωδικό (κλειδί) κι έτσι ο επιτιθέμενος θα βρίσκεται πίσω στο μηδέν.

Το αμέσως επόμενο καλύτερο μετά την απόκτηση του κλειδιού, είναι η απόκτηση του plaintext. Αν μπορεί να αποκτηθεί με έναν σχετικά γρήγορο και ασφαλή τρόπο, μετά ο επιτιθέμενος έχει πρόσβαση σε πολλά είδη επιθέσεων όπως η τροποποίηση μηνυμάτων (tampering) ή η επανάληψη (replay). Επίσης, η απόκτηση του plaintext είναι και το πρώτο σκαλοπάτι για την απόκτηση των κλειδιών.

Υπάρχουν τρεις αδυναμίες στον τρόπο με τον οποίο το WEP χρησιμοποιεί το RC4 και θα τις εξετάσουμε κάθε μια ξεχωριστά:

1) επαναχρησιμοποίηση των IVs

Αναλύσαμε νωρίτερα το πώς χρησιμοποιείται το IV ώστε δυο πανομοιότυπα μηνύματα να μην παράγουν το ίδιο ciphertext και είπαμε επίσης πως δεν πρέπει να χρησιμοποιηθεί το ίδιο IV δεύτερη φορά με το ίδιο κλειδί αλλά όπως αποδείχτηκε αυτό είναι κάτι σχεδόν αδύνατο να αποφευχθεί. Το 802.11 Standard όχι μόνο δεν αναφέρει με ποιόν τρόπο πρέπει να παράγονται τα IVs αλλά λέει πως δεν χρειάζεται καν να αλλάζουν! Θα σκεφτείς τώρα πως ο καλύτερος τρόπος είναι να παράγονται τυχαία (όσο τυχαία μπορεί να τα παράξει ένας υπολογιστής). Σε αυτή την περίπτωση όμως, διατρέχεις τον κίνδυνο να πάρεις ένα IV για δεύτερη φορά πολύ γρήγορα, πράγμα που είναι γνωστό ως το παράδοξο των γενεθλίων.
 
Στην περίπτωση λοιπόν των IVs, έχεις πολλές πιθανότητες να πάρεις το ίδιο IV για δεύτερη φορά πολύ πιο σύντομα απ’ ότι θα περίμενες. Η καλύτερη επιλογή θα ήταν να χρησιμοποιήσεις αύξουσες τιμές με βήμα 1 που θα σου δώσουν το μεγαλύτερο εφικτό χρόνο πριν πέσεις σε επανάληψη (υπενθυμίζω πως στην περίπτωση του WEP, μέχρι το 16.777.216 μιας και τόση είναι η μέγιστη τιμή των 24 bits). Είπαμε επίσης νωρίτερα ότι υπάρχουν πολλοί λόγοι οι οποίοι προκαλούν την επαναχρησιμοποίηση των IV και αυτό το πρόβλημα θα αναλύσουμε τώρα.

Αν γνωρίζεις το key stream που αντιστοιχεί σε μια τιμή του IV, μπορείς άμεσα να αποκωδικοποιήσεις κάθε σύνολο πακέτων που χρησιμοποιεί το ίδιο IV (και φυσικά το ίδιο κλειδί). Αυτό ισχύει ανεξάρτητα από το πόσα bits είναι το κλειδί. Για να μπορείς να αποκρυπτογραφείς κάθε μήνυμα, θα πρέπει να ξέρεις το key stream για κάθε πιθανή τιμή του IV αλλά επειδή υπάρχουν σχεδόν 17 εκατομμύρια πιθανές τιμές για το IV, ίσως ακούγεται κάπως δύσκολο. Όχι όμως αδύνατο! Αν θέλεις να αποθηκεύσεις ένα key stream μεγέθους 1.500 bytes για κάθε πιθανή τιμή του IV, θα χρειαστείς 23GΒ χώρο, κάτι διόλου δύσκολο και για τον πιο μούφα υπολογιστή της εποχής μας. Με μια τέτοια βάση δεδομένων, μπορείς να αποκωδικοποιήσεις οποιοδήποτε μήνυμα χωρίς να χρειάζεται να ξέρεις το κλειδί του δικτύου. Για να βρεις όμως όλα τα key streams, δεν είναι και τόσο εύκολο.

Ας υποθέσουμε πως έχεις συλλάβει δυο μηνύματα κρυπτογραφημένα με το ίδιο IV και το ίδιο κλειδί και άρα γνωρίζεις πως το key stream είναι το ίδιο και στα δυο, οπότε κάνεις τα εξής:

Ξέρουμε ότι Ciphertext = Plaintext XOR Keystream
δηλαδή:
\(C_{1} = P_{1} \bigoplus K_{s}\) (για το πρώτο μήνυμα)
και
\(C_{2} = P_{2} \bigoplus K_{s}\) (για το δεύτερο μήνυμα)

Αν κάνουμε XOR τα \(C_{1}\) και \(C_{2}\), το \(K_{s}\) εξαφανίζεται:

\begin{align}
C_{1} &\bigoplus C_{2} = \\
( P_{1} \bigoplus K_{s} ) &\bigoplus ( P_{2} \bigoplus K_{s} ) = \\
P_{1} \bigoplus P_{2} &\bigoplus K_{s} \bigoplus K_{s} = \\
P_{1} &\bigoplus P_{2}
\end{align}

Αυτό είναι αληθές διότι είπαμε πως όταν κάνουμε XOR την ίδια τιμή δυο φορές, γυρνάμε πίσω στην αρχική τιμή. Οπότε τώρα έχεις το μήνυμα που είναι αποτέλεσμα του XOR μεταξύ δυο plaintexts. Το σπάσαμε λοιπόν; Όχι ακόμα, αλλά κάποιες τιμές του plaintext είναι γνωστές, όπως για παράδειγμα συγκεκριμένα πεδία στο header. Σε κάποια άλλα πεδία, οι τιμές δεν είναι γνωστές αλλά είναι ο σκοπός τους όπως στην περίπτωση του IP που οι πιθανές τιμές του είναι περιορισμένες. Επίσης, το κυρίως κομμάτι του plaintext συνήθως κωδικοποιεί χαρακτήρες ASCII που επίσης μας δίνει κάποιες πληροφορίες.

Όσο περνάει ο χρόνος και συλλέγεις όλο και περισσότερα IVs που έχουν επαναληφθεί, μπορείς να μαντέψεις όλο και μεγαλύτερο μέρος του key stream και συνεπώς να αποκωδικοποιείς μεγαλύτερο μέρος του μηνύματος. Είναι σαν να παίζεις κρεμάλα! Έχεις μερικά γράμματα και προσπαθείς να βρεις την λέξη, κάτι που γίνεται όλο και πιο εύκολο όσο μαντεύεις σωστά γράμματα που περιέχονται σε αυτήν. Μόλις λοιπόν το καταφέρεις αυτό για ένα IV, μπορείς από κει και πέρα να αποκωδικοποιήσεις κάθε μελλοντικό μήνυμα που χρησιμοποιεί αυτό το IV καθώς επίσης και να παράξεις ψεύτικα μηνύματα χρησιμοποιώντας αυτό το IV και όλα αυτά χωρίς να γνωρίζεις καν το κλειδί.

Όλα αυτά όμως χρειάζονται τεράστια προσπάθεια ώστε να αποκωδικοποιηθεί ένας σημαντικός αριθμός μηνυμάτων και η ανάγκη νοημοσύνης στο να μαντέψει κανείς το plaintext κάνει πολύ δύσκολη την δημιουργία ενός προγράμματος που θα το κάνει αυτόματα. Μην απογοητεύεσαι, σου ‘χω κι άλλα!

2) Weak RC4 Keys

Το πως λειτουργεί το RC4, το διάβασες νωρίτερα. Τώρα θα δεις και τις αδυναμίες του! Ξέρεις πως το RC4 ανακατεύει ένα array 255 τιμών χρησιμοποιώντας δυο δείκτες. Αν θέλουμε να υπολογίσουμε πόσους πιθανούς συνδυασμούς ανακατέματος μπορούμε να έχουμε μέσα σε ένα array μεγέθους 255 τιμών με 2 δείκτες, θα πρέπει να εκτελέσουμε την πράξη \(512 \dot 256!\). Το αποτέλεσμα είναι όντως άξιο θαυμασμού αλλά σε αυτή την περίπτωση το θαυμαστικό είναι το μαθηματικό σύμβολο του παραγοντικού. Μην βγάλεις κομπιουτεράκι και προσπαθήσεις να το υπολογίσεις γιατί θα το κάψεις. Ας πούμε απλά ότι είναι ένας πολύ μεγάλος αριθμός.

Θα θυμάσαι το Initialization Phase του RC4 που είπαμε νωρίτερα, όπου το πρώτο ψευδο-τυχαίο byte παράγεται ανακατεύοντας το S-Box με την χρήση του K-Box και επιλέγοντας ένα byte. Το πρόβλημα εδώ είναι πως δεν υπάρχουν αρκετές μεταθέσεις τιμών μεταξύ του K-Box και του πρώτου ψευδο-τυχαίου byte. Αποδείχτηκε πως για κάποιες συγκεκριμένες τιμές του K-Box, που ονομάζονται Weak Keys, ένας δυσανάλογος αριθμός από bits στα πρώτα λίγα bytes του key stream (το σύνολο των ψευδο-τυχαίων bytes δηλαδή) καθορίζονταν από μερικά bits του ίδιου του κλειδιού. Σε μπέρδεψα; Ας το δούμε λίγο καλύτερα:

Ιδανικά, αν αλλάξεις ένα bit του κλειδιού, τότε το key stream που θα παραχθεί θα πρέπει να είναι εντελώς διαφορετικό. Κάθε bit θα πρέπει να έχει 50% πιθανότητες να είναι διαφορετικό από το προηγούμενο key stream. Αυτό που αποδείχθηκε όμως ήταν πως αυτό τελικά δεν συμβαίνει στην πράξη. Κάποια bits του κλειδιού είχαν μεγαλύτερη επιρροή στο key stream ενώ κάποια άλλα δεν είχαν καμία τουλάχιστον στα πρώτα λίγα bytes. Αυτό είναι κακό για δυο λόγους. Πρώτον, διότι αν μειώσεις τον αριθμό των αποτελεσματικών bits, είναι πιο εύκολη η επίθεση στο κλειδί. Δεύτερον, τα πρώτα λίγα bytes του plaintext συνήθως είναι εύκολο να τα μαντέψει κανείς γιατί για παράδειγμα, στο WEP, είναι συνήθως το LLC header που ξεκινάει με την ίδια δεκαεξαδική τιμή “ΑΑ”. Αν ξέρεις το plaintext, μπορείς να αντλήσεις το key stream και να αρχίσεις να σπας το κλειδί.

Η απλή λύση σε αυτό το πρόβλημα θα ήταν να πετάξουμε τα πρώτα λίγα bytes του key stream (τα πρώτα 256 bytes θα αρκούσαν) αλλά φυσικά αυτό είναι αδύνατον στο WEP διότι τα παλιότερα συστήματα δεν θα μπορούσαν να συνεργαστούν με το καινούριο δίκτυο. Σκέφτεσαι εσύ τώρα “εντάξει μωρέ, μπορεί να μην χρησιμοποιώ weak key ή μπορεί, αν ήξερα ποια είναι τα weak keys, να τα απέφευγα”. Αν αντί γι’ αυτό, σκέφτεσαι πως δεν υπάρχει διαφυγή απ’ αυτό το πρόβλημα, μπράβο γιατί προφανώς έχεις κατά νου τα IVs τα οποία αλλάζουν συνεχώς κι έτσι αργά ή γρήγορα, θα πάρεις και weak keys. Αυτά τα weak keys είναι το τελευταίο οχυρό που έμελε να πέσει στην ασφάλεια του WEP.

3) Απευθείας επίθεση στο κλειδί

Γνωρίζουμε λοιπόν πως θα μπορούσε κάποιος να περιμένει ένα weak key και μόλις το πάρει, να του επιτεθεί απευθείας. Αυτό γίνεται εφικτό από το γεγονός ότι στην σύνταξη του πακέτου, το IV προηγείται του κλειδιού και αυτό το καθιστά πολύ πιο ευάλωτο σε επιθέσεις απ’ ότι αν το IV ακολουθούσε το κλειδί. Για άλλη μια φορά το WEP χρησιμοποιεί τις πιο ευάλωτες μεθόδους, όπως θα έχεις καταλάβει μέχρι τώρα. Πώς όμως πραγματοποιείται αυτή η επίθεση;

Πρώτα, υπέθεσε ότι γνωρίζεις τα πρώτα bytes του plaintext, που πράγματι τα γνωρίζεις γιατί είναι το LLC SNAP header όπως ορίζει το 802.11 Standard. Ύστερα, παρακολούθησε το δίκτυο μέχρι να παραχθεί ένα weak key από το IV. Τώρα γνωρίζεις πως υπάρχει μια συσχέτιση (correlation) μεταξύ του ciphertext, του plaintext και των bytes του κλειδιού. Υπάρχουν λίγες πιθανές τιμές για το πρώτο byte του κλειδιού που θα μπορούσαν να ταιριάξουν με το plaintext και το ciphertext. Αφού λάβεις περίπου 60 τέτοια μηνύματα, μπορείς να μαντέψεις το πρώτο byte του κλειδιού με αρκετή βεβαιότητα.

Αυτή η μέθοδος μπορεί να ρυθμιστεί ώστε να επιτίθεται με την σειρά σε κάθε byte του κλειδιού ώσπου τελικά όλο το κλειδί να αποκρυπτογραφηθεί. Να σημειώσω εδώ πως μεγαλώνοντας το κλειδί από τα 40 bits στα 104 bits σημαίνει ότι θα χρειαστεί 2,5 φορές περισσότερος χρόνος για να σπάσει το κλειδί. Κοινώς, ο χρόνος αυξάνεται γραμμικά και όχι εκθετικά οπότε και δεν πρόκειται για καμιά τρελή βελτίωση.

Όπως είπαμε λίγο νωρίτερα, η απόλυτη επιτυχία είναι να βρει κάποιος το κλειδί και όπως μόλις είδες, αυτό είναι εφικτό. Η διαδικασία είναι αρκετά μηχανική οπότε δεν άργησαν να βγουν και τα πρώτα προγράμματα που αυτοματοποιούν την διαδικασία, όπως το αγαπημένο σου Aircrack το οποίο φυσικά κάνει πολύ περισσότερα αλλά όταν το χρησιμοποιείς για να σπάσεις WEP, χρησιμοποιεί όλα όσα διάβασες παραπάνω για να το επιτύχει. Εξάλλου, αν έχεις παρατηρήσει ποτέ όλα αυτά που γράφει το Aircrack την ώρα που σπάει τον κωδικό, θα έχεις δει και πολλές λέξεις που συναντήσαμε κι εδώ όπως authentication, association, replay κτλ.

Βλέπεις λοιπόν πόση θεωρία κρύβει από πίσω το σπάσιμο ενός δικτύου που πλέον ο καθένας, με ελάχιστες γνώσεις μπορεί να το κάνει αλλά κανείς σχεδόν δεν αντιλαμβάνεται τον τρόπο με τον οποίο επιτυγχάνεται αυτό. Φυσικά, σε πολλά σημεία απέφυγα να μπω σε λεπτομέρειες γιατί θα κατέληγα να γράφω εγκυκλοπαίδεια αντί για άρθρο αλλά αν θες, μπορείς να τα ψάξεις μόνος σου. Αυτός είναι κι ο ένας από τους δυο λόγους που κρατάω την αγγλική ορολογία. Ο δεύτερος είναι επειδή σιχαίνομαι τις μεταφράσεις τεχνικών όρων!

Μπορεί να ήξερες πώς να σπας δίκτυα WEP, αλλά τώρα πλέον ξέρεις ακριβώς τι συμβαίνει πίσω από τις εντολές που πληκτρολογείς. Συγχαρητήρια 😉

Leave a Reply

Your email address will not be published.