Φτάσαμε στο 13ο επίπεδο του πολεμικού παιγνίου Natas της ιστοσελίδας OverTheWire. Τα επίπεδα βασίζονται έντονα στις γνώσεις που έχουμε αποκτήσει από τα προηγούμενα, άρα είναι καλύτερο να τα λύνετε σειριακά. Προσοχή! Όπως αναφέρουμε σε κάθε άρθρο αυτής της κατηγορίας, το πιο σημαντικό είναι να προσπαθήσετε μόνοι σας να λύσετε το κάθε επίπεδο και όχι απλώς να διαβάσετε μία λύση όπως η δική μας. Παρακάτω είναι οι σύνδεσμοι για τις λύσεις μας για όλα τα επίπεδα μέχρι αυτό το σημείο, και ακριβώς από κάτω θα παρουσιάσουμε αυτό, το 13ο επίπεδο.
Όπως κάθε φορά, συνδεόμαστε στο επόμενο επίπεδο με τα στοιχεία πρόσβασης που αποκτήσαμε από το προηγούμενο. Περιέργως, η σελίδα φαντάζει απόλυτα ίδια με αυτή του επιπέδου 12. Είναι μία φόρμα για ανέβασμα εικόνων και φωτογραφιών στον εξυπηρετητή. Βλέπετε τη σελίδα του επιπέδου 13 στην επόμενη εικόνα.
Που είναι όμως η διαφορά; Εάν πατήσουμε το σύνδεσμο «View sourcecode» (προβολή πηγαίου κώδικα), θα δούμε τον κώδικα της σελίδας που εκτελεί ο εξυπηρετητής. Ο κώδικας είναι γραμμένος σε γλώσσα προγραμματισμού PHP και είναι σχεδόν ολόιδιος με αυτόν από το προηγούμενο επίπεδο. Η μοναδική διαφορά του είναι η προσθήκη του ελέγχου που βλέπετε μέσα στο κόκκινο πλαίσιο παρακάτω.
Με απλά λόγια αυτό που γράφει το παραπάνω επιπρόσθετος έλεγχος, είναι ότι αν το αρχείο που ανεβάζουμε περάσει από τη συνάρτηση exif_imagetype() και επιστρέψει τιμή «FALSE», τότε δε θα μας αφήσει να ανεβάσουμε το αρχείο μας αλλά θα τυπώσει το μήνυμα «File is not an image» (Το αρχείο δεν είναι εικόνα). Από τη πλευρά του επιτιθέμενου, πρέπει να βρούμε ένα τρόπο να παρακάμψουμε τον έλεγχο της συνάρτησης exif_imagetype(). Αλλά πως θα το κάνουμε αυτό;
Αρχικά διαβάζουμε το εγχειρίδιο της συνάρτησης exif_imagetype() για να καταλάβουμε τι ακριβώς ελέγχους κάνει στο αρχείο μας. Η περιγραφή της λέει «Η συνάρτηση exif_imagetype() διαβάζει τα πρώτα bytes μίας εικόνας και ελέγχει το τύπο της». Μία σύντομη αναζήτηση σε αυτό μας οδηγεί σε κάτι που ονομάζεται «Μαγικός Αριθμός» στο προγραμματισμό. Όπως διαβάζουμε «είναι ένας σταθερός αριθμός ή κείμενο που χρησιμοποιείται για να αναγνωρίζει τη μορφή ενός αρχείου ή πρωτοκόλλου» και μας προσφέρει και μία λίστα από τις «υπογραφές» πολλών γνωστών τύπων αρχείων που μπορείτε να το βρείτε σε αυτό το σύνδεσμο.
Οπότε τώρα γνωρίζουμε ότι για να παρακάμψουμε τη συνάρτηση exif_imagetype() πρέπει να προσθέσουμε το «μαγικό αριθμό/υπογραφή» από κάποια μορφή εικόνας. Αλλά πως θα γίνει αυτό χωρίς να επηρεαστεί ο κώδικας του κακόβουλου προγράμματος μας; Εδώ μας βοηθάει πολύ η γλώσσα προγραμματισμού PHP καθώς οτιδήποτε βρίσκεται εκτός του ανοίγματος και κλεισίματος της, αγνοείται από το μεταγλωττιστή της. Με απλά λόγια θα κάνουμε κάτι τέτοιο.
ΟΤΙΔΗΠΟΤΕ ΘΕΛΟΥΜΕ <? Κώδικας σε PHP ?>
Βλέποντας τους «μαγικούς αριθμούς/υπογραφές» των αρχείων από τη λίστα που αναφέραμε παραπάνω, το πιο απλό φαίνεται πως είναι το BMP (εικόνα bitmap) που έχει υπογραφή/μαγικό αριθμό «BM». Άρα το κακόβουλο πρόγραμμα μας θα έχει μία πολύ μικρή αλλαγή, θα είναι αυτό που βλέπετε στη συνέχεια.
BM <? passthru($_GET['entolh']); ?>
Εάν τα έχουμε υπολογίσει όλα σωστά, τότε θα πρέπει να μπορούμε να επαναλάβουμε τα ίδια ακριβώς βήματα με το προηγούμενο επίπεδο αλλά χρησιμοποιώντας αυτό το νέο κακόβουλο πρόγραμμα ώστε να παρακάμψουμε το νέο μέτρο ασφαλείας. Δηλαδή, το σχέδιο δράσης μας θα είναι ακριβώς το ίδιο με πριν με μοναδική διαφορά τη μικρή αλλαγή στο κακόβουλο πρόγραμμα μας ώστε να ξεγελάσει συνάρτηση exif_imagetype() με την υπογραφή «BM». Έτσι, η συνάρτηση exif_imagetype() θα αναγνωρίσει ότι πράγματι το αρχείο μας είναι εικόνα και όλα τα λειτουργήσουν όπως ακριβώς βλέπετε στο παρακάτω σχέδιο.
Οπότε, ας το δοκιμάσουμε. Φτιάξαμε ένα αρχείο με όνομα «shell.php» και περιεχόμενο αυτό που δείξαμε παραπάνω και ξεκινήσαμε το πρόγραμμα υποκλοπών Burp Suite. Στη συνέχεια αλλάξαμε τις ρυθμίσεις στο περιηγητή ιστού μας ώστε να στέλνει τα πάντα μέσω του Burp Suite και επιλέξαμε να ανεβάσουμε το αρχείο μας ως εικόνα.
Ακολουθώντας τα ίδια βήματα που είχαμε κάνει και στο δωδέκατο επίπεδο, αλλάζουμε το όνομα του αρχείου προτού αποσταλεί στον εξυπηρετητή ώστε να έχει επέκταση αρχείου «.php». Εμείς το μετονομάσαμε σε «shell.php» όπως βλέπετε από το παρακάτω στιγμιότυπο από το πρόγραμμα Burp Suit όπου έχουμε υπογραμμίσει το όνομα που δώσαμε στο αρχείο.
Στη συνέχεια πατάμε το κουμπί «Forward» (Προώθηση) που θα προωθήσει το τροποποιημένο μήνυμα μας στον εξυπηρετητή. Ακριβώς όπως και στη προηγούμενη φορά, το αρχείο μας ανέβηκε παρακάμπτοντας τα μέτρα ασφαλείας καθώς βλέπουμε ότι μετονομάστηκε με ένα τυχαίο όνομα αλλά έχει ακόμα επέκταση «.php» που σημαίνει ότι θα εκτελεστεί ως πρόγραμμα από τον εξυπηρετητή.
Πατώντας επάνω σε αυτό το σύνδεσμο θα έχουμε το ίδιο σφάλμα με πριν καθώς δεν έχουμε δώσει κάτι στη παράμετρο $entolh που έχουμε ορίσει στο πρόγραμμα μας.
Με την εντολή συστήματος «cat» θα ζητήσουμε να δούμε τα περιεχόμενα του αρχείου /etc/natas_webpass/natas14 το οποίο γνωρίζουμε από τα προηγούμενα επίπεδα ότι περιέχει το κωδικό πρόσβασης για το επόμενο επίπεδο. Βλέπετε στη συνέχεια το τι ακριβώς θα γράψουμε ως εντολή προς εκτέλεση.
Και φυσικά, αυτό μας επιστρέφει τον κωδικό πρόσβασης για το επόμενο επίπεδο που θα αναλύσουμε σε άλλο άρθρο. Βλέπετε τον κωδικό αυτό εδώ.
Όπως είχαμε περιγράψει και στο άρθρο μας «Πολεμικά Παίγνια: OTW Natas #12», το επίσημο όνομα από αυτό το κενό ασφαλείας είναι «Unrestricted File Upload» (Ανέβασμα Αρχείου Χωρίς Περιορισμό) και μέχρι και σήμερα είναι από τα πιο διαδεδομένα κενά ασφαλείας που προσφέρουν πρόσβαση σε μη εξουσιοδοτημένους χρήστες. Όπως είδαμε το να προσθέτει κανείς τυφλά επιπρόσθετους ελέγχους δε συνεπάγεται με αύξηση της ασφάλειας του συστήματος. Απαιτείται σκέψη και επιλογή των κατάλληλων μέτρων ασφαλείας, ακριβώς όπως και στο πραγματικό κόσμο.
Natas
#Πολεμικά #Παίγνια #OTW #Natas