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

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

Πηγή: Blog.VirtualForge.com
Πηγή: Blog.VirtualForge.com

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

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

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

<?
$key = "";

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

if($key != "") {
    if(preg_match('/[;|&]/',$key)) {
        print "Input contains an illegal character!";
    } else {
        passthru("grep -i $key dictionary.txt");
    }
}
?>

Γρήγορα μπορούμε να δούμε ότι υπάρχει μία μόνο ουσιαστική διαφορά από το προηγούμενο επίπεδο. Η διαφορά αυτή είναι η πρόσθεση ενός ελέγχου για τους χαρακτήρες που χρησιμοποίησαμε στο προηγούμενο επίπεδο για να εκμεταλλευτούμε το κενό ασφαλείας Command Injection που υπήρχε. Πρακτικά έκαναν χρήση της συνάρτησης preg_match() όπου γράφει πως αν μέσα στη μεταβλητή key υπάρχουν οι χαρακτήρες του ελληνικού ερωτηματικού ή του «&» τότε θα τυπώνει μόνο το μήνυμα «Input contains an illegal character!» (Τα δεδομένα που δώσατε έχουν μη εγκεκριμένο χαρακτήρα!). Βλέπετε το ακριβές απόσπασμα από τον κώδικα καλύτερα εδώ.

    if(preg_match('/[;|&]/',$key)) {
        print "Input contains an illegal character!";

Με λίγα λόγια, πρέπει να ξεκινήσουμε πάλι από την αρχή για να εκμεταλλευτούμε το περιεχόμενο της μεταβλητής key χωρίς όμως να χρησιμοποιήσουμε τους δύο σημαντικούς αυτούς χαρακτήρες ελέγχου ροής προγράμματος. Και πάλι όμως, μπορούμε να χρησιμοποιήσουμε οτιδήποτε άλλο θέλουμε άρα ίσως πρέπει να εκμεταλλευτούμε την ίδια την εντολή συστήματος grep. Η εντολή grep αναζητεί, όπως είχαμε αναφέρει και στο προηγούμενο επίπεδο, οτιδήποτε ταιριάζει με το κείμενο αναζήτησης εντός του αρχείου που δέχεται ως δεύτερη παράμετρο. Βλέπετε το σχετικό απόσπασμα από τον κώδικα PHP της σελίδας στη συνέχεια.

    } else {
        passthru("grep -i $key dictionary.txt");
    }

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

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

Με αυτό το τρόπο οτιδήποτε μετά τη δίεση θα αγνοηθεί ως σχόλιο και έτσι μπορούμε να αναζητήσουμε ότι θέλουμε στο αρχείο που θέλουμε, δηλαδή το αρχείο /etc/natas_webpass/natas11 που περιέχει τον κωδικό πρόσβασης για το επόμενο επίπεδο. Αλλά δε γνωρίζουμε το τι πρέπει να αναζητήσουμε. Ευτυχώς για εμάς η εντολή grep έχει μία μεγάλη γκάμα από ειδικούς χαρακτήρες αναζήτησης και ένας από αυτός είναι η τελεία που μεταφράζεται ως «οτιδήποτε». Άρα εάν δώσουμε τη παραπάνω εντολή τότε πρακτικά λέμε «αναζήτησε οτιδήποτε υπάρχει μέσα στο αρχείο /etc/natas_webpass/natas11» που είναι αυτό ακριβώς που θέλουμε.

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

Και πράγματι λειτούργησε. Ένα πραγματικό τέτοιο παράδειγμα είναι το κενό ασφαλείας με μοναδικό αναγνωριστικό αριθμό CVE-2005-0758 το οποίο δημοσιεύτηκε τον Αύγουστο του 2007. Είναι ένα κενό ασφαλείας στην εντολή zgrep η οποία είναι παρόμοια με την εντολή grep με τη διαφορά ότι κάνει αναζητήσεις σε συμπιεσμένα αρχεία. Παρότι αυτή η εντολή υπάρχει εδώ και πολλά χρόνια και ελέγχει πολλούς συνδυασμούς ειδικών χαρακτήρων που μπορούν να χρησιμοποιηθούν για εκμετάλλευση της, ένας ερευνητής βρήκε ένα νέο τρόπο για να αναγκάζει την εντολή να εκτελεί οποιοδήποτε πρόγραμμα με τρόπο με τον οποίο δεν είχε ποτέ σχεδιαστεί. Αυτό το είδος κενού ασφαλείας συχνά αναφέρεται ως Insufficient Sanitization (Ανεπαρκές Φιλτράρισμα) και όπως πρέπει να είναι κατανοητό είναι πολύ συνηθισμένο γιατί όσο καλό φιλτράρισμα στα εισερχόμενα δεδομένα και αν κάνει ένα πρόγραμμα ίσως να υπάρχει κάποιος τρόπος παράκαμψης του. Φυσικά, δεν έχουν όλα τα κενά ασφαλείας τύπου Insufficient Sanitization τις ίδιες επιπτώσεις αλλά συνήθως οδηγούν σε πλήρη έλεγχο του κώδικα που θα εκτελεστεί από τον επιτιθέμενο.

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

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

Λογότυπο WordPress.com

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

Φωτογραφία Twitter

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

Φωτογραφία Facebook

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

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

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

Σύνδεση με %s