ASLR
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Η Τυχαία Διάταξη Χώρου Διευθύνσεων (ASLR) είναι μια τεχνική ασφαλείας που χρησιμοποιείται σε λειτουργικά συστήματα για να τυχαίνει τις διευθύνσεις μνήμης που χρησιμοποιούνται από διαδικασίες συστήματος και εφαρμογών. Με αυτόν τον τρόπο, καθιστά σημαντικά πιο δύσκολο για έναν επιτιθέμενο να προβλέψει την τοποθεσία συγκεκριμένων διαδικασιών και δεδομένων, όπως η στοίβα, η σωρός και οι βιβλιοθήκες, μειώνοντας έτσι ορισμένους τύπους εκμεταλλεύσεων, ιδιαίτερα τις υπερχειλίσεις μνήμης.
Για να ελέγξετε την κατάσταση ASLR σε ένα σύστημα Linux, μπορείτε να διαβάσετε την τιμή από το /proc/sys/kernel/randomize_va_space
αρχείο. Η τιμή που αποθηκεύεται σε αυτό το αρχείο καθορίζει τον τύπο ASLR που εφαρμόζεται:
0: Καμία τυχαία διάταξη. Όλα είναι στατικά.
1: Συντηρητική τυχαία διάταξη. Οι κοινές βιβλιοθήκες, η στοίβα, το mmap(), η σελίδα VDSO είναι τυχαίες.
2: Πλήρης τυχαία διάταξη. Εκτός από τα στοιχεία που τυχαίνουν από τη συντηρητική τυχαία διάταξη, η μνήμη που διαχειρίζεται μέσω του brk()
είναι τυχαία.
Μπορείτε να ελέγξετε την κατάσταση ASLR με την παρακάτω εντολή:
Για να απενεργοποιήσετε το ASLR, ορίστε την τιμή του /proc/sys/kernel/randomize_va_space
σε 0. Η απενεργοποίηση του ASLR γενικά δεν συνιστάται εκτός από σενάρια δοκιμών ή αποσφαλμάτωσης. Ακολουθούν οι οδηγίες για να το απενεργοποιήσετε:
Μπορείτε επίσης να απενεργοποιήσετε το ASLR για μια εκτέλεση με:
Για να ενεργοποιήσετε το ASLR, μπορείτε να γράψετε μια τιμή 2 στο αρχείο /proc/sys/kernel/randomize_va_space
. Αυτό συνήθως απαιτεί δικαιώματα root. Η πλήρης τυχαία κατανομή μπορεί να γίνει με την ακόλουθη εντολή:
Οι αλλαγές που γίνονται με τις εντολές echo
είναι προσωρινές και θα επαναρυθμιστούν κατά την επανεκκίνηση. Για να κάνετε την αλλαγή μόνιμη, πρέπει να επεξεργαστείτε το αρχείο /etc/sysctl.conf
και να προσθέσετε ή να τροποποιήσετε την παρακάτω γραμμή:
Μετά την επεξεργασία του /etc/sysctl.conf
, εφαρμόστε τις αλλαγές με:
This will ensure that your ASLR settings remain across reboots.
PaX divides the process address space into 3 groups:
Κώδικας και δεδομένα (αρχικοποιημένα και μη αρχικοποιημένα): .text
, .data
, και .bss
—> 16 bits of entropy in the delta_exec
variable. This variable is randomly initialized with each process and added to the initial addresses.
Μνήμη allocated by mmap()
and shared libraries —> 16 bits, named delta_mmap
.
Η στοίβα —> 24 bits, referred to as delta_stack
. However, it effectively uses 11 bits (from the 10th to the 20th byte inclusive), aligned to 16 bytes —> This results in 524,288 possible real stack addresses.
The previous data is for 32-bit systems and the reduced final entropy makes possible to bypass ASLR by retrying the execution once and again until the exploit completes successfully.
If you have a big enough overflow to host a big NOP sled before the shellcode, you could just brute-force addresses in the stack until the flow jumps over some part of the NOP sled.
Another option for this in case the overflow is not that big and the exploit can be run locally is possible to add the NOP sled and shellcode in an environment variable.
If the exploit is local, you can try to brute-force the base address of libc (useful for 32bit systems):
Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να brute-force τη διεύθυνση της συνάρτησης libc
usleep
, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει, βρήκατε τη διεύθυνση αυτής της συνάρτησης.
Σε συστήματα 64bit η εντροπία είναι πολύ υψηλότερη και αυτό δεν θα έπρεπε να είναι δυνατό.
Είναι δυνατόν να καταλάβετε ένα μεγάλο μέρος του stack με μεταβλητές περιβάλλοντος και στη συνέχεια να προσπαθήσετε να εκμεταλλευτείτε το δυαδικό εκατοντάδες/χίλιες φορές τοπικά. Ο παρακάτω κώδικας δείχνει πώς είναι δυνατόν να επιλέξετε απλώς μια διεύθυνση στο stack και κάθε μερικές εκατοντάδες εκτελέσεις αυτή η διεύθυνση θα περιέχει την εντολή NOP:
/proc/[pid]/stat
)Το αρχείο /proc/[pid]/stat
μιας διαδικασίας είναι πάντα αναγνώσιμο από όλους και περιέχει ενδιαφέρουσες πληροφορίες όπως:
startcode & endcode: Διευθύνσεις πάνω και κάτω με το TEXT του δυαδικού
startstack: Η διεύθυνση της αρχής της στοίβας
start_data & end_data: Διευθύνσεις πάνω και κάτω όπου είναι το BSS
kstkesp & kstkeip: Τρέχουσες διευθύνσεις ESP και EIP
arg_start & arg_end: Διευθύνσεις πάνω και κάτω όπου είναι τα cli arguments.
env_start &env_end: Διευθύνσεις πάνω και κάτω όπου είναι οι env variables.
Επομένως, αν ο επιτιθέμενος βρίσκεται στον ίδιο υπολογιστή με το δυαδικό που εκμεταλλεύεται και αυτό το δυαδικό δεν περιμένει την υπερχείλιση από ακατέργαστους παραμέτρους, αλλά από μια διαφορετική είσοδο που μπορεί να κατασκευαστεί μετά την ανάγνωση αυτού του αρχείου. Είναι δυνατόν για έναν επιτιθέμενο να πάρε κάποια διευθύνσεις από αυτό το αρχείο και να κατασκευάσει offsets από αυτές για την εκμετάλλευση.
Για περισσότερες πληροφορίες σχετικά με αυτό το αρχείο, ελέγξτε https://man7.org/linux/man-pages/man5/proc.5.html αναζητώντας το /proc/pid/stat
Η πρόκληση είναι να δώσετε μια διαρροή
Αν σας δοθεί μια διαρροή (εύκολες προκλήσεις CTF), μπορείτε να υπολογίσετε offsets από αυτήν (υποθέτοντας για παράδειγμα ότι γνωρίζετε την ακριβή έκδοση της libc που χρησιμοποιείται στο σύστημα που εκμεταλλεύεστε). Αυτό το παράδειγμα εκμετάλλευσης είναι αποσπασμένο από το παράδειγμα από εδώ (ελέγξτε αυτή τη σελίδα για περισσότερες λεπτομέρειες):
ret2plt
Καταχρώντας μια υπερχείλιση buffer, θα ήταν δυνατό να εκμεταλλευτεί κανείς ένα ret2plt για να εξάγει μια διεύθυνση μιας συνάρτησης από τη libc. Έλεγχος:
Ret2pltFormat Strings Arbitrary Read
Ακριβώς όπως στο ret2plt, αν έχετε μια αυθαίρετη ανάγνωση μέσω μιας ευπάθειας format strings, είναι δυνατό να εξάγετε τη διεύθυνση μιας libc function από το GOT. Το παρακάτω παράδειγμα είναι από εδώ:
You can find more info about Format Strings arbitrary read in:
Format StringsΔοκιμάστε να παρακάμψετε το ASLR εκμεταλλευόμενοι διευθύνσεις μέσα στη στοίβα:
Ret2ret & Reo2popΟ μηχανισμός vsyscall
εξυπηρετεί στην ενίσχυση της απόδοσης επιτρέποντας σε ορισμένες κλήσεις συστήματος να εκτελούνται σε χώρο χρήστη, αν και είναι θεμελιωδώς μέρος του πυρήνα. Το κρίσιμο πλεονέκτημα των vsyscalls έγκειται στις σταθερές διευθύνσεις τους, οι οποίες δεν υπόκεινται σε ASLR (Τυχαία Διάταξη Χώρου Διευθύνσεων). Αυτή η σταθερή φύση σημαίνει ότι οι επιτιθέμενοι δεν απαιτούν μια ευπάθεια διαρροής πληροφοριών για να προσδιορίσουν τις διευθύνσεις τους και να τις χρησιμοποιήσουν σε μια εκμετάλλευση.
Ωστόσο, δεν θα βρείτε εδώ πολύ ενδιαφέροντα gadgets (αν και για παράδειγμα είναι δυνατό να αποκτήσετε ένα ισοδύναμο ret;
)
(Το παρακάτω παράδειγμα και ο κώδικας είναι από αυτή τη γραφή)
Για παράδειγμα, ένας επιτιθέμενος μπορεί να χρησιμοποιήσει τη διεύθυνση 0xffffffffff600800
μέσα σε μια εκμετάλλευση. Ενώ η προσπάθεια άμεσης μετάβασης σε μια εντολή ret
μπορεί να οδηγήσει σε αστάθεια ή κρα crashes μετά την εκτέλεση μερικών gadgets, η μετάβαση στην αρχή μιας syscall
που παρέχεται από την ενότητα vsyscall μπορεί να αποδειχθεί επιτυχής. Τοποθετώντας προσεκτικά ένα gadget ROP που οδηγεί την εκτέλεση σε αυτή τη διεύθυνση vsyscall, ένας επιτιθέμενος μπορεί να επιτύχει εκτέλεση κώδικα χωρίς να χρειάζεται να παρακάμψει το ASLR για αυτό το μέρος της εκμετάλλευσης.
Σημειώστε λοιπόν πώς μπορεί να είναι δυνατό να παρακαμφθεί το ASLR εκμεταλλευόμενοι το vdso αν ο πυρήνας έχει μεταγλωττιστεί με το CONFIG_COMPAT_VDSO, καθώς η διεύθυνση vdso δεν θα τυχαίνει τυχαίας κατανομής. Για περισσότερες πληροφορίες, ελέγξτε:
Ret2vDSOLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)