mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
dcd22bcda9
commit
51394e742a
@ -9,47 +9,47 @@
|
||||
|
||||
## 1. Thread Hijacking
|
||||
|
||||
Αρχικά, η συνάρτηση **`task_threads()`** καλείται στην θύρα εργασίας για να αποκτήσει μια λίστα νημάτων από την απομακρυσμένη εργασία. Ένα νήμα επιλέγεται για κατάληψη. Αυτή η προσέγγιση αποκλίνει από τις συμβατικές μεθόδους έγχυσης κώδικα, καθώς η δημιουργία ενός νέου απομακρυσμένου νήματος απαγορεύεται λόγω της νέας μείωσης που μπλοκάρει το `thread_create_running()`.
|
||||
Αρχικά, η συνάρτηση `task_threads()` καλείται στην θύρα εργασίας για να αποκτήσει μια λίστα νημάτων από την απομακρυσμένη εργασία. Ένα νήμα επιλέγεται για κατάληψη. Αυτή η προσέγγιση αποκλίνει από τις συμβατικές μεθόδους εισαγωγής κώδικα, καθώς η δημιουργία ενός νέου απομακρυσμένου νήματος απαγορεύεται λόγω της μείωσης που μπλοκάρει το `thread_create_running()`.
|
||||
|
||||
Για να ελεγχθεί το νήμα, καλείται η **`thread_suspend()`**, σταματώντας την εκτέλεσή του.
|
||||
Για να ελεγχθεί το νήμα, καλείται το `thread_suspend()`, σταματώντας την εκτέλεσή του.
|
||||
|
||||
Οι μόνοι επιτρεπόμενοι χειρισμοί στο απομακρυσμένο νήμα περιλαμβάνουν **σταμάτημα** και **εκκίνηση** αυτού, **ανάκτηση** και **τροποποίηση** των τιμών των καταχωρητών του. Οι απομακρυσμένες κλήσεις συναρτήσεων ξεκινούν με την ρύθμιση των καταχωρητών `x0` έως `x7` στις **παραμέτρους**, ρυθμίζοντας το **`pc`** για να στοχεύσει τη επιθυμητή συνάρτηση και ενεργοποιώντας το νήμα. Η διασφάλιση ότι το νήμα δεν θα καταρρεύσει μετά την επιστροφή απαιτεί ανίχνευση της επιστροφής.
|
||||
Οι μόνοι επιτρεπόμενοι χειρισμοί στο απομακρυσμένο νήμα περιλαμβάνουν **σταμάτημα** και **εκκίνηση** του και **ανάκτηση**/**τροποποίηση** των τιμών των καταχωρητών του. Οι απομακρυσμένες κλήσεις συναρτήσεων ξεκινούν με την ρύθμιση των καταχωρητών `x0` έως `x7` στις **παραμέτρους**, ρυθμίζοντας το `pc` για να στοχεύσει τη επιθυμητή συνάρτηση και επαναφέροντας το νήμα. Η διασφάλιση ότι το νήμα δεν θα καταρρεύσει μετά την επιστροφή απαιτεί ανίχνευση της επιστροφής.
|
||||
|
||||
Μια στρατηγική περιλαμβάνει **καταχώρηση ενός χειριστή εξαιρέσεων** για το απομακρυσμένο νήμα χρησιμοποιώντας το `thread_set_exception_ports()`, ρυθμίζοντας τον καταχωρητή `lr` σε μια μη έγκυρη διεύθυνση πριν από την κλήση της συνάρτησης. Αυτό προκαλεί μια εξαίρεση μετά την εκτέλεση της συνάρτησης, στέλνοντας ένα μήνυμα στη θύρα εξαίρεσης, επιτρέποντας την επιθεώρηση της κατάστασης του νήματος για την ανάκτηση της τιμής επιστροφής. Εναλλακτικά, όπως υιοθετήθηκε από την εκμετάλλευση triple_fetch του Ian Beer, ο `lr` ρυθμίζεται να επαναλαμβάνεται άπειρα. Οι καταχωρητές του νήματος παρακολουθούνται συνεχώς μέχρι το **`pc` να δείχνει σε αυτή την εντολή**.
|
||||
Μια στρατηγική περιλαμβάνει την καταχώρηση ενός **χειριστή εξαίρεσης** για το απομακρυσμένο νήμα χρησιμοποιώντας το `thread_set_exception_ports()`, ρυθμίζοντας τον καταχωρητή `lr` σε μια μη έγκυρη διεύθυνση πριν από την κλήση της συνάρτησης. Αυτό προκαλεί μια εξαίρεση μετά την εκτέλεση της συνάρτησης, στέλνοντας ένα μήνυμα στην θύρα εξαίρεσης, επιτρέποντας την επιθεώρηση της κατάστασης του νήματος για την ανάκτηση της τιμής επιστροφής. Εναλλακτικά, όπως υιοθετήθηκε από την εκμετάλλευση *triple_fetch* του Ian Beer, το `lr` ρυθμίζεται να επαναλαμβάνεται άπειρα; οι καταχωρητές του νήματος παρακολουθούνται συνεχώς μέχρι το `pc` να δείχνει σε αυτή την εντολή.
|
||||
|
||||
## 2. Mach ports for communication
|
||||
|
||||
Η επόμενη φάση περιλαμβάνει τη δημιουργία Mach ports για να διευκολύνει την επικοινωνία με το απομακρυσμένο νήμα. Αυτές οι θύρες είναι καθοριστικές για τη μεταφορά αυθαίρετων δικαιωμάτων αποστολής και λήψης μεταξύ των εργασιών.
|
||||
Η επόμενη φάση περιλαμβάνει την εγκαθίδρυση Mach ports για να διευκολύνει την επικοινωνία με το απομακρυσμένο νήμα. Αυτές οι θύρες είναι καθοριστικές για τη μεταφορά αυθαίρετων δικαιωμάτων αποστολής/λήψης μεταξύ εργασιών.
|
||||
|
||||
Για αμφίδρομη επικοινωνία, δημιουργούνται δύο δικαιώματα λήψης Mach: ένα στην τοπική και ένα στην απομακρυσμένη εργασία. Στη συνέχεια, ένα δικαίωμα αποστολής για κάθε θύρα μεταφέρεται στην αντίστοιχη εργασία, επιτρέποντας την ανταλλαγή μηνυμάτων.
|
||||
Για αμφίδρομη επικοινωνία, δημιουργούνται δύο δικαιώματα λήψης Mach: ένα στην τοπική και το άλλο στην απομακρυσμένη εργασία. Στη συνέχεια, ένα δικαίωμα αποστολής για κάθε θύρα μεταφέρεται στην αντίστοιχη εργασία, επιτρέποντας την ανταλλαγή μηνυμάτων.
|
||||
|
||||
Εστιάζοντας στην τοπική θύρα, το δικαίωμα λήψης κατέχεται από την τοπική εργασία. Η θύρα δημιουργείται με το `mach_port_allocate()`. Η πρόκληση έγκειται στη μεταφορά ενός δικαιώματος αποστολής σε αυτή τη θύρα στην απομακρυσμένη εργασία.
|
||||
|
||||
Μια στρατηγική περιλαμβάνει την εκμετάλλευση του `thread_set_special_port()` για να τοποθετήσει ένα δικαίωμα αποστολής στη τοπική θύρα στην `THREAD_KERNEL_PORT` του απομακρυσμένου νήματος. Στη συνέχεια, το απομακρυσμένο νήμα καθοδηγείται να καλέσει το `mach_thread_self()` για να ανακτήσει το δικαίωμα αποστολής.
|
||||
Μια στρατηγική περιλαμβάνει την εκμετάλλευση του `thread_set_special_port()` για να τοποθετήσει ένα δικαίωμα αποστολής στην τοπική θύρα στο `THREAD_KERNEL_PORT` του απομακρυσμένου νήματος. Στη συνέχεια, το απομακρυσμένο νήμα καθοδηγείται να καλέσει το `mach_thread_self()` για να ανακτήσει το δικαίωμα αποστολής.
|
||||
|
||||
Για την απομακρυσμένη θύρα, η διαδικασία είναι ουσιαστικά αντίστροφη. Το απομακρυσμένο νήμα καθοδηγείται να δημιουργήσει μια θύρα Mach μέσω του `mach_reply_port()` (καθώς το `mach_port_allocate()` δεν είναι κατάλληλο λόγω του μηχανισμού επιστροφής του). Μετά τη δημιουργία της θύρας, καλείται το `mach_port_insert_right()` στο απομακρυσμένο νήμα για να καθιερώσει ένα δικαίωμα αποστολής. Αυτό το δικαίωμα αποθηκεύεται στη μνήμη του πυρήνα χρησιμοποιώντας το `thread_set_special_port()`. Επιστρέφοντας στην τοπική εργασία, χρησιμοποιείται το `thread_get_special_port()` στο απομακρυσμένο νήμα για να αποκτήσει ένα δικαίωμα αποστολής στη νεοδημιουργημένη θύρα Mach στην απομακρυσμένη εργασία.
|
||||
Για την απομακρυσμένη θύρα, η διαδικασία είναι ουσιαστικά αντίστροφη. Το απομακρυσμένο νήμα καθοδηγείται να δημιουργήσει μια θύρα Mach μέσω του `mach_reply_port()` (καθώς το `mach_port_allocate()` δεν είναι κατάλληλο λόγω του μηχανισμού επιστροφής του). Μετά τη δημιουργία της θύρας, καλείται το `mach_port_insert_right()` στο απομακρυσμένο νήμα για να καθιερώσει ένα δικαίωμα αποστολής. Αυτό το δικαίωμα αποθηκεύεται στη μνήμη χρησιμοποιώντας το `thread_set_special_port()`. Επιστρέφοντας στην τοπική εργασία, χρησιμοποιείται το `thread_get_special_port()` στο απομακρυσμένο νήμα για να αποκτήσει ένα δικαίωμα αποστολής στη νεοδημιουργημένη θύρα Mach στην απομακρυσμένη εργασία.
|
||||
|
||||
Η ολοκλήρωση αυτών των βημάτων έχει ως αποτέλεσμα τη δημιουργία Mach ports, θέτοντας τα θεμέλια για αμφίδρομη επικοινωνία.
|
||||
Η ολοκλήρωση αυτών των βημάτων έχει ως αποτέλεσμα την εγκαθίδρυση Mach ports, θέτοντας τα θεμέλια για αμφίδρομη επικοινωνία.
|
||||
|
||||
## 3. Basic Memory Read/Write Primitives
|
||||
|
||||
Σε αυτή την ενότητα, η εστίαση είναι στη χρήση του εκτελέσιμου πρωτοκόλλου για την καθιέρωση βασικών πρωτοκόλλων ανάγνωσης και εγγραφής μνήμης. Αυτά τα αρχικά βήματα είναι κρίσιμα για την απόκτηση περισσότερου ελέγχου πάνω στη απομακρυσμένη διαδικασία, αν και τα πρωτόκολλα σε αυτό το στάδιο δεν θα εξυπηρετήσουν πολλούς σκοπούς. Σύντομα, θα αναβαθμιστούν σε πιο προηγμένες εκδόσεις.
|
||||
Σε αυτή την ενότητα, η προσοχή εστιάζεται στη χρήση του εκτελέσιμου πρωτοκόλλου για την εγκαθίδρυση βασικών πρωτοκόλλων ανάγνωσης/εγγραφής μνήμης. Αυτά τα αρχικά βήματα είναι κρίσιμα για την απόκτηση περισσότερου ελέγχου πάνω στη απομακρυσμένη διαδικασία, αν και τα πρωτόκολλα σε αυτό το στάδιο δεν θα εξυπηρετήσουν πολλούς σκοπούς. Σύντομα, θα αναβαθμιστούν σε πιο προηγμένες εκδόσεις.
|
||||
|
||||
### Memory Reading and Writing Using Execute Primitive
|
||||
### Memory reading and writing using the execute primitive
|
||||
|
||||
Ο στόχος είναι να εκτελούνται αναγνώσεις και εγγραφές μνήμης χρησιμοποιώντας συγκεκριμένες συναρτήσεις. Για την ανάγνωση μνήμης, χρησιμοποιούνται συναρτήσεις που μοιάζουν με την παρακάτω δομή:
|
||||
Ο στόχος είναι να εκτελούνται αναγνώσεις και εγγραφές μνήμης χρησιμοποιώντας συγκεκριμένες συναρτήσεις. Για **ανάγνωση μνήμης**:
|
||||
```c
|
||||
uint64_t read_func(uint64_t *address) {
|
||||
return *address;
|
||||
}
|
||||
```
|
||||
Και για την εγγραφή στη μνήμη, χρησιμοποιούνται συναρτήσεις παρόμοιες με αυτή τη δομή:
|
||||
Για **γραφή μνήμης**:
|
||||
```c
|
||||
void write_func(uint64_t *address, uint64_t value) {
|
||||
*address = value;
|
||||
}
|
||||
```
|
||||
Αυτές οι συναρτήσεις αντιστοιχούν στις δοθείσες εντολές assembly:
|
||||
Αυτές οι συναρτήσεις αντιστοιχούν στην παρακάτω συναρμολόγηση:
|
||||
```
|
||||
_read_func:
|
||||
ldr x0, [x0]
|
||||
@ -58,104 +58,116 @@ _write_func:
|
||||
str x1, [x0]
|
||||
ret
|
||||
```
|
||||
### Αναγνώριση Κατάλληλων Συναρτήσεων
|
||||
### Αναγνώριση κατάλληλων συναρτήσεων
|
||||
|
||||
Μια σάρωση κοινών βιβλιοθηκών αποκάλυψε κατάλληλους υποψηφίους για αυτές τις λειτουργίες:
|
||||
|
||||
1. **Ανάγνωση Μνήμης:**
|
||||
Η συνάρτηση `property_getName()` από τη [βιβλιοθήκη χρόνου εκτέλεσης Objective-C](https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-runtime-new.mm.auto.html) αναγνωρίζεται ως κατάλληλη συνάρτηση για την ανάγνωση μνήμης. Η συνάρτηση περιγράφεται παρακάτω:
|
||||
1. **Ανάγνωση μνήμης — `property_getName()`** (libobjc):
|
||||
```c
|
||||
const char *property_getName(objc_property_t prop) {
|
||||
return prop->name;
|
||||
}
|
||||
```
|
||||
Αυτή η συνάρτηση λειτουργεί αποτελεσματικά όπως η `read_func` επιστρέφοντας το πρώτο πεδίο του `objc_property_t`.
|
||||
|
||||
2. **Γράφοντας Μνήμη:**
|
||||
Η εύρεση μιας προ-κατασκευασμένης συνάρτησης για τη γραφή μνήμης είναι πιο δύσκολη. Ωστόσο, η συνάρτηση `_xpc_int64_set_value()` από τη libxpc είναι κατάλληλος υποψήφιος με την παρακάτω αποσυναρμολόγηση:
|
||||
2. **Γράφοντας μνήμη — `_xpc_int64_set_value()`** (libxpc):
|
||||
```c
|
||||
__xpc_int64_set_value:
|
||||
str x1, [x0, #0x18]
|
||||
ret
|
||||
```
|
||||
Για να εκτελέσετε μια εγγραφή 64-bit σε μια συγκεκριμένη διεύθυνση, η απομακρυσμένη κλήση δομείται ως εξής:
|
||||
Για να εκτελέσετε μια εγγραφή 64-bit σε μια αυθαίρετη διεύθυνση:
|
||||
```c
|
||||
_xpc_int64_set_value(address - 0x18, value)
|
||||
_xpc_int64_set_value(address - 0x18, value);
|
||||
```
|
||||
Με αυτές τις βασικές αρχές καθορισμένες, η σκηνή είναι έτοιμη για τη δημιουργία κοινής μνήμης, σημειώνοντας μια σημαντική πρόοδο στον έλεγχο της απομακρυσμένης διαδικασίας.
|
||||
Με αυτές τις βασικές αρχές καθορισμένες, η σκηνή είναι έτοιμη για τη δημιουργία κοινής μνήμης, σηματοδοτώντας μια σημαντική πρόοδο στον έλεγχο της απομακρυσμένης διαδικασίας.
|
||||
|
||||
## 4. Ρύθμιση Κοινής Μνήμης
|
||||
|
||||
Ο στόχος είναι να καθιερωθεί κοινή μνήμη μεταξύ τοπικών και απομακρυσμένων εργασιών, απλοποιώντας τη μεταφορά δεδομένων και διευκολύνοντας την κλήση συναρτήσεων με πολλαπλά επιχειρήματα. Η προσέγγιση περιλαμβάνει την εκμετάλλευση του `libxpc` και του τύπου αντικειμένου `OS_xpc_shmem`, ο οποίος βασίζεται σε καταχωρίσεις μνήμης Mach.
|
||||
Ο στόχος είναι να καθιερωθεί κοινή μνήμη μεταξύ τοπικών και απομακρυσμένων εργασιών, απλοποιώντας τη μεταφορά δεδομένων και διευκολύνοντας την κλήση συναρτήσεων με πολλαπλά επιχειρήματα. Η προσέγγιση εκμεταλλεύεται το `libxpc` και τον τύπο αντικειμένου `OS_xpc_shmem`, ο οποίος βασίζεται σε καταχωρήσεις μνήμης Mach.
|
||||
|
||||
### Επισκόπηση Διαδικασίας:
|
||||
### Επισκόπηση Διαδικασίας
|
||||
|
||||
1. **Κατανομή Μνήμης**:
|
||||
|
||||
- Κατανομή της μνήμης για κοινή χρήση χρησιμοποιώντας `mach_vm_allocate()`.
|
||||
- Χρησιμοποιήστε το `xpc_shmem_create()` για να δημιουργήσετε ένα αντικείμενο `OS_xpc_shmem` για την κατανεμημένη περιοχή μνήμης. Αυτή η συνάρτηση θα διαχειριστεί τη δημιουργία της καταχώρισης μνήμης Mach και θα αποθηκεύσει το δικαίωμα αποστολής Mach στη θέση `0x18` του αντικειμένου `OS_xpc_shmem`.
|
||||
|
||||
2. **Δημιουργία Κοινής Μνήμης στην Απομακρυσμένη Διαδικασία**:
|
||||
|
||||
- Κατανομή μνήμης για το αντικείμενο `OS_xpc_shmem` στην απομακρυσμένη διαδικασία με μια απομακρυσμένη κλήση στο `malloc()`.
|
||||
- Αντιγραφή των περιεχομένων του τοπικού αντικειμένου `OS_xpc_shmem` στην απομακρυσμένη διαδικασία. Ωστόσο, αυτή η αρχική αντιγραφή θα έχει λανθασμένα ονόματα καταχωρίσεων μνήμης Mach στη θέση `0x18`.
|
||||
|
||||
3. **Διόρθωση της Καταχώρισης Μνήμης Mach**:
|
||||
|
||||
- Χρησιμοποιήστε τη μέθοδο `thread_set_special_port()` για να εισάγετε ένα δικαίωμα αποστολής για την καταχώριση μνήμης Mach στην απομακρυσμένη εργασία.
|
||||
- Διορθώστε το πεδίο καταχώρισης μνήμης Mach στη θέση `0x18` αντικαθιστώντας το με το όνομα της καταχώρισης μνήμης απομακρυσμένης.
|
||||
|
||||
4. **Ολοκλήρωση Ρύθμισης Κοινής Μνήμης**:
|
||||
- Επικυρώστε το απομακρυσμένο αντικείμενο `OS_xpc_shmem`.
|
||||
- Καθιερώστε την κοινή μνήμη με μια απομακρυσμένη κλήση στο `xpc_shmem_remote()`.
|
||||
|
||||
Ακολουθώντας αυτά τα βήματα, η κοινή μνήμη μεταξύ των τοπικών και απομακρυσμένων εργασιών θα ρυθμιστεί αποτελεσματικά, επιτρέποντας απλές μεταφορές δεδομένων και την εκτέλεση συναρτήσεων που απαιτούν πολλαπλά επιχειρήματα.
|
||||
|
||||
## Πρόσθετα Κωδικοποιημένα Αποσπάσματα
|
||||
|
||||
Για την κατανομή μνήμης και τη δημιουργία αντικειμένου κοινής μνήμης:
|
||||
```c
|
||||
mach_vm_allocate();
|
||||
xpc_shmem_create();
|
||||
```
|
||||
Για τη δημιουργία και διόρθωση του αντικειμένου κοινής μνήμης στη απομακρυσμένη διαδικασία:
|
||||
```c
|
||||
malloc(); // for allocating memory remotely
|
||||
thread_set_special_port(); // for inserting send right
|
||||
```
|
||||
Θυμηθείτε να χειρίζεστε σωστά τις λεπτομέρειες των Mach ports και των ονομάτων εισόδου μνήμης για να διασφαλίσετε ότι η ρύθμιση της κοινής μνήμης λειτουργεί σωστά.
|
||||
1. **Κατανομή μνήμης**
|
||||
* Κατανομή μνήμης για κοινή χρήση χρησιμοποιώντας `mach_vm_allocate()`.
|
||||
* Χρησιμοποιήστε `xpc_shmem_create()` για να δημιουργήσετε ένα αντικείμενο `OS_xpc_shmem` για την κατανεμημένη περιοχή.
|
||||
2. **Δημιουργία κοινής μνήμης στην απομακρυσμένη διαδικασία**
|
||||
* Κατανομή μνήμης για το αντικείμενο `OS_xpc_shmem` στην απομακρυσμένη διαδικασία (`remote_malloc`).
|
||||
* Αντιγράψτε το τοπικό αντικείμενο πρότυπο; απαιτείται ακόμα διόρθωση του ενσωματωμένου δικαιώματος αποστολής Mach στη θέση `0x18`.
|
||||
3. **Διόρθωση της καταχώρησης μνήμης Mach**
|
||||
* Εισάγετε ένα δικαίωμα αποστολής με `thread_set_special_port()` και αντικαταστήστε το πεδίο `0x18` με το όνομα της απομακρυσμένης καταχώρησης.
|
||||
4. **Ολοκλήρωση**
|
||||
* Επικυρώστε το απομακρυσμένο αντικείμενο και χαρτογραφήστε το με μια απομακρυσμένη κλήση στο `xpc_shmem_remote()`.
|
||||
|
||||
## 5. Επίτευξη Πλήρους Ελέγχου
|
||||
|
||||
Αφού καθορίσουμε με επιτυχία την κοινή μνήμη και αποκτήσουμε ικανότητες αυθαίρετης εκτέλεσης, έχουμε ουσιαστικά αποκτήσει πλήρη έλεγχο της στοχευμένης διαδικασίας. Οι βασικές λειτουργίες που επιτρέπουν αυτόν τον έλεγχο είναι:
|
||||
Μόλις είναι διαθέσιμη η αυθαίρετη εκτέλεση και ένα κανάλι πίσω κοινής μνήμης, κατέχετε αποτελεσματικά τη διαδικασία στόχο:
|
||||
|
||||
1. **Αυθαίρετες Λειτουργίες Μνήμης**:
|
||||
* **Αυθαίρετη R/W μνήμη** — χρησιμοποιήστε `memcpy()` μεταξύ τοπικών και κοινών περιοχών.
|
||||
* **Κλήσεις συναρτήσεων με > 8 επιχειρήματα** — τοποθετήστε τα επιπλέον επιχειρήματα στη στοίβα σύμφωνα με τη σύμβαση κλήσης arm64.
|
||||
* **Μεταφορά δικαιωμάτων Mach** — περάστε δικαιώματα σε μηνύματα Mach μέσω των καθιερωμένων θυρών.
|
||||
* **Μεταφορά περιγραφέων αρχείων** — εκμεταλλευτείτε τα fileports (βλ. *triple_fetch*).
|
||||
|
||||
- Εκτελέστε αυθαίρετες αναγνώσεις μνήμης καλώντας το `memcpy()` για να αντιγράψετε δεδομένα από την κοινή περιοχή.
|
||||
- Εκτελέστε αυθαίρετες εγγραφές μνήμης χρησιμοποιώντας το `memcpy()` για να μεταφέρετε δεδομένα στην κοινή περιοχή.
|
||||
Όλα αυτά είναι περιτυλιγμένα στη βιβλιοθήκη [`threadexec`](https://github.com/bazad/threadexec) για εύκολη επαναχρησιμοποίηση.
|
||||
|
||||
2. **Διαχείριση Κλήσεων Συναρτήσεων με Πολλαπλά Επιχειρήματα**:
|
||||
---
|
||||
|
||||
- Για συναρτήσεις που απαιτούν περισσότερα από 8 επιχειρήματα, τοποθετήστε τα επιπλέον επιχειρήματα στη στοίβα σύμφωνα με τη σύμβαση κλήσης.
|
||||
## 6. Ιδιαιτερότητες Apple Silicon (arm64e)
|
||||
|
||||
3. **Μεταφορά Mach Port**:
|
||||
Σε συσκευές Apple Silicon (arm64e) **Κωδικοί Αυθεντικοποίησης Δεικτών (PAC)** προστατεύουν όλες τις διευθύνσεις επιστροφής και πολλούς δείκτες συναρτήσεων. Οι τεχνικές κατάληψης νήματος που *επανχρησιμοποιούν υπάρχον κώδικα* συνεχίζουν να λειτουργούν επειδή οι αρχικές τιμές στα `lr`/`pc` φέρουν ήδη έγκυρες υπογραφές PAC. Προβλήματα προκύπτουν όταν προσπαθείτε να μεταβείτε σε μνήμη που ελέγχεται από τον επιτιθέμενο:
|
||||
|
||||
- Μεταφέρετε Mach ports μεταξύ διαδικασιών μέσω Mach μηνυμάτων μέσω προηγουμένως καθορισμένων ports.
|
||||
1. Κατανομή εκτελέσιμης μνήμης μέσα στον στόχο (απομακρυσμένο `mach_vm_allocate` + `mprotect(PROT_EXEC)`).
|
||||
2. Αντιγράψτε το payload σας.
|
||||
3. Μέσα στη *απομακρυσμένη* διαδικασία υπογράψτε τον δείκτη:
|
||||
```c
|
||||
uint64_t ptr = (uint64_t)payload;
|
||||
ptr = ptrauth_sign_unauthenticated((void*)ptr, ptrauth_key_asia, 0);
|
||||
```
|
||||
4. Ορίστε `pc = ptr` στην κατάσταση του καταληφθέντος νήματος.
|
||||
|
||||
4. **Μεταφορά Περιγραφέα Αρχείου**:
|
||||
- Μεταφέρετε περιγραφείς αρχείων μεταξύ διαδικασιών χρησιμοποιώντας fileports, μια τεχνική που επισημαίνεται από τον Ian Beer στο `triple_fetch`.
|
||||
Εναλλακτικά, παραμείνετε συμβατοί με το PAC αλυσσοδεσμεύοντας υπάρχοντα gadgets/functions (παραδοσιακό ROP).
|
||||
|
||||
Αυτός ο ολοκληρωμένος έλεγχος είναι ενσωματωμένος στη βιβλιοθήκη [threadexec](https://github.com/bazad/threadexec), παρέχοντας μια λεπτομερή υλοποίηση και μια φιλική προς τον χρήστη API για αλληλεπίδραση με τη διαδικασία του θύματος.
|
||||
## 7. Ανίχνευση & Σκληροποίηση με το EndpointSecurity
|
||||
|
||||
## Σημαντικές Σκέψεις:
|
||||
Το **EndpointSecurity (ES)** πλαίσιο εκθέτει γεγονότα πυρήνα που επιτρέπουν στους υπερασπιστές να παρακολουθούν ή να μπλοκάρουν τις απόπειρες έγχυσης νημάτων:
|
||||
|
||||
- Διασφαλίστε τη σωστή χρήση του `memcpy()` για τις λειτουργίες ανάγνωσης/εγγραφής μνήμης για να διατηρήσετε τη σταθερότητα του συστήματος και την ακεραιότητα των δεδομένων.
|
||||
- Όταν μεταφέρετε Mach ports ή περιγραφείς αρχείων, ακολουθήστε τους σωστούς πρωτοκόλλους και χειριστείτε τους πόρους υπεύθυνα για να αποτρέψετε διαρροές ή μη προγραμματισμένη πρόσβαση.
|
||||
* `ES_EVENT_TYPE_AUTH_GET_TASK` – ενεργοποιείται όταν μια διαδικασία ζητά την θύρα άλλου έργου (π.χ. `task_for_pid()`).
|
||||
* `ES_EVENT_TYPE_NOTIFY_REMOTE_THREAD_CREATE` – εκπέμπεται κάθε φορά που δημιουργείται ένα νήμα σε *διαφορετικό* έργο.
|
||||
* `ES_EVENT_TYPE_NOTIFY_THREAD_SET_STATE` (προστέθηκε στο macOS 14 Sonoma) – υποδεικνύει την χειρισμό καταχωρητών ενός υπάρχοντος νήματος.
|
||||
|
||||
Ακολουθώντας αυτές τις οδηγίες και χρησιμοποιώντας τη βιβλιοθήκη `threadexec`, μπορεί κανείς να διαχειριστεί και να αλληλεπιδράσει με διαδικασίες σε λεπτομερές επίπεδο, επιτυγχάνοντας πλήρη έλεγχο της στοχευμένης διαδικασίας.
|
||||
Ελάχιστος πελάτης Swift που εκτυπώνει γεγονότα απομακρυσμένου νήματος:
|
||||
```swift
|
||||
import EndpointSecurity
|
||||
|
||||
let client = try! ESClient(subscriptions: [.notifyRemoteThreadCreate]) {
|
||||
(_, msg) in
|
||||
if let evt = msg.remoteThreadCreate {
|
||||
print("[ALERT] remote thread in pid \(evt.target.pid) by pid \(evt.thread.pid)")
|
||||
}
|
||||
}
|
||||
RunLoop.main.run()
|
||||
```
|
||||
Ερώτηση με **osquery** ≥ 5.8:
|
||||
```sql
|
||||
SELECT target_pid, source_pid, target_path
|
||||
FROM es_process_events
|
||||
WHERE event_type = 'REMOTE_THREAD_CREATE';
|
||||
```
|
||||
### Σκέψεις για σκληρυμένο χρόνο εκτέλεσης
|
||||
|
||||
Η διανομή της εφαρμογής σας **χωρίς** την επιλεξιμότητα `com.apple.security.get-task-allow` αποτρέπει τους μη ριζικούς επιτιθέμενους από το να αποκτήσουν το task-port της. Η Προστασία Ακεραιότητας Συστήματος (SIP) εξακολουθεί να μπλοκάρει την πρόσβαση σε πολλές δυαδικές εφαρμογές της Apple, αλλά το λογισμικό τρίτων πρέπει να επιλέξει ρητά να εξαιρεθεί.
|
||||
|
||||
## 8. Πρόσφατα Δημόσια Εργαλεία (2023-2025)
|
||||
|
||||
| Εργαλείο | Έτος | Σημειώσεις |
|
||||
|------|------|---------|
|
||||
| [`task_vaccine`](https://github.com/rodionovd/task_vaccine) | 2023 | Συμπαγές PoC που δείχνει την εκτροπή νήματος με γνώση PAC σε Ventura/Sonoma |
|
||||
| `remote_thread_es` | 2024 | Βοηθητικό πρόγραμμα EndpointSecurity που χρησιμοποιείται από αρκετούς προμηθευτές EDR για την εμφάνιση γεγονότων `REMOTE_THREAD_CREATE` |
|
||||
|
||||
> Η ανάγνωση του πηγαίου κώδικα αυτών των έργων είναι χρήσιμη για την κατανόηση των αλλαγών API που εισήχθησαν στο macOS 13/14 και για να παραμείνετε συμβατοί μεταξύ Intel ↔ Apple Silicon.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- [https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/](https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/)
|
||||
- [https://github.com/rodionovd/task_vaccine](https://github.com/rodionovd/task_vaccine)
|
||||
- [https://developer.apple.com/documentation/endpointsecurity/es_event_type_notify_remote_thread_create](https://developer.apple.com/documentation/endpointsecurity/es_event_type_notify_remote_thread_create)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user