Πολεμικά Παίγνια: OTW Natas #8

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

Πηγή: LoudHere.com
Πηγή: LoudHere.com

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

Πηγή: OverTheWire.org
Πηγή: OverTheWire.org

Βλέπουμε ότι εμφανισιακά είναι παρόμοια και μας προσφέρει πάλι το σύνδεσμο «View sourcecode» (Προβολή πηγαίου κώδικα) χάρη στον οποίο μπορούμε να δούμε τον κώδικα που εκτελεί η σελίδα αυτή στον εξυπηρετητή με κάθε αίτημα μας. Πρακτικά, ο έλεγχος για πρόσβαση είναι ολόιδιος με το έβδομο επίπεδο με μόνο μία διαφορά. Η διαφορά είναι ότι αντί να συγκρίνει αυτό που εισάγουμε στο πεδίο του μυστικού κωδικού με μία προκαθορισμένη μεταβλητή, το συγκρίνει με το αποτέλεσμα του κωδικού που εισάγαμε όταν έχει επεξεργαστεί από τη συνάρτηση encodeSecret(). Βλέπετε το σχετικό απόσπασμα παρακάτω.

$encodedSecret = "3d3d516343746d4d6d6c315669563362";

function encodeSecret($secret) {
    return bin2hex(strrev(base64_encode($secret)));
}

if(array_key_exists("submit", $_POST)) {
    if(encodeSecret($_POST['secret']) == $encodedSecret) {
    print "Access granted. The password for natas9 is <censored>";
    } else {
    print "Wrong secret";
    }
}

Στην αρχή από το παραπάνω κώδικα βλέπουμε ότι ο κωδικοποιημένος μυστικός κωδικός ορίζεται στη μεταβλητή $encodedSecret και ακριβώς από κάτω υπάρχει η συνάρτηση encodeSecret(). Στο προγραμματισμό, οι συναρτήσεις (functions) έχουν την ίδια σειρά προτεραιότητας όπως και στα μαθηματικά, δηλαδή από μέσα προς τα έξω. Άρα, αν μεταφράσουμε με απλά λόγια αυτό που διαβάζουμε στη συνάρτηση encodeSecret() που τη βλέπετε ξανά παρακάτω, τότε γράφει: Επεξεργάσου το περιεχόμενο της μεταβλητής $secret (που είναι ο μυστικός κωδικός που γράφουμε εμείς στη σελίδα) με τη συνάρτηση base64_encode(), έπειτα επεξεργάσου αυτό το αποτέλεσμα με τη συνάρτηση strrev(), έπειτα επεξεργάσου το αποτέλεσμα της συνάρτησης αυτής με τη συνάρτηση bin2hex() και επέστρεψε (return) το αποτέλεσμα.

function encodeSecret($secret) {
    return bin2hex(strrev(base64_encode($secret)));
}

Άρα, εάν αντιστρέψουμε τη διαδικασία τότε μπορούμε να αποκωδικοποιήσουμε τον μυστικό κωδικό που αναζητούμε. Αρχικά έχουμε τη συνάρτηση bin2hex() η οποία όμως διαβάζουμε στο επίσημο εγχειρίδιο χρήσης της γλώσσας προγραμματισμού PHP δέχεται ένα κείμενο και το μετατρέπει σε δεκαεξαδική μορφή. Η αντίστροφη συνάρτηση της είναι η hex2bin() η οποία κάνει το ακριβώς αντίστροφο. Άρα, μπορούμε να δοκιμάσουμε έναν κώδικα όπως ο παρακάτω. Δηλαδή, να προβάλει (echo) το αποτέλεσμα της συνάρτησης hex2bin() για το κωδικοποιημένο μυστικό κωδικό.

<?php
    echo hex2bin("3d3d516343746d4d6d6c315669563362");
?>

Εάν δεν έχετε εγκατεστημένο το μεταγλωττιστή της γλώσσας προγραμματισμού PHP στον υπολογιστή σας μπορείτε να χρησιμοποιήσετε κάποιο πρόγραμμα μεταγλώττισης ιστού όπως είναι το Online PHP Functions και να κάνετε εκεί την εκτέλεση του κώδικα σας. Βλέπετε το αποτέλεσμα από τη παραπάνω εκτέλεση μέσω της ιστοσελίδας Online PHP Functions στην επόμενη εικόνα.

Πηγή: Sandbox.OnlinePHPFunctions.com
Πηγή: Sandbox.OnlinePHPFunctions.com

Τώρα προχωράμε στην επόμενη συνάρτηση, τη συνάρτηση strrev() που πήρε το όνομα της από τις λέξεις string reverse (αναστροφή κειμένου) και κάνει ακριβώς αυτό που περιγράφει. Δηλαδή, αντιστρέφει τη σειρά (εμπρός-πίσω) από τα γράμματα του κειμένου που της δίδεται. Έτσι, μπορούμε να χρησιμοποιήσουμε ακριβώς την ίδια συνάρτηση για να ανακτήσουμε το αυθεντικό κείμενο. Θα χρησιμοποιήσουμε τον παρακάτω κώδικα PHP για να το επιτύχουμε αυτό.

