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

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

Πηγή: 123RF.com
Πηγή: 123RF.com

Ξεκινάμε όπως κάθε φορά με σύνδεση στον εξυπηρετητή του παιχνιδιού με τα στοιχεία πρόσβασης που αποκτήσαμε από το προηγούμενο επίπεδο. Σε αυτό το επίπεδο, η σελίδα που βλέπουμε είναι και πάλι διαφορετική. Έχουμε ένα πεδίο εισαγωγής κειμένου για αναζήτηση (Search) που γράφει «Find wonds containing» (Βρείτε τις λέξεις που περιέχουν) και στο κάτω μέρος γράφει «Output» (Αποτέλεσμα). Επίσης, κάτω δεξιά έχει ένα σύνδεσμο που γράφει «View sourcecode» (Εμφάνιση πηγαίου κώδικα).

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

Αν πατήσουμε στον σύνδεσμο «View sourcecode» (Εμφάνιση πηγαίου κώδικα) μπορούμε να δούμε τον πηγαίο κώδικα που κάνει τη λειτουργία της αναζήτησης στη πλευρά του εξυπηρετητή. Βλέπετε το αποτέλεσμα από αυτό παρακάτω.

<form>
Find words containing: <input name=needle><input type=submit name=submit value=Search><br><br>
</form>

<?
$key = "";

if(array_key_exists("needle", $_REQUEST)) {
    $key = $_REQUEST["needle"];
}

if($key != "") {
    passthru("grep -i $key dictionary.txt");
}
?>

Ας τα πάρουμε με τη σειρά λοιπόν, στη συνέχεια βλέπουμε πως κατασκευάζει με HTML μία φόρμα (form) με ένα πεδίο εισαγωγής που το ονομάζει «needle» και ένα κουμπί καταχώρησης που έχει τη τιμή «Search».

<form>
Find words containing: <input name=needle><input type=submit name=submit value=Search><br><br>
</form>

Μετά από αυτό έχει τον κώδικα σε γλώσσα προγραμματισμού PHP που εκτελεί την αναζήτηση. Βλέπουμε ότι ορίζει μία μεταβλητή με όνομα key Και στη συνέχεια χρησιμοποιεί τη συνάρτηση array_key_exists() σε μία συνθήκη που μπορεί να μεταφραστεί ως: Εάν στο αίτημα υπάρχει η μεταβλητή «needle», τότε βάλε τη τιμή της μεταβλητής «needle» στη μεταβλητή «key». Αυτό πρακτικά είναι για να ελέγχει ότι δε δοκιμάσαμε να κάνουμε μία αναζήτηση με άδειο το πεδίο κειμένου «needle».

<?
$key = "";

if(array_key_exists("needle", $_REQUEST)) {
    $key = $_REQUEST["needle"];
}

Το ενδιαφέρον κομμάτι είναι στη συνέχεια. Ο ειδικός χαρακτήρας != μεταφράζεται ως «διάφορο» άρα μας λέει: Εάν η μεταβλητή key δεν είναι κενή, τότε εκτέλεσε τη συνάρτηση passthru() με το περιεχόμενο «grep -i $key dictionary.txt». Όπως μπορούμε να διαβάσουμε στο εγχειρίδιο της γλώσσας προγραμματισμού PHP εδώ, η συνάρτηση passthru() εκτελεί εντολές στο λειτουργικό σύστημα. Άρα αυτό που γράφει είναι: Εκτέλεσε την εντολή «grep -i $key dictionary.txt» όπου η μεταβλητή key θα αντικατασταθεί με το περιεχόμενο αναζήτησης μας. Για παράδειγμα, αν γράψουμε «test» και πατήσουμε Search, τότε η εντολή «grep -i test dictionary.txt» θα εκτελεστεί στο λειτουργικό σύστημα.

if($key != "") {
    passthru("grep -i $key dictionary.txt");
}
?>

Όπως μπορούμε να διαβάσουμε στο εγχειρίδιο της εντολής συστήματος grep, από το 1999 μέχρι και σήμερα η εντολή αυτή χρησιμοποιείται για αναζήτηση κειμένου μέσα σε αρχεία. Η παράμετρος «-i» που δίδεται είναι από τη λέξη «ignore case» (Αγνόησε κεφαλαία-μικρά) άρα με απλά λόγια, η εντολή «grep -i test dictionary.txt» λέει στο λειτουργικό σύστημα: Αναζήτησε μέσα στο αρχείο dictionary.txt οτιδήποτε έχει τη λέξη test είτε με κεφαλαία είτε με μικρά γράμματα. Και όντως κάνει ακριβώς αυτό εάν το δοκιμάσουμε.

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

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

