Βασική Μεθοδολογία Εκμετάλλευσης Δυαδικών Αρχείων
Reading time: 9 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Βασικές Πληροφορίες για ELF
Πριν ξεκινήσετε να εκμεταλλεύεστε οτιδήποτε, είναι ενδιαφέρον να κατανοήσετε μέρος της δομής ενός ELF δυαδικού:
Εργαλεία Εκμετάλλευσης
Μεθοδολογία Σφάλματος Στοίβας
Με τόσες πολλές τεχνικές, είναι καλό να έχετε ένα σχέδιο για το πότε θα είναι χρήσιμη κάθε τεχνική. Σημειώστε ότι οι ίδιες προστασίες θα επηρεάσουν διαφορετικές τεχνικές. Μπορείτε να βρείτε τρόπους να παρακάμψετε τις προστασίες σε κάθε ενότητα προστασίας, αλλά όχι σε αυτή τη μεθοδολογία.
Έλεγχος της Ροής
Υπάρχουν διάφοροι τρόποι με τους οποίους μπορείτε να ελέγξετε τη ροή ενός προγράμματος:
- Σφάλματα Στοίβας που παραγράφουν τον δείκτη επιστροφής από τη στοίβα ή το EBP -> ESP -> EIP.
- Μπορεί να χρειαστεί να εκμεταλλευτείτε ένα Σφάλμα Ακέραιου για να προκαλέσετε το σφάλμα.
- Ή μέσω Αυθαίρετων Εγγραφών + Γράψτε Τι Πού για Εκτέλεση.
- Μορφοποιημένες συμβολοσειρές: Εκμεταλλευτείτε το
printf
για να γράψετε αυθαίρετο περιεχόμενο σε αυθαίρετες διευθύνσεις. - Δεικτοδότηση Πίνακα: Εκμεταλλευτείτε μια κακώς σχεδιασμένη δεικτοδότηση για να μπορέσετε να ελέγξετε ορισμένους πίνακες και να αποκτήσετε μια αυθαίρετη εγγραφή.
- Μπορεί να χρειαστεί να εκμεταλλευτείτε ένα Σφάλμα Ακέραιου για να προκαλέσετε το σφάλμα.
- bof σε WWW μέσω ROP: Εκμεταλλευτείτε μια υπερχείλιση buffer για να κατασκευάσετε ένα ROP και να μπορέσετε να αποκτήσετε ένα WWW.
Μπορείτε να βρείτε τις τεχνικές Γράψτε Τι Πού για Εκτέλεση σε:
Αιώνιοι Βρόχοι
Κάτι που πρέπει να λάβετε υπόψη είναι ότι συνήθως μόνο μία εκμετάλλευση μιας ευπάθειας μπορεί να μην είναι αρκετή για να εκτελέσετε μια επιτυχημένη εκμετάλλευση, ειδικά κάποιες προστασίες χρειάζονται να παρακαμφθούν. Επομένως, είναι ενδιαφέρον να συζητήσουμε ορισμένες επιλογές για να κάνουμε μια μοναδική ευπάθεια εκμεταλλεύσιμη πολλές φορές στην ίδια εκτέλεση του δυαδικού:
- Γράψτε σε μια αλυσίδα ROP τη διεύθυνση της
main
συνάρτησης ή τη διεύθυνση όπου συμβαίνει η ευπάθεια. - Ελέγχοντας μια κατάλληλη αλυσίδα ROP, μπορεί να είστε σε θέση να εκτελέσετε όλες τις ενέργειες σε αυτήν την αλυσίδα.
- Γράψτε στη διεύθυνση
exit
στο GOT (ή σε οποιαδήποτε άλλη συνάρτηση που χρησιμοποιείται από το δυαδικό πριν τελειώσει) τη διεύθυνση για να επιστρέψετε στην ευπάθεια. - Όπως εξηγήθηκε στο .fini_array, αποθηκεύστε 2 συναρτήσεις εδώ, μία για να καλέσετε ξανά την ευπάθεια και άλλη για να καλέσετε
__libc_csu_fini
που θα καλέσει ξανά τη συνάρτηση από το.fini_array
.
Στόχοι Εκμετάλλευσης
Στόχος: Κλήση μιας Υπάρχουσας Συνάρτησης
- ret2win: Υπάρχει μια συνάρτηση στον κώδικα που πρέπει να καλέσετε (ίσως με κάποιες συγκεκριμένες παραμέτρους) προκειμένου να αποκτήσετε τη σημαία.
- Σε μια κανονική bof χωρίς PIE και canary χρειάζεται απλώς να γράψετε τη διεύθυνση στη διεύθυνση επιστροφής που αποθηκεύεται στη στοίβα.
- Σε μια bof με PIE, θα χρειαστεί να την παρακάμψετε.
- Σε μια bof με canary, θα χρειαστεί να την παρακάμψετε.
- Εάν χρειαστεί να ορίσετε πολλές παραμέτρους για να καλέσετε σωστά τη συνάρτηση ret2win, μπορείτε να χρησιμοποιήσετε:
- Μια ROP αλυσίδα αν υπάρχουν αρκετά gadgets για να προετοιμάσετε όλες τις παραμέτρους.
- SROP (σε περίπτωση που μπορείτε να καλέσετε αυτή τη syscall) για να ελέγξετε πολλούς καταχωρητές.
- Gadgets από ret2csu και ret2vdso για να ελέγξετε αρκετούς καταχωρητές.
- Μέσω ενός Write What Where μπορείτε να εκμεταλλευτείτε άλλες ευπάθειες (όχι bof) για να καλέσετε τη συνάρτηση
win
. - Ανακατεύθυνση Δεικτών: Σε περίπτωση που η στοίβα περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να παραγράψετε αυτή τη διεύθυνση.
- ASLR ή PIE μπορεί να επηρεάσουν τις διευθύνσεις.
- Μη αρχικοποιημένες μεταβλητές: Ποτέ δεν ξέρετε.
Στόχος: RCE
Μέσω shellcode, αν το nx είναι απενεργοποιημένο ή αναμειγνύοντας shellcode με ROP:
- (Στοίβα) Shellcode: Αυτό είναι χρήσιμο για να αποθηκεύσετε ένα shellcode στη στοίβα πριν ή μετά την υπερχείλιση του δείκτη επιστροφής και στη συνέχεια να μεταβείτε σε αυτό για να το εκτελέσετε:
- Σε κάθε περίπτωση, αν υπάρχει ένα canary, σε μια κανονική bof θα χρειαστεί να την παρακάμψετε (leak).
- Χωρίς ASLR και nx είναι δυνατόν να μεταβείτε στη διεύθυνση της στοίβας καθώς δεν θα αλλάξει ποτέ.
- Με ASLR θα χρειαστείτε τεχνικές όπως ret2esp/ret2reg για να μεταβείτε σε αυτό.
- Με nx, θα χρειαστεί να χρησιμοποιήσετε κάποιο ROP για να καλέσετε
memprotect
και να κάνετε κάποια σελίδαrwx
, προκειμένου στη συνέχεια να αποθηκεύσετε το shellcode εκεί (καλώντας read για παράδειγμα) και στη συνέχεια να μεταβείτε εκεί. - Αυτό θα αναμείξει το shellcode με μια αλυσίδα ROP.
Μέσω syscalls
- Ret2syscall: Χρήσιμο για να καλέσετε
execve
για να εκτελέσετε αυθαίρετες εντολές. Πρέπει να είστε σε θέση να βρείτε τους gadgets για να καλέσετε τη συγκεκριμένη syscall με τις παραμέτρους. - Εάν ASLR ή PIE είναι ενεργοποιημένα, θα χρειαστεί να τα νικήσετε για να χρησιμοποιήσετε ROP gadgets από το δυαδικό ή τις βιβλιοθήκες.
- SROP μπορεί να είναι χρήσιμο για να προετοιμάσετε το ret2execve.
- Gadgets από ret2csu και ret2vdso για να ελέγξετε αρκετούς καταχωρητές.
Μέσω libc
- Ret2lib: Χρήσιμο για να καλέσετε μια συνάρτηση από μια βιβλιοθήκη (συνήθως από
libc
) όπωςsystem
με κάποιες προετοιμασμένες παραμέτρους (π.χ.'/bin/sh'
). Χρειάζεστε το δυαδικό για να φορτώσετε τη βιβλιοθήκη με τη συνάρτηση που θα θέλατε να καλέσετε (συνήθως libc). - Εάν είναι στατικά μεταγλωττισμένο και χωρίς PIE, η διεύθυνση του
system
και του/bin/sh
δεν θα αλλάξει, οπότε είναι δυνατόν να τις χρησιμοποιήσετε στατικά. - Χωρίς ASLR και γνωρίζοντας την έκδοση libc που έχει φορτωθεί, η διεύθυνση του
system
και του/bin/sh
δεν θα αλλάξει, οπότε είναι δυνατόν να τις χρησιμοποιήσετε στατικά. - Με ASLR αλλά χωρίς PIE, γνωρίζοντας την libc και με το δυαδικό να χρησιμοποιεί τη συνάρτηση
system
είναι δυνατόν ναret
στη διεύθυνση του system στο GOT με τη διεύθυνση του'/bin/sh'
στην παράμετρο (θα χρειαστεί να το καταλάβετε). - Με ASLR αλλά χωρίς PIE, γνωρίζοντας την libc και χωρίς το δυαδικό να χρησιμοποιεί τη
system
: - Χρησιμοποιήστε
ret2dlresolve
για να επιλύσετε τη διεύθυνση τουsystem
και να την καλέσετε. - Παρακάμψτε ASLR και υπολογίστε τη διεύθυνση του
system
και του'/bin/sh'
στη μνήμη. - Με ASLR και PIE και χωρίς να γνωρίζετε την libc: Πρέπει να:
- Παρακάμψετε PIE.
- Βρείτε την έκδοση
libc
που χρησιμοποιείται (leak μερικές διευθύνσεις συναρτήσεων). - Ελέγξτε τα προηγούμενα σενάρια με ASLR για να συνεχίσετε.
Μέσω EBP/RBP
- Stack Pivoting / EBP2Ret / EBP Chaining: Ελέγξτε το ESP για να ελέγξετε το RET μέσω του αποθηκευμένου EBP στη στοίβα.
- Χρήσιμο για off-by-one υπερχείλιση στοίβας.
- Χρήσιμο ως εναλλακτικός τρόπος για να ελέγξετε το EIP ενώ εκμεταλλεύεστε το EIP για να κατασκευάσετε το payload στη μνήμη και στη συνέχεια να μεταβείτε σε αυτό μέσω EBP.
Διάφορα
- Ανακατεύθυνση Δεικτών: Σε περίπτωση που η στοίβα περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να παραγράψετε αυτή τη διεύθυνση.
- ASLR ή PIE μπορεί να επηρεάσουν τις διευθύνσεις.
- Μη αρχικοποιημένες μεταβλητές: Ποτέ δεν ξέρετε.
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.