Βασική Μεθοδολογία Εκμετάλλευσης Δυαδικών Αρχείων
Reading time: 8 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 binary:
Εργαλεία Εκμετάλλευσης
Μεθοδολογία Stack Overflow
Με τόσες πολλές τεχνικές, είναι καλό να έχετε ένα σχέδιο για το πότε θα είναι χρήσιμη κάθε τεχνική. Σημειώστε ότι οι ίδιες προστασίες θα επηρεάσουν διαφορετικές τεχνικές. Μπορείτε να βρείτε τρόπους να παρακάμψετε τις προστασίες σε κάθε ενότητα προστασίας, αλλά όχι σε αυτή τη μεθοδολογία.
Έλεγχος της Ροής
Υπάρχουν διάφοροι τρόποι για να ελέγξετε τη ροή ενός προγράμματος:
- Stack Overflows που επαναγράφουν τον δείκτη επιστροφής από το stack ή το EBP -> ESP -> EIP.
- Μπορεί να χρειαστεί να καταχραστείτε ένα Integer Overflows για να προκαλέσετε την υπερχείλιση.
- Ή μέσω Arbitrary Writes + Write What Where to Execution.
- Format strings: Καταχραστείτε το
printf
για να γράψετε αυθαίρεο περιεχόμενο σε αυθαίρετες διευθύνσεις. - Array Indexing: Καταχραστείτε μια κακώς σχεδιασμένη ευρετηρίαση για να μπορέσετε να ελέγξετε ορισμένους πίνακες και να αποκτήσετε μια αυθαίρετη εγγραφή.
- Μπορεί να χρειαστεί να καταχραστείτε ένα Integer Overflows για να προκαλέσετε την υπερχείλιση.
- bof to WWW via ROP: Καταχραστείτε μια υπερχείλιση buffer για να κατασκευάσετε ένα ROP και να μπορέσετε να αποκτήσετε ένα WWW.
Μπορείτε να βρείτε τις τεχνικές Write What Where to Execution σε:
Αιώνιοι Βρόχοι
Κάτι που πρέπει να λάβετε υπόψη είναι ότι συνήθως μόνο μία εκμετάλλευση μιας ευπάθειας μπορεί να μην είναι αρκετή για να εκτελέσετε μια επιτυχημένη εκμετάλλευση, ειδικά κάποιες προστασίες χρειάζονται να παρακαμφθούν. Επομένως, είναι ενδιαφέρον να συζητήσουμε κάποιες επιλογές για να κάνουμε μια μοναδική ευπάθεια εκμεταλλεύσιμη πολλές φορές στην ίδια εκτέλεση του δυαδικού:
- Γράψτε σε μια ROP αλυσίδα τη διεύθυνση της
main
συνάρτησης ή τη διεύθυνση όπου συμβαίνει η ευπάθεια. - Ελέγχοντας μια κατάλληλη αλυσίδα ROP, μπορεί να είστε σε θέση να εκτελέσετε όλες τις ενέργειες σε αυτή την αλυσίδα.
- Γράψτε στη διεύθυνση
exit
στο GOT (ή οποιαδήποτε άλλη συνάρτηση που χρησιμοποιείται από το δυαδικό πριν τελειώσει) τη διεύθυνση για να επιστρέψετε στην ευπάθεια. - Όπως εξηγήθηκε στο .fini_array, αποθηκεύστε 2 συναρτήσεις εδώ, μία για να καλέσετε ξανά την ευπάθεια και άλλη για να καλέσετε
__libc_csu_fini
που θα καλέσει ξανά τη συνάρτηση από το.fini_array
.
Στόχοι Εκμετάλλευσης
Στόχος: Κλήση μιας Υπάρχουσας Συνάρτησης
- ret2win: Υπάρχει μια συνάρτηση στον κώδικα που πρέπει να καλέσετε (ίσως με κάποιες συγκεκριμένες παραμέτρους) προκειμένου να αποκτήσετε τη σημαία.
- Σε μια κανονική bof χωρίς PIE και canary χρειάζεται απλώς να γράψετε τη διεύθυνση στη διεύθυνση επιστροφής που αποθηκεύεται στο stack.
- Σε μια bof με PIE, θα χρειαστεί να την παρακάμψετε.
- Σε μια bof με canary, θα χρειαστεί να την παρακάμψετε.
- Αν χρειαστεί να ορίσετε πολλές παραμέτρους για να καλέσετε σωστά τη συνάρτηση ret2win, μπορείτε να χρησιμοποιήσετε:
- Μια ROP αλυσίδα αν υπάρχουν αρκετά gadgets για να προετοιμάσετε όλες τις παραμέτρους.
- SROP (σε περίπτωση που μπορείτε να καλέσετε αυτή τη syscall) για να ελέγξετε πολλούς καταχωρητές.
- Gadgets από ret2csu και ret2vdso για να ελέγξετε αρκετούς καταχωρητές.
- Μέσω ενός Write What Where μπορείτε να καταχραστείτε άλλες ευπάθειες (όχι bof) για να καλέσετε τη συνάρτηση
win
. - Pointers Redirecting: Σε περίπτωση που το stack περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να επαναγράψετε αυτή τη διεύθυνση.
- ASLR ή PIE μπορεί να επηρεάσουν τις διευθύνσεις.
- Αρχικοποιημένες μεταβλητές: Ποτέ δεν ξέρετε.
Στόχος: RCE
Μέσω shellcode, αν το nx είναι απενεργοποιημένο ή αναμειγνύοντας shellcode με ROP:
- (Stack) Shellcode: Αυτό είναι χρήσιμο για να αποθηκεύσετε ένα shellcode στο stack πριν ή μετά την επαναγραφή του δείκτη επιστροφής και στη συνέχεια να μεταβείτε σε αυτό για να το εκτελέσετε:
- Σε κάθε περίπτωση, αν υπάρχει ένα canary, σε μια κανονική bof θα χρειαστεί να την παρακάμψετε (leak).
- Χωρίς ASLR και nx είναι δυνατόν να μεταβείτε στη διεύθυνση του stack καθώς δεν θα αλλάξει ποτέ.
- Με 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 στο stack.
- Χρήσιμο για off-by-one υπερχείλιση stack.
- Χρήσιμο ως εναλλακτικός τρόπος για να ελέγξετε το EIP ενώ καταχράστε το EIP για να κατασκευάσετε το payload στη μνήμη και στη συνέχεια να μεταβείτε σε αυτό μέσω EBP.
Διάφορα
- Pointers Redirecting: Σε περίπτωση που το stack περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (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.