otw_krypton1_01

Ψαχνοντας στο διαδίκτυο για στρατωτικά θέματα έπεσα πάνω σε αυτό το ενδιαφέρον αθρο το οποίο αφορά την Κρυπτογραφία. Κατά την ανάγνωση του άρθρου μπορείται ακόμη και να αποκρυπτογραφήσετε ένα μήνυμα (!). Το άρθρο έχει δημοσιευθεί στο blog Αμυντικά και Στρατιωτικά Θέματα

Όπως έχουμε αναφέρει επανειλημμένα σε άρθρα μας, η ασφάλεια είναι ένα θέμα τεράστιο που, καλώς ή κακώς, απαιτεί τόσο θεωρητικές όσο και πρακτικές γνώσεις. Τα πολεμικά παίγνια έχουν στόχο να δώσουν τις απαραίτητες ικανότητες και είναι από τις πιο βασικές μεθόδους εκπαίδευσης στο χώρο της ηλεκτρονικής ασφάλειας. Με αυτό το άρθρο ξεκινάμε μία νέα σειρά όπου παίζοντας κάποια τέτοια παιχνίδια θα μάθουμε πρακτικά θέματα ηλεκτρονικής ασφάλειας. Θα ξεκινήσουμε με τα πολεμικά παίγνια της ιστοσελίδας OverTheWire.org (ή για συντομία OTW) η οποία έχει παιχνίδια σχεδιασμένα από κάποιους από τους πιο αξιόλογους ερευνητές ασφάλειας υπολογιστών στο κόσμο. Θα ξεκινήσουμε με τη κατηγορία της κρυπτογραφίας που η σελίδα αυτή την ονομάζει Krypton από την αντίστοιχη Ελληνική λέξη.

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

Πηγή: OverTheWire.org
Το πρώτο επίπεδο μας δίνει όλες τις πληροφορίες που ίσως να χρειαστούμε για την επίλυση του. Αν μεταφράσουμε το παραπάνω στα Ελληνικά γράφει:


Καλωσορίσατε στο Krypton! Το πρώτο επίπεδο είναι εύκολο. Η παρακάτω σειρά χαρακτήρων κωδικοποιεί το κωδικό χρησιμοποιώντας Base64:

S1JZUFRPTklTR1JFQVQ=

Χρησιμοποιήστε αυτό το κωδικό για να συνδεθείτε στο krypton.labs.overthewire.org με όνομα χρήστη krypton1 χρησιμοποιώντας SSH. Μπορείτε να βρείτε τα αρχεία για τα υπόλοιπα επίπεδα στο κατάλογο /krypton/


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

Πηγή: blog.iconfinder.com
Οι υπολογιστές αναγνωρίζουν μόνο μηδενικά και μονάδες, το γνωστό δυαδικό σύστημα. Κάποια από αυτά εκφράζονται με χαρακτήρες που μπορούμε να τους διαβάσουμε όπως για παράδειγμα το κείμενο από αυτό το άρθρο και κάποια άλλα δεν μπορούν να εκφραστούν με τέτοιους χαρακτήρες στην οθόνη, όπως για παράδειγμα τα περιεχόμενα ενός MP3 αρχείου ήχου. Αυτά που δεν μπορούμε να τα «τυπώσουμε» στην οθόνη τα ονομάζουμε binary (δυαδικά) αρχεία και τα άλλα που μπορούμε να τα τυπώσουμε τα ονομάζουμε plaintext (απλό κείμενο). Το 1992 καθιερώθηκε μία μορφή κωδικοποίησης για μηνύματα ηλεκτρονικού ταχυδρομείου (email) ώστε να μπορούν να σταλούν μέσω email και binary αρχεία όπως φωτογραφίες, βίντεο, κτλ. Μέχρι εκείνη τη στιγμή αυτό ήταν αδύνατο διότι το πρωτόκολλο επικοινωνίας για αποστολή email δεν επέτρεπε δεδομένα που δεν είναι plaintext. Έτσι γεννήθηκε η κωδικοποίηση Base64 που έχει στόχο τη μετατροπή binary αρχείων σε plaintext ώστε να μπορούν να σταλούν με πρωτόκολλα επικοινωνίας που δέχονται μόνο plaintext δεδομένα, όπως το email.

