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

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

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

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

ELF Basic Information

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

Exploiting Tools

Μεθοδολογία Σφάλματος Στοίβας

Με τόσες πολλές τεχνικές, είναι καλό να έχετε ένα σχέδιο για το πότε θα είναι χρήσιμη κάθε τεχνική. Σημειώστε ότι οι ίδιες προστασίες θα επηρεάσουν διαφορετικές τεχνικές. Μπορείτε να βρείτε τρόπους να παρακάμψετε τις προστασίες σε κάθε ενότητα προστασίας, αλλά όχι σε αυτή τη μεθοδολογία.

Έλεγχος της Ροής

Υπάρχουν διάφοροι τρόποι με τους οποίους μπορείτε να ελέγξετε τη ροή ενός προγράμματος:

  • Σφάλματα Στοίβας που παραγράφουν τον δείκτη επιστροφής από τη στοίβα ή το EBP -> ESP -> EIP.
  • Μπορεί να χρειαστεί να εκμεταλλευτείτε ένα Σφάλμα Ακέραιου για να προκαλέσετε το σφάλμα.
  • Ή μέσω Αυθαίρετων Εγγραφών + Γράψτε Τι Πού για Εκτέλεση.
  • Μορφοποιημένες συμβολοσειρές: Εκμεταλλευτείτε το printf για να γράψετε αυθαίρετο περιεχόμενο σε αυθαίρετες διευθύνσεις.
  • Δεικτοδότηση Πίνακα: Εκμεταλλευτείτε μια κακώς σχεδιασμένη δεικτοδότηση για να μπορέσετε να ελέγξετε ορισμένους πίνακες και να αποκτήσετε μια αυθαίρετη εγγραφή.
  • Μπορεί να χρειαστεί να εκμεταλλευτείτε ένα Σφάλμα Ακέραιου για να προκαλέσετε το σφάλμα.
  • bof σε WWW μέσω ROP: Εκμεταλλευτείτε μια υπερχείλιση buffer για να κατασκευάσετε ένα ROP και να μπορέσετε να αποκτήσετε ένα WWW.

Μπορείτε να βρείτε τις τεχνικές Γράψτε Τι Πού για Εκτέλεση σε:

Write What Where 2 Exec

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

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

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