Πηγή: Προσωπικό αρχείο
Πηγή: Προσωπικό αρχείο

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

Πηγή: Προσωπικό αρχείο
Πηγή: Προσωπικό αρχείο

Ας δούμε ακόμα μία φορά την εντολή και τη μεταβλητή που βρίσκεται υπό τον ελέγχο μας για να δούμε τι εντολές μπορούμε να εισάγουμε για να εκμεταλλευτούμε το κενό ασφαλείας. Αρχικά, θέλουμε να διαβάσουμε τα περιεχόμενα του αρχείου /etc/natas_webpass/natas10 που έχει τον κωδικό πρόσβασης για το επόμενο επίπεδο. Για να δούμε τα περιεχόμενα ενός αρχείου χρησιμοποιούμε την εντολή συστήματος cat όπως είχαμε δει και στο άρθρο μας «Πολεμικά Παίγνια: OTW Krypton #2». Άρα σχηματικά μπορούμε να σκεφτούμε την επίθεση κάπως έτσι.

Πηγή: Προσωπικό αρχείο
Πηγή: Προσωπικό αρχείο

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

Πηγή: Προσωπικό αρχείο
Πηγή: Προσωπικό αρχείο

Το παραπάνω θα κάνει την αναζήτηση στο αρχείο dictionary.txt αλλά μετά θα εκτελέσει μία δεύτερη εντολή που θα μας δώσει τα περιεχόμενα του αρχείου /etc/natas_webpass/natas10 και για αποφυγή σφαλμάτων, προσθέσαμε το χαρακτήρα σχολιασμού ώστε να αγνοήσει οτιδήποτε υπάρχει μετά από την εντολή εκμετάλλευσης που χρησιμοποιήσαμε. Ας το δοκιμάσουμε λοιπόν.

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

Πράγματι μπορέσαμε να εκμεταλλευτούμε αυτό το κενό ασφαλείας για εκτέλεση μη εξουσιοδοτημένου κώδικα στον εξυπηρετητή και όπως βλέπετε παραπάνω, μετά το αποτέλεσμα της αναζήτησης του «test» εκτελέστηκε η εντολή μας και στο κάτω μέρος φαίνεται ο κωδικός πρόσβασης για το επόμενο επίπεδο. Τέτοιου είδους κενά ασφαλείας ονομάζονται Command Injection (Ένεση Εντολών) και είναι πολύ σοβαρά διότι προσφέρουν στο κακόβουλο χρήστη δυνατότητα εκτέλεσης οποιασδήποτε εντολής συστήματος απομακρυσμένα. Σε πραγματικές συνθήκες, οι εντολές που θα εκτελούσε κάποιος θα ήταν το κατέβασμα και εγκατάταση κάποιας εφαρμογής που θα του έδινε πλήρη πρόσβαση στο σύστημα απομακρυσμένα. Ένα πρόσφατο πραγματικό τέτοιο παράδειγμα είναι από τη διαρροή των προγραμμάτων εκμετάλλευσης της NSA (National Security Agency, Εθνική Υπηρεσία Ασφαλείας) τον Αύγουστο του 2016. Χάρη σε ένα τέτοιο κενό ασφαλείας, τουλάχιστον από το 2013 μέχρι και τον Αύγουστο του 2016, η NSA μέσω της ομάδας Equation Group έπερνε πρόσβαση σε δικτυακές συσκεύες ασφαλείας (Firewall) της εταιρίας δικτυακού εξοπλισμού WatchGuard. Αυτό αναγνωρίστηκε επίσημα με τον μοναδικό αριθμό αναγνώρισης κενών ασφαλείας CVE-2016-7089. Όπως αντιλαμβάνεστε, είναι εξαιρετικά σημαντικό ο κάθε προγραμματιστής να φιλτράρει τα περιεχόμενα από οτιδήποτε λαμβάνει από τους χρήστες καθώς όπως είδαμε εάν δε το κάνει ίσως ο χρήστης να είναι σε θέση να εκμεταλλευτεί τέτοια κενά ασφαλείας για μη εξουσιοδοτημένη πρόσβαση στο σύστημα.

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

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

Λογότυπο WordPress.com

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

Φωτογραφία Twitter

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

Φωτογραφία Facebook

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

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

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

Σύνδεση με %s