Πηγή: jellyfish.net
Τώρα γιατί ονομάστηκε Base64, στα μαθηματικά υπάρχει το λεγόμενο radix (από τη Λατινική λέξη που σημαίνει ρίζα-βάση) ή στα Ελληνικά βάση αριθμητικού συστήματος που περιγράφει από πόσα ψηφία αποτελείται ένα αριθμητικό σύστημα. Για παράδειγμα, το δεκαδικό σύστημα που χρησιμοποιούμε σχεδόν παντού είναι radix-10 ή αλλιώς Base10 καθώς έχει δέκα ψηφία, από το 0 μέχρι και το 9. Ο τρόπος που το αναπαριστούμε στα μαθηματικά είναι με ένα δείκτη, αν θέλουμε να πούμε ότι η τιμή χ φαίνεται στο δυαδικό σύστημα θα τη γράψουμε (χ)2 για παράδειγμα. Οπότε, όπως αντιλαμβάνεστε, το Base64 είναι ένα αριθμητικό σύστημα με 64 ψηφία και μπορείτε να δείτε όλα τα ψηφία από τα οποία αποτελείται στο παρακάτω πίνακα που τα έχει όλα από τη θέση 0 μέχρι και την 63, δηλαδή 64 ψηφία. Αρχικά έχει όλα τα κεφαλαία γράμματα του Λατινικού αλφάβητου, έπειτα όλα τα μικρά, όλα τα νούμερα και τέλος δύο ειδικούς χαρακτήρες.

otw_krypton1_05

Πηγη Wikipedia.org

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

T E S T
01010100 01000101 01010011 01010100

Για να μετατρέψουμε το παραπάνω από δυαδικό, δηλαδή από Base2, σε Base64 τα χωρίζουμε σε εξάδες και βλέπουμε σε ποιο νούμερο αντιστοιχούν. Για παράδειγμα, η πρώτη εξάδα θα είναι 010101 που σε δεκαδικό είναι 21 και από τον πίνακα του Base64 βλέπουμε ότι το 21 είναι το γράμμα V. Αν τα κάνουμε όλα θα έχουμε το ακόλουθο αποτέλεσμα.

010101 000100 010101 010011 010101 00????
21 4 21 19 21 0
V E V T V A

Βλέπουμε ότι η τελευταία εξάδα αποτελούνταν από μόνο δύο δυαδικά ψηφία. Για να μπορέσει όμως όμως το Base64 να κάνει τους υπολογισμούς πρέπει να είναι εξάδα. Οπότε προσθέτει τέσσερα ακόμα ψηφία τα οποία ανά δύο αντιστοιχούν στον ειδικό χαρακτήρα =. Έτσι το τελικό αποτέλεσμα είναι:

VEVTVA==

Γνωρίζοντας τα παραπάνω μπορούμε να κάνουμε με χαρτί και μολύβι ολόκληρη την αποκωδικοποίηση του κωδικού πρόσβασης από S1JZUFRPTklTR1JFQVQ= σε κανονικό κείμενο. Στο διαδίκτυο υπάρχουν ωστόσο και αρκετές ιστοσελίδες που μπορούν να το κάνουν αυτό για εμάς, για παράδειγμα βλέπετε το αποτέλεσμα της ιστοσελίδας Base64Decode.org εδώ.

