Βασική Μεθοδολογία Εκμετάλλευσης Δυαδικών Αρχείων

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

Βασικές Πληροφορίες για ELF

Πριν ξεκινήσετε να εκμεταλλεύεστε οτιδήποτε, είναι ενδιαφέρον να κατανοήσετε μέρος της δομής ενός ELF binary:

ELF Basic Information

Εργαλεία Εκμετάλλευσης

Exploiting Tools

Μεθοδολογία 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 σε:

Write What Where 2 Exec

Αιώνιοι Βρόχοι

Κάτι που πρέπει να λάβετε υπόψη είναι ότι συνήθως μόνο μία εκμετάλλευση μιας ευπάθειας μπορεί να μην είναι αρκετή για να εκτελέσετε μια επιτυχημένη εκμετάλλευση, ειδικά κάποιες προστασίες χρειάζονται να παρακαμφθούν. Επομένως, είναι ενδιαφέρον να συζητήσουμε κάποιες επιλογές για να κάνουμε μια μοναδική ευπάθεια εκμεταλλεύσιμη πολλές φορές στην ίδια εκτέλεση του δυαδικού:

  • Γράψτε σε μια 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