Τη προηγούμενη εβδομάδα αναρτήσαμε το εισαγωγικό επίπεδο από το πολεμικό παίγνιο κρυπτογραφίας της ιστοσελίδας OverTheWire.org (ή για συντομία OTW). Μπορείτε να το βρείτε ακολουθώντας το σύνδεσμο «Πολεμικά Παίγνια: OTW Krypton #0». Σήμερα θα συνεχίσουμε στο επόμενο επίπεδο που είναι λίγο πιο δύσκολο και έχει πολλά να μας διδάξει. Όπως και στη προηγούμενη ανάρτηση, σας προτείνουμε να προσπαθήσετε να λύσετε μόνοι το πρόβλημα προτού διαβάσετε τη δική μας λύση.
Από τη περιγραφή του προηγούμενου επιπέδου γνωρίζουμε πως πρέπει να συνδεθούμε στον εξυπηρετητή krypton.labs.overthewire.org μέσω πρωτοκόλλου SSH, με όνομα χρήστη krypton1 και με κωδικό πρόσβασης τον κωδικό που αποκτήσαμε από το προηγούμενο επίπεδο. Ας δούμε λοιπόν τι μας γράφει η ιστοσελίδα του παιχνιδιού για αυτό το επίπεδο.
Όπου αν μεταφράσουμε το παραπάνω μήνυμα στα Ελληνικά, για να γίνει καλύτερα κατανοητό από όλους, έχουμε το παρακάτω.
Ο κωδικός για το επίπεδο 2 είναι στο αρχείο ‘krypton2’. Είναι ‘κρυπτογραφημένο’ με μία απλή αντικατάσταση. Επίσης είναι σε μη-συμβατική μορφή κρυπτογραφήματος. Όταν χρησιμοποιούμε χαρακτήρες του αλφάβητου για κρυπτογραφήματα είναι λογικό να ενώνουμε τις λέξεις σε ομάδες των 5 γραμμάτων, ασχέτως από τα όρια των λέξεων. Αυτό βοηθάει στο μπέρδεμα από οποιαδήποτε επαναλαμβανόμενα μοτίβα. Αυτό το αρχείο έχει διατηρήσει τα όρια των απλών λέξεων και τα μετέφερε στο κρυπτογράφημα. Απολαύστε!
Όπως διαβάζουμε θα πρέπει να είναι σχετικά απλή περίπτωση καθώς το κρυπτογράφημα δεν έχει πειράξει το μήκος των λέξεων. Τώρα για να συνδεθούμε με SSH, αν χρησιμοποιούμε Windows, χρειαζόμαστε κάποιο πρόγραμμα. Το πιο γνωστό είναι το PuTTY. Σε λειτουργικά συστήματα όπως Linux και Apple OS X υπάρχει προεγκατεστημένο το πρόγραμμα SSH που μπορούμε να το χρησιμοποιήσουμε από τη γραμμή εντολών απλώς πληκτρολογώντας «ssh». Όταν εκτελέσουμε το πρόγραμμα PuTTY βλέπουμε το παρακάτω παράθυρο.
Οπότε, στο πεδίο όπου αναγράφει «Host Name (or IP address)», δηλαδή όνομα εξυπηρετητή ή διεύθυνση IP, απλώς γράφουμε τη διεύθυνση του εξυπηρετητή που μας δόθηκε στο προηγούμενο επίπεδο.
Στη συνέχεια πατάμε το κουμπί «Open» για να συνδεθούμε στον εξυπηρετητή krypton.labs.overthewire.org όπως μας έγραφαν οι οδηγίες. Από αυτό το σημείο και έπειτα, είτε χρησιμοποιείτε Windows είτε κάποιο άλλο λειτουργικό σύστημα δεν έχει σημασία διότι θα κάνουμε όλη την εργασία στον απομακρυσμένο υπολογιστή, δηλαδή στο krypton.labs.overthewire.org, το οποίο χρησιμοποιεί Linux. Λογικά, θα λάβετε ένα μήνυμα όπως το ακόλουθο αν συνδέεστε για πρώτη φορά σε αυτό τον εξυπηρετητή.
Το μήνυμα μας προειδοποιεί ότι συνδεόμαστε για πρώτη φορά σε αυτό τον εξυπηρετητή και ότι το κρυπτογραφικό αναγνωριστικό κλειδί του είναι αυτό που αναγράφεται. Μας ρωτάει τι θέλουμε να κάνουμε με το αναγνωριστικό αυτού του εξυπηρετητή. Καθώς είναι η πρώτη φορά που συνδεόμαστε σε αυτό τον εξυπηρετητή προφανώς και ο υπολογιστής μας δεν έχει αποθηκευμένο αυτό το αναγνωριστικό. Πατώντας «Yes» λέμε στο PuTTY να αποθηκεύσει στη μνήμη του υπολογιστή μας το κλειδί-αναγνωριστικό του εξυπηρετητή ώστε να αναγνωρίζει αν είναι ο ίδιος όταν ξανασυνδεθούμε στο μέλλον. Πατώντας «No» του λέμε να συνδεθεί αλλά να μην αποθηκεύσει το κλειδί-αναγνωριστικό του εξυπηρετητή και τέλος, πατώντας «Cancel» του λέμε να ακυρώσει τη σύνδεση. Άρα πατάμε «Yes» ή «No» ανάλογα με το τι θέλουμε (εμείς πατήσαμε «Yes» καθώς θα ξανασυνδεθούμε στο μέλλον σε αυτό τον εξυπηρετητή και θέλουμε να γνωρίζουμε αν συνδεόμαστε σε κάποιο διαφορετικό εξυπηρετητή που κάνει χρήση του ίδιου ονόματος) και βλέπουμε το παρακάτω παράθυρο στο οποίο γράφουμε το όνομα χρήστη, «krypton1», και πατάμε Enter. Στη συνέχεια πληκτρολογούμε τον κωδικό πρόσβασης που αποκτήσαμε από το προηγούμενο επίπεδο.
Έτσι, έχουμε πλέον πρόσβαση στον εξυπηρετητή. Αυτό που θα δούμε θα είναι ένα τερματικό όπως το παρακάτω. Βλέπουμε ότι πριν από τη γραμμή εντολών γράφει «krypton1@melinda:~$» το οποίο μεταφράζεται με τον εξής τρόπο. Το πρώτο μέρος είναι το όνομα χρήστη με το οποίο έχουμε συνδεθεί, το σύμβολο @ (στα Αγγλικά προφέρεται at, δηλαδή, στο), μετά το όνομα του εξυπηρετητή που στη περίπτωση μας είναι «melinda», και έπειτα έχει άνω και κάτω τελεία ως διαχωριστικό, το κατάλογο στον οποίο βρισκόμαστε αυτή τη στιγμή και τέλος το σύμβολο $ που σημαίνει ότι μπορούμε να πληκτρολογήσουμε εντολές έπειτα από αυτό. Με απλά λόγια γράφει, ο χρήστης krypton1 στον υπολογιστή melinda βρίσκεται στον κατάλογο ~ (αυτό είναι συντόμευση για τον κατάλογο του χρήστη μας, δηλαδή το /home/krypton1) και αναμένει εντολές.
Πάνω ακριβώς από τη γραμμή εντολών υπάρχει ένα μεγάλο μήνυμα που εμφανίζεται κάθε φορά που συνδεόμαστε στον εξυπηρετητή αυτό ώστε να μας προσφέρει χρήσιμες πληροφορίες. Στη συνέχεια χρησιμοποιούμε την εντολή «cd» (Change Directory, Αλλαγή καταλόγου) ώστε να μεταβούμε στον κατάλογο /krypton/krypton1 όπου βρίσκεται το κρυπτογράφημα όπως έγραφαν οι οδηγίες, και εν συνεχεία την εντολή «ls» (List, εμφάνιση) με τη παράμετρο «-l» (list, δηλαδή εμφάνιση σε μορφή λίστας).
Βλέπουμε ότι μέσα σε αυτό το κατάλογο υπάρχουν δύο αρχεία, το πρώτο ονομάζεται README και το δεύτερο krypton2. Γνωρίζουμε από τη περιγραφή της άσκησης ότι ο κρυπτογραφημένος κωδικός είναι μέσα στο αρχείο krypton2 αλλά ας δούμε τι γράφει και το αρχείο README πριν ξεκινήσουμε. Για να το κάνουμε αυτό χρησιμοποιούμε την εντολή «cat» (catenate, ένωση κειμένου) όπως βλέπετε στη συνέχεια.
Αν μεταφράσουμε στα Ελληνικά το περιεχόμενο που βλέπουμε παραπάνω. Θα έχουμε το ακόλουθο αποτέλεσμα.
Καλωσορίσατε στο Krypton!
Το παιχνίδι έχει σκοπό να προσφέρει πρακτική εμπειρία σε κρυπτογραφία και κρυπτανάλυση. Τα επίπεδα εξελίσσονται από κλασικά κρυπτογραφήματα, σε σύγχρονα, από πιο εύκολα προς πιο δύσκολα.
Παρότι υπάρχουν εξαιρετικά εργαλεία διαθέσιμα δημοσίως, όπως το cryptool, για τη διενέργεια απλής ανάλυσης, σας ενθαρρύνουμε έντονα να προσπαθήσετε και να τα κάνετε χωρίς τέτοια εργαλεία για τώρα. Θα τα χρησιμοποιήσουμε σε ασκήσεις αργότερα.
** Παρακαλούμε δοκιμάστε αυτά τα επίπεδα χωρίς το cryptool αρχικά **
Το πρώτο επίπεδο είναι εύκολο. Ο κωδικός πρόσβασης για το επίπεδο 2 είναι μέσα στο αρχείο ‘krypton2’. Είναι ‘κρυπτογραφημένο’ χρησιμοποιώντας μία απλή αντικατάσταση που ονομάζεται ROT13.
Επίσης είναι σε μη-συμβατική μορφή κρυπτογραφήματος. Όταν χρησιμοποιούμε χαρακτήρες του αλφάβητου για κρυπτογραφήματα είναι λογικό να ενώνουμε τις λέξεις σε ομάδες των 5 γραμμάτων, ασχέτως από τα όρια των λέξεων. Αυτό βοηθάει στο μπέρδεμα από οποιαδήποτε επαναλαμβανόμενα μοτίβα. Αυτό το αρχείο έχει διατηρήσει τα όρια των απλών λέξεων και τα μετέφερε στο κρυπτογράφημα.
Απολαύστε!
Εδώ μας γράφει ξεκάθαρα ότι έχουμε να κάνουμε με ένα κείμενο κρυπτογραφημένο με τον αλγόριθμο ROT13 τον οποίο θα γνωρίσουμε καλύτερα στη συνέχεια. Αν δούμε τα και περιεχόμενα του αρχείου «krypton2» έχουμε το εξής κρυπτογράφημα.
Πράγματι, βλέπουμε ότι έχουμε κάτι που μοιάζει με πρόταση αλλά με λάθος γράμματα. Αποτελείται από τέσσερις λέξεις όπου η πρώτη έχει μήκος πέντε γράμματα, η δεύτερη τρία, η τρίτη οκτώ και η τελευταία έξι. Το ROT13 βγαίνει από την Αγγλική λέξη Rotate (αντικατάσταση) κατά 13 θέσεις. Είναι ένας από τους πιο απλούς αλγόριθμους κρυπτογράφησης καθώς το μόνο κλειδί για την κρυπτογράφηση ή αποκρυπτογράφηση του κειμένου είναι ο αριθμός αντικατάστασης. Εδώ γνωρίζουμε ότι ο αριθμός αυτός είναι 13. Τι σημαίνει αυτό; Σημαίνει ότι το γράμμα Α από το Λατινικό αλφάβητο θα αντικατασταθεί από το γράμμα που βρίσκεται 13 θέσεις μετά από αυτό. Οπότε, για την αποκρυπτογράφηση το μόνο που χρειαζόμαστε είναι να κάνουμε το αντίστροφο, δηλαδή για κάθε γράμμα που βλέπουμε να δούμε πιο γράμμα ήταν 13 θέσεις πίσω του. Αν θέλαμε να το δούμε από τη μαθηματική πλευρά του τότε θα είχαμε κάτι όπως αυτό για τη κρυπτογράφηση του κειμένου.
ROT(χ) = (χ + 13) (mod 26)
Όπου χ είναι το κάθε γράμμα από το αρχικό μας κείμενο. Δηλαδή, το αποτέλεσμα της κρυπτογράφησης του γράμματος χ είναι η αύξηση του κατά 13 θέσεις και η εκτέλεση της πράξης modulo ώστε να μην ξεφύγουμε από το όριο των 26 χαρακτήρων που έχει το Λατινικό αλφάβητο. Αντίστοιχα, η αποκρυπτογράφηση μπορεί να περιγραφεί κάπως έτσι:
ROT(χ) = (χ – 13) (mod 26)
Δηλαδή η μόνη διαφορά είναι ότι αντί να πηγαίνουμε προς τα εμπρός (πρόσθεση) 13 θέσεις, πηγαίνουμε προς τα πίσω (αφαίρεση). Ας κάνουμε τη δεύτερη λέξη που είναι μόλις τρία γράμματα με το χέρι για να γίνει καλύτερα κατανοητό το πως λειτουργεί. Η δεύτερη λέξη του κρυπτογραφήματος είναι η λέξη «GJB». Αν μετακινήσουμε το κάθε γράμμα 13 θέσεις προς τα πίσω το αποτέλεσμα θα είναι το ακόλουθο.
Από το παραπάνω φαίνεται γρήγορα ότι αν πάμε 13 θέσεις πίσω από το γράμμα G έχουμε το γράμμα T και αντίστοιχα για τα άλλα δύο γράμματα. Άρα βλέπουμε ότι η δεύτερη λέξη αντιστοιχεί στη λέξη «TWO». Θα μπορούσαμε να κάνουμε ακριβώς το ίδιο με χαρτί και μολύβι για όλες τις λέξεις αλλά θα ήταν ανούσιο καθώς μπορούμε να αυτοματοποιήσουμε τη διαδικασία. Η πιο εύκολη μέθοδος είναι να βρούμε κάποια ιστοσελίδα του διαδικτύου που κάνει αυτή την αποκρυπτογράφηση. Με μία σύντομη έρευνα σε οποιαδήποτε μηχανή αναζήτησης μπορούμε να βρούμε ιστοσελίδες όπως η rot13.com. Πληκτρολογώντας εκεί το κρυπτογράφημα παίρνουμε γρήγορα πίσω την απάντηση που ψάχνουμε.
Φυσικά, γνωρίζοντας τον αλγόριθμο κρυπτογράφησης και αποκρυπτογράφησης μπορούμε και οι ίδιοι να το αυτοματοποιήσουμε στον προσωπικό υπολογιστή μας χωρίς πρόσβαση σε άλλες ιστοσελίδες. Αντίστοιχα με το προηγούμενο επίπεδο, αν βρισκόμαστε σε περιβάλλον Windows μπορούμε να ανοίξουμε μία γραμμή εντολών PowerShell όπως περιγράψαμε στο προηγούμενο άρθρο μας και να πληκτρολογήσουμε το ακόλουθο. Παρακάτω θα παρουσιάσουμε το πως ακριβώς λειτουργεί αυτό το μικρό πρόγραμμα σε PowerShell βήμα προς βήμα.
$kryptografima = "YRIRY GJB CNFFJBEQ EBGGRA" $lat_alfabito = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" $r13_alfabito = "NOPQRSTUVWXYZABCDEFGHIJKLM" Foreach($gramma in $kryptografima.ToCharArray()) { If($gramma -match "[A-Z]") { $kwdikos += $lat_alfabito.Chars($r13_alfabito.IndexOf($gramma)) } else { $kwdikos += $gramma } } echo $kwdikos
Οτιδήποτε ξεκινάει με το χαρακτήρα $ θεωρείται μεταβλητή στη γλώσσα προγραμματισμού PowerShell. Οπότε αυτό που κάνουμε εδώ είναι το εξής. Αρχικά, αποθηκεύουμε το κρυπτογράφημα μας σε μία μεταβλητή με όνομα $kryptografima. Έπειτα σε μία άλλη μεταβλητή, στη $lat_alfabito, αποθηκεύουμε το Λατινικό αλφάβητο και σε μία τρίτη, στη $r13_alfabito, το Λατινικό αλφάβητο ανεστραμμένο κατά 13 θέσεις. Είναι οι ακόλουθες τρεις γραμμές από το πρόγραμμα μας.
$kryptografima = "YRIRY GJB CNFFJBEQ EBGGRA" $lat_alfabito = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" $r13_alfabito = "NOPQRSTUVWXYZABCDEFGHIJKLM"
Στη συνέχεια χρησιμοποιούμε την ρουτίνα επανάληψης Foreach() η οποία θα εκτελείται για όσο ισχύει η συνθήκη που έχουμε εντός των παρενθέσεων της και θα εκτελεί οτιδήποτε υπάρχει μέσα στις αγκύλες που έχει στη συνέχεια. Η συνθήκη που γράφουμε είναι η «$gramma in $kryptografima.ToCharArray()» που λέει στο Foreach(), να χωρίσει το $kryptografima σε μία λίστα από γράμματα με τη χρήση της συνάρτησης ToCharArray() και σε κάθε επανάληψη της Foreach() να παίρνει ένα γράμμα και να το αποθηκεύει στη μεταβλητή $gramma. Έτσι μπορούμε να επεξεργαστούμε το κάθε ένα γράμμα ξεχωριστά με κάθε επανάληψη της Foreach().
Foreach($gramma in $kryptografima.ToCharArray()) { Κώδικας προς εκτέλεση για κάθε γράμμα }
Το κρυπτογράφημα μας περιέχει τόσο κεφαλαία Λατινικά γράμματα όσο και κενά. Για να αποφύγουμε την προσπάθεια αποκρυπτογράφησης των κενών χαρακτήρων κάνουμε μία ακόμα συνθήκη που λέμε εάν το γράμμα ταιριάζει στο εύρος χαρακτήρων από Α μέχρι Z τότε κάνε την αποκρυπτογράφηση. Αυτό το κάνουμε με τον ακόλουθο τρόπο.
If($gramma -match "[A-Z]") { Αποκρυπτογράφηση }
Το αποτέλεσμα της αποκρυπτογράφησης το αποθηκεύουμε σε μία νέα μεταβλητή που την ονομάζουμε $kwdikos. Ωστόσο, πρέπει να λάβουμε υπόψιν μας το τι θα κάνουμε όταν θα συναντάμε τους κενούς χαρακτήρες στη μεταβλητή $gramma. Γι’αυτό, προσθέτουμε στο παραπάνω «If» το δεύτερο μέρος της συνθήκης, δηλαδή το «else» («αλλιώς» στα Ελληνικά) όπου γράφουμε πως αν το $gramma δεν είναι μέσα στο εύρος των γραμμάτων Α-Ζ, τότε απλώς πρόσθεσε στο $kwdikos οτιδήποτε έχει εκείνη τη στιγμή αποθηκευμένο η μεταβλητή $gramma, αυτό θα πρέπει να είναι το κενό και τίποτα παραπάνω. Άρα έχουμε το παρακάτω.
If($gramma -match "[A-Z]") { Αποκρυπτογράφηση } else { $kwdikos += $gramma }
Για την αποκρυπτογράφηση του κάθε χαρακτήρα βρίσκουμε σε ποια θέση είναι το γράμμα μας μέσα στο κρυπτογραφημένο αλφάβητο $r13_alfabito εκτελώντας «$r13_alfabito.IndexOf($gramma)» το οποίο με απλά λόγια γράφει, δώσε μου τη θέση του γράμματος $gramma μέσα στο αλφάβητο $r13_alfabito. Τέλος, απλώς δίνουμε αυτό το αποτέλεσμα στη συνάρτηση «$lat_alfabito.Chars()» (δηλαδή, δώσε μου το χαρακτήρα που βρίσκεται σε αυτή τη θέση από το $lat_alfabito) και προσθέτουμε το αποτέλεσμα αυτού του χαρακτήρα στη μεταβλητή $kwdikos. Αν τα βάλουμε όλα μαζί το αποτέλεσμα είναι το παρακάτω.
$kryptografima = "YRIRY GJB CNFFJBEQ EBGGRA" $lat_alfabito = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" $r13_alfabito = "NOPQRSTUVWXYZABCDEFGHIJKLM" Foreach($gramma in $kryptografima.ToCharArray()) { If($gramma -match "[A-Z]") { $kwdikos += $lat_alfabito.Chars($r13_alfabito.IndexOf($gramma)) } else { $kwdikos += $gramma } }
Έτσι γράμμα-γράμμα η μεταβλητή $kwdikos θα καταλήξει να έχει ολόκληρο το αποκρυπτογραφημένο κείμενο. Αλλά μας λείπει κάτι, πρέπει να τυπώσουμε το περιεχόμενο της μεταβλητής $kwdikos στη κονσόλα μας. Για να το κάνουμε αυτό χρησιμοποιούμε τη κλήση «echo $kwdikos» και βλέπετε εδώ το τελικό αποτέλεσμα στη πράξη.
Αντίστοιχα με τη προηγούμενη άσκηση, μπορούμε να κάνουμε το ίδιο και σε συστήματα Linux ή Apple OS X καθώς έχουν προεγκατεστημένο το μεταγλωττιστή της γλώσσας προγραμματισμού Perl. Με τη γλώσσα προγραμματισμού Perl αυτό γίνεται πολύ πιο απλό και εύκολο καθώς μπορούμε να το κάνουμε με κάτι όπως αυτό που βλέπετε εδώ.
$kryptografima = "YRIRY GJB CNFFJBEQ EBGGRA"; $kryptografima =~ tr/A-Z/N-ZA-M/; print($kryptografima . "n");
Στη γλώσσα προγραμματισμού Perl οι μεταβλητές ξεκινάνε με το χαρακτήρα $ (όπως ακριβώς και στο PowerShell) αλλά κάθε εντολή ολοκληρώνεται όταν δει το χαρακτήρα ; όπως φαίνεται από το παραπάνω. Αρχικά, αποθηκεύουμε το κρυπτογράφημα μας στη μεταβλητή $kryptografima και στη συνέχεια χρησιμοποιούμε τον ειδικό συνδυασμό χαρακτήρων =~ που σημαίνει ότι η δεξιά πλευρά θα επεξεργαστεί τη μεταβλητή της αριστερής πλευράς και εν συνεχεία θα αποθηκεύσει το αποτέλεσμα στην ίδια μεταβλητή. Η επεξεργασία που θα κάνει είναι το «tr/A-Z/N-ZA-M/» που σημαίνει tranlate (μετέτρεψε) τα γράμματα από Α μέχρι Ζ στα αντίστοιχα αρχίζοντας από το Ν-Ζ και προχωρώντας στα Α-Μ, δηλαδή ότι κάναμε στην αρχή με το χέρι. Αντικατάσταση κατά 13 θέσεις. Τέλος, λέμε στο πρόγραμμα να τυπώσει στην οθόνη το αποτέλεσμα με τη συνάρτηση print() και (στη συνάρτηση print() το «και», δηλαδή η πρόσθεση χαρακτήρων, συμβολίζεται από τη τελεία) να πατήσει Enter (που γράφετε ως «n»). Αν πάμε στον εξυπηρετητή krypton.labs.overthewire.org μπορούμε να το δούμε στη πράξη κάπως έτσι.
Σε αυτό το άρθρο είδαμε τι είναι και πως δουλεύει ο αλγόριθμος κρυπτογράφησης ROT-13. Μάθαμε πως να κάνουμε την αποκρυπτογράφηση με έτοιμα εργαλεία, με δικά μας προγράμματα σε όλα τα γνωστά λειτουργικά συστήματα, ακόμα και χωρίς υπολογιστές με χαρτί και μολύβι. Σίγουρα ένα σχετικά εύκολο επίπεδο για όσους έχουν ασχοληθεί με το χώρο της κρυπτανάλυσης αλλά ταυτόχρονα πιο δύσκολο από το προηγούμενο που είναι πολύ θετικό καθώς μας δίνει μία ιδέα για την εξέλιξη των επιπέδων.
Krypton
#Πολεμικά #Παίγνια #OTW #Krypton