Πηγή: Base64Decode.org
Γνωρίζουμε πλέον ότι το αποκωδικοποιημένο κείμενο (ο κωδικός πρόσβασης για το επόμενο επίπεδο) είναι «KRYPTONISGREAT» αλλά μπορούμε να κάνουμε το ίδιο και χωρίς πρόσβαση στο διαδίκτυο και χωρίς χαρτί και μολύβι. Εφόσον ο στόχος μας με αυτές τις ασκήσεις είναι να μάθουμε περισσότερα για την ηλεκτρονική ασφάλεια θα το κάνουμε και με αυτό το τρόπο. Αν χρησιμοποιείτε λειτουργικό σύστημα Microsoft Windows μπορείτε να πατήσετε Win+R και να πληκτρολογήσετε powershell το οποίο θα σας δώσει πρόσβαση σε μία γραμμή εντολών.

Πηγή: Προσωπικό αρχείο
Η γραμμή εντολών PowerShell που θα εμφανιστεί σε ένα νέο παράθυρο θα είναι κάτι όπως το παρακάτω. Η γραμμή εντολών ξεκινάει με τα αρχικά του ονόματος του προγράμματος που έχουμε ανοιχτό που είναι το PowerShell, δηλαδή PS, και έπειτα ακολουθούν το που βρισκόμαστε που σε αυτή τη περίπτωση είναι μέσα στο φάκελο \Users\defensegr που όπως φαίνεται από το μονοπάτι είναι μέσα στο σκληρό δίσκο C: και μετά από την ένδειξη > γράφουμε τις εντολές μας.

Πηγή: Προσωπικό αρχείο
Τώρα αυτό που θα γράψουμε είναι η εντολή που βλέπετε στη συνεχεία και που θα περιγράψουμε αμέσως το τι κάνει.

$kwdikos = [System.Convert]::FromBase64String("S1JZUFRPTklTR1JFQVQ=")

Στο PowerShell οτιδήποτε ξεκινάει με το σύμβολο $ θεωρείται μεταβλητή. Άρα, εδώ έχουμε μία μεταβλητή που την ονομάσαμε $kwdikos στην οποία αποθηκεύουμε το αποτέλεσμα από μία συνάρτηση. Από τη συνάρτηση [System.Convert]::FromBase64String() η οποία όπως φαίνεται από το όνομα της, FromBase64String(), δέχεται ως παράμετρο μία σειρά χαρακτήρων κωδικοποιημένη με Base64 και τα μετατρέπει σε κείμενο με το τρόπο που περιγράψαμε. Αυτή η συνάρτηση είναι μέρος της βιβλιοθήκης συναρτήσεων Convert που με τη σειρά της είναι μέρος της βιβλιοθήκης συναρτήσεων του συστήματος μας. Οπότε το [System.Convert]::FromBase64String() σημαίνει ότι από τη βιβλιοθήκη Convert που είναι μέρος της βιβλιοθήκης System χρησιμοποίησε τη συνάρτηση FromBase64String(). Τέλος, γράφουμε ως παράμετρο σε αυτή τη συνάρτηση το κωδικοποιημένο κείμενο μέσα σε εισαγωγικά. Τέλος, πατάμε Enter για να δώσουμε την εντολή αυτή στο σύστημα και θα πρέπει να έχουμε αποτέλεσμα όπως αυτό που βλέπετε στη παρακάτω εικόνα.

Πηγή: Προσωπικό αρχείο
Όταν η γραμμή εντολών δεν αναφέρει κάποιο σφάλμα σε κάτι που πληκτρολογήσαμε σημαίνει ότι η εντολή εκτελέστηκε με επιτυχία. Επίσης, αυτό σημαίνει ότι τώρα έχουμε μία μεταβλητή που περιέχει το αποκωδικοποιημένο κείμενο που αναζητούμε. Το μόνο που απομένει είναι να ζητήσουμε από τη γραμμή εντολών PowerShell να μας το εμφανίσει και αυτό μπορούμε να το κάνουμε με την παρακάτω εντολή.

[System.Text.Encoding]::ASCII.GetString($kwdikos)