<?php
    echo strrev("==QcCtmMml1ViV3b}");
?>

Το αποτέλεσμα από αυτή την αναστροφή είναι αυτό που βλέπετε και στη συνέχεια. Η εικόνα είναι από εκτέλεση του παραπάνω προγράμματος στην ιστοσελίδα Online PHP Functions όπως ακριβώς κάναμε και προηγουμένως.

Πηγή: Sandbox.OnlinePHPFunctions.com
Πηγή: Sandbox.OnlinePHPFunctions.com

Τέλος, βλέπουμε ότι χρησιμοποιεί τη συνάρτηση base64_encode(). Στο παρελθόν είχαμε δημοσιεύσει το άρθρο μας «Πολεμικά Παίγνια: OTW Krypton #0» το οποίο εξηγούσε σε μεγάλο βάθος τη κωδικοποίηση Base64, το πως λειτουργεί και πως γίνεται η αποκωδικοποίηση της. Αν θέλετε να μάθετε περισσότερα για αυτό διαβάστε εκείνο το άρθρο μας. Ευτυχώς, η γλώσσα προγραμματισμού PHP προσφέρει τη συνάρτηση base64_decode() που κάνει την αποκωδικοποίηση τελείως αυτοματοποιημένα. Δηλαδή με βάση την κωδικοποίηση Base64, αποκωδικοποιεί το κείμενο που της δίδεται ως παράμετρος. Άρα με την ίδια λογική συνεχίζουμε λαμβάνοντας το αποτέλεσμα της παραπάνω συνάρτησης και περνώντας το μέσα από τη base64_decode() όπως βλέπετε εδώ.

<?php
    echo base64_decode("}b3ViV1lmMmtCcQ==}");
?>

Και για ακόμα μία φορά κάνουμε χρήση της ιστοσελίδας Online PHP Functions για την εκτέλεση του παραπάνω κώδικα PHP και βλέπετε το αποτέλεσμα της εκτέλεσης του παρακάτω.

Πηγή: Sandbox.OnlinePHPFunctions.com
Πηγή: Sandbox.OnlinePHPFunctions.com

Οπότε, εφόσον εκτελέσαμε ολόκληρη την αντίστροφη διαδικασία της συνάρτησης encodeSecret() σωστά, τότε θα πρέπει να είμαστε σε θέση να δώσουμε το παραπάνω κωδικό ως μυστικό κωδικό και όταν η συνάρτηση encodeSecret() θα τον επεξεργαστεί θα ταιριάζει με τον κωδικοποιημένο κωδικό δίνοντας μας πρόσβαση στο σύστημα. Ας το δοκιμάσουμε στη πράξη.

Πηγή: OverTheWire.org
Πηγή: OverTheWire.org

Και όπως βλέπετε όντως καταφέραμε να ανακτήσουμε τον κωδικό πρόσβασης για το ένατο επίπεδο του παιχνιδιού. Ας δούμε περιληπτικά μία πραγματική περίπτωση από ένα παρόμοιο κενό ασφαλείας ώστε να κατανοήσουν όλοι οι αναγνώστες μας τη σοβαρότητα του. Θα δούμε ένα κενό ασφαλείας από το λογισμικό ασφαλείας δικτύου Trend Micro InterScan VirusWall. Το Δεκέμβριο του 2001 ανακαλύφθηκε ότι όλα τα στοιχεία σύνδεσης (όνομα χρήστη και κωδικός πρόσβασης) στέλνονταν μη κρυπτογραφημένα, απλώς με κωδικοποίηση Base64. Χάρη σε αυτό το κενό ασφαλείας στη σελίδα setpasswd.cgi του προϊόντος, οποιοδήποτε είχε πρόσβαση στο δίκτυο μπορούσε να υποκλέπτει πακέτα δεδομένων που προορίζονταν για αυτή τη σελίδα και με μία απλή αποκωδικοποίηση Base64 να κλέβει τα στοιχεία πρόσβασης τα οποία μπορούσε εν συνεχεία να χρησιμοποιήσει για πλήρη έλεγχο της συσκευής. Αυτό αναγνωρίστηκε με τον αριθμό καταχώρησης κενών ασφαλείας CVE-2001-0133 και δίνει μία καλή ιδέα της πρακτικής εφαρμογής όσων μάθαμε εδώ για την ευκολία ανάκτησης κωδικών που δεν είναι κατάλληλα ασφαλισμένοι αλλά έχουν μόνο κάποια απλή μορφή κωδικοποίησης.

Γράψτε τα σχόλια σας εδώ...

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s