Αντίστοιχα με προηγουμένως, χρησιμοποιούμε μία συνάρτηση από τη βιβλιοθήκη Encoding που είναι μέρος της βιβλιοθήκης Text που ανήκει στη βιβλιοθήκη System. Η συνάρτηση που χρησιμοποιούμε είναι από τη κλάση ASCII, ονομάζεται GetString() και δέχεται μία παράμετρο που είναι η μεταβλητή που περιέχει το κείμενο που επιθυμούμε να τυπώσουμε στην οθόνη. Στη πράξη βλέπετε το αποτέλεσμα εδώ.

Πηγή: Προσωπικό αρχείο
Ωστόσο, αν χρησιμοποιείτε Apple OS X ή κάποια διανομή Linux ως λειτουργικό σύστημα τότε η διαδικασία αυτή γίνεται ακόμα πιο εύκολη χωρίς να χρειάζεται πρόσβαση στο διαδίκτυο λόγω των πολλών εργαλείων που προσφέρουν οι γραμμές εντολών σε αυτά τα λειτουργικά συστήματα. Ενδεικτικά, έχουν προεγκατεστημένο το μεταγλωττιστή της γλώσσας προγραμματισμού Perl η οποία είναι μία πολύ εύκολη και εύχρηστη γλώσσα που υπάρχει από το 1987 και χρησιμοποιείται μέχρι και σήμερα. Με τη γλώσσα προγραμματισμού Perl μπορούμε να κάνουμε την αποκωδικοποίηση Base64 πολύ εύκολα με τον παρακάτω τρόπο.

perl -MMIME::Base64 -le 'print MIME::Base64::decode_base64("S1JZUFRPTklTR1JFQVQ=");'

Αυτό γράφει η παραπάνω εντολή είναι η εκτέλεση του προγράμματος perl χρησιμοποιώντας τη βιβλιοθήκη MIME::Base64, αυτό το κάνουμε γράφοντας το όνομα της βιβλιοθήκης μετά από τη παράμετρο -Μ που είναι από τη λέξη Module. Έπειτα έχουμε τις δύο παραμέτρους -l και -e που τις έχουμε βάλει μαζί ως -le. Η πρώτη θα κάνει το πρόγραμμα μας να προσθέσει μία κενή γραμμή (line) μετά την εκτέλεση του και η δεύτερη, η -e, λέει στο πρόγραμμα perl να εκτελέσει (execute) ότι είναι γραμμένο μέσα στα εισαγωγικά. Όλες οι εντολές της γλώσσας προγραμματισμού Perl τελειώνουν με το σύμβολο ; και έτσι εδώ βλέπουμε ότι έχουμε μία μόνο εντολή. Η εντολή αυτή λέει στο πρόγραμμα να τυπώσει στην οθόνη (print) το αποτέλεσμα της συνάρτησης decode_base64() που είναι μέρος της βιβλιοθήκης συναρτήσεων Base64 που είναι μέρος της βιβλιοθήκης MIME. Στη συνάρτηση decode_base64() δίνουμε ως παράμετρο μέσα σε διπλά εισαγωγικά το κωδικοποιημένο κείμενο μας και το αποτέλεσμα το βλέπετε στη συνέχεια.

Πηγή: Προσωπικό αρχείο
Και κάπως έτσι ολοκληρώσαμε το πρώτο επίπεδο και το οποίο μας έμαθε αρκετά πράγματα για τη κωδικοποίηση Base64, για τον προγραμματισμό και πάνω απ’όλα, μία εισαγωγή στο τρόπο σκέψης. Με αυτές τις γνώσεις μπορούμε να αποκωδικοποιήσουμε ένα κωδικοποιημένο με Base64 κείμενο με έτοιμα εργαλεία από ιστότοπους, με δικά μας εργαλεία σε οποιοδήποτε από τα δημοφιλή λειτουργικά συστήματα, ακόμα και με χαρτί και μολύβι!

Πηγή defensegr.wordpress.com