Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2024-05-06 23:57:36 +00:00
parent 64483efd71
commit e1e5827185
2 changed files with 115 additions and 119 deletions

View file

@ -8,50 +8,50 @@
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε την [**Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>
## Μήνυματα Mach μέσω Θυρών
## Επικοινωνία Mach μέσω Θυρών
### Βασικές Πληροφορίες
Το Mach χρησιμοποιεί **εργασίες** ως τη **μικρότερη μονάδα** για την κοινή χρήση πόρων, και κάθε εργασία μπορεί να περιέχει **πολλά νήματα**. Αυτές οι **εργασίες και νήματα αντιστοιχούν 1:1 σε διεργασίες και νήματα POSIX**.
Η επικοινωνία μεταξύ εργασιών πραγματοποιείται μέσω της Διαδικασίας Επικοινωνίας Διεργασιών Mach (IPC), χρησιμοποιώντας μονοδιευθυντικά κανάλια επικοινωνίας. **Τα μηνύματα μεταφέρονται μεταξύ θυρών**, οι οποίες λειτουργούν ως είδος **ουράς μηνυμάτων** που διαχειρίζεται το πυρήνας.
Η επικοινωνία μεταξύ εργασιών πραγματοποιείται μέσω της Διαδικασίας Επικοινωνίας Διεργασιών Mach (IPC), χρησιμοποιώντας μονοδιευθυντικά κανάλια επικοινωνίας. **Τα μηνύματα μεταφέρονται μεταξύ θυρών**, οι οποίες λειτουργούν ως είδος **ουράς μηνυμάτων** που διαχειρίζεται το πυρήνα.
Μια **θύρα** είναι το **βασικό** στοιχείο του Mach IPC. Μπορεί να χρησιμοποιηθεί για να **στείλει μηνύματα και να τα λαμβάνει**.
Κάθε διεργασία έχει μια **πίνακα IPC**, όπου είναι δυνατό να βρεθούν οι **θύρες mach της διεργασίας**. Το όνομα μιας θύρας mach είναι πραγματικά ένας αριθμός (ένας δείκτης στο αντικείμενο πυρήνα).
Μια διεργασία μπορεί επίσης να στείλει ένα όνομα θύρας με κάποια δικαιώματα **σε μια διαφορετική εργασία** και το πυρήνας θα κάνει αυτήν την εγγραφή στο **πίνακα IPC της άλλης εργασίας** να εμφανιστεί.
Μια διεργασία μπορεί επίσης να στείλει ένα όνομα θύρας με κάποια δικαιώματα **σε μια διαφορετική εργασία** και το πυρήνας θα κάνει αυτή την εγγραφή στο **πίνακα IPC της άλλης εργασίας** να εμφανιστεί.
### Δικαιώματα Θύρας
Τα δικαιώματα θύρας, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια εργασία, είναι καίριας σημασίας για αυτήν την επικοινωνία. Τα πιθανά **δικαιώματα θύρας** είναι ([ορισμοί από εδώ](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
* **Δικαίωμα Λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που στέλνονται στη θύρα. Οι θύρες Mach είναι ουρές MPSC (πολλαπλών παραγωγών, μονό ενεργοποιητή) που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (διαφορετικά από τα αγωγά, όπου πολλές διεργασίες μπορούν να κρατούν όλες τις περιγραφές αρχείων στο άκρο ανάγνωσης ενός αγωγού).
* **Δικαίωμα Λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που στέλνονται στη θύρα. Οι θύρες Mach είναι ουρές MPSC (πολλαπλών παραγωγών, μονό παραλήπτη) που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (διαφορετικά από τα αγωγά, όπου πολλές διεργασίες μπορούν να κρατούν όλες τις περιγραφές αρχείων στο άκρο ανάγνωσης ενός αγωγού).
* Μια **εργασία με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και να **δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **ίδια εργασία έχει το Δικαίωμα Λήψης πάνω από τη θύρα της**.
* Εάν ο κάτοχος του Δικαιώματος Λήψης **πεθάνει** ή το κλείσει, το **δικαίωμα αποστολής γίνεται άχρηστο (νεκρό όνομα)**.
* **Δικαίωμα Αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στη θύρα.
* Το Δικαίωμα Αποστολής μπορεί να **κλωνοποιηθεί** έτσι μια εργασία που κατέχει ένα Δικαίωμα Αποστολής μπορεί να κλωνοποιήσει το δικαίωμα και να **το χορηγήσει σε μια τρίτη εργασία**.
* Το Δικαίωμα Αποστολής μπορεί να **κλωνοποιηθεί** έτσι μια εργασία που κατέχει ένα Δικαίωμα Αποστολής μπορεί να κλωνοποιήσει το δικαίωμα και να το **χορηγήσει σε μια τρίτη εργασία**.
* Σημειώστε ότι τα **δικαιώματα θύρας** μπορούν επίσης να **περάσουν** μέσω μηνυμάτων Mac.
* **Δικαίωμα Αποστολής-Μία-Φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στη θύρα και στη συνέχεια εξαφανίζεται.
* Αυτό το δικαίωμα **δεν** μπορεί να **κλωνοποιηθεί**, αλλά μπορεί να **μετακινηθεί**.
* **Δικαίωμα Συνόλου Θυρών**, το οποίο υποδηλώνει ένα _σύνολο θυρών_ αντί για μια μεμονωμένη θύρα. Η αποσύνθεση ενός μηνύματος από ένα σύνολο θυρών αποσύρει ένα μήνυμα από μία από τις θύρες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν ταυτόχρονα σε πολλές θύρες, πολύ παρόμοια με το `select`/`poll`/`epoll`/`kqueue` στο Unix.
* **Δικαίωμα Συνόλου Θυρών**, που υποδηλώνει ένα _σύνολο θυρών_ αντί για μια μεμονωμένη θύρα. Η αποσύνθεση ενός μηνύματος από ένα σύνολο θυρών αποσύρει ένα μήνυμα από μία από τις θύρες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν ταυτόχρονα σε πολλές θύρες, πολύ παρόμοια με το `select`/`poll`/`epoll`/`kqueue` στο Unix.
* **Νεκρό Όνομα**, το οποίο δεν είναι ένα πραγματικό δικαίωμα θύρας, αλλά απλώς ένας αντικαταστάτης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα μετατρέπονται σε νεκρά ονόματα.
**Οι εργασίες μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν, έτσι μια εργασία μπορεί να διπλασιάσει το δικαίωμα και να το δώσει σε μια τρίτη εργασία**. Αυτό, σε συνδυασμό με ένα ενδιάμεσο διεργασία γνωστό ως **διακομιστής εκκίνησης**, επιτρέπει αποτελεσματική επικοινωνία μεταξύ εργασιών.
**Οι εργασίες μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν, έτσι μια εργασία μπορεί να διπλασιάσει και να δώσει το δικαίωμα σε μια τρίτη εργασία**. Αυτό, σε συνδυασμό με ένα ενδιάμεσο διεργασία γνωστό ως **διακομιστής εκκίνησης**, επιτρέπει αποτελεσματική επικοινωνία μεταξύ εργασιών.
### Θύρες Αρχείων
Οι θύρες αρχείων επιτρέπουν την ενθυλάκωση περιγραφέων αρχείων σε θύρες Mac (χρησιμοποιώντας δικαιώματα θύρας Mach). Είναι δυνατόν να δημιουργηθεί ένα `fileport` από έναν δεδομένο FD χρησιμοποιώντας το `fileport_makeport` και να δημιουργηθεί ένα FD από ένα fileport χρησιμοποιώντας το `fileport_makefd`.
### Δημιουργία Επικοινωνίας
### Καθιέρωση επικοινωνίας
Όπως αναφέρθηκε προη
Όπως αναφέρθηκε προηγουμένως, είν
### Ένα Μήνυμα Mach
[Βρείτε περισσότερες πληροφορίες εδώ](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
@ -72,7 +72,7 @@ mach_msg_id_t msgh_id;
Το αρχικό πεδίο **`msgh_bits`** είναι ένα bitmap:
* Το πρώτο bit (πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι πολύπλοκο (περισσότερα παρακάτω)
* Τα 3ο και 4ο χρησιμοποιούνται από τον πυρήνα
* Τα 3ο και 4ο bit χρησιμοποιούνται από τον πυρήνα
* Τα **5 λιγότερο σημαντικά bits του 2ου byte** μπορούν να χρησιμοποιηθούν για **voucher**: έναν άλλο τύπο θύρας για την αποστολή συνδυασμών κλειδιού/τιμής.
* Τα **5 λιγότερο σημαντικά bits του 3ου byte** μπορούν να χρησιμοποιηθούν για **τοπική θύρα**
* Τα **5 λιγότερο σημαντικά bits του 4ου byte** μπορούν να χρησιμοποιηθούν για **απομακρυσμένη θύρα**
@ -115,7 +115,7 @@ mach_msg_id_t msgh_id;
#### Πολύπλοκα Μηνύματα
Ωστόσο, υπάρχουν και άλλα πιο **πολύπλοκα** μηνύματα, όπως αυτά που περνούν επιπλέον δικαιώματα θύρας ή μοιράζονται μνήμη, όπου ο πυρήνας χρειάζεται επίσης να στείλει αυτά τα αντικείμενα στον παραλήπτη. Σε αυτές τις περιπτώσεις, το πιο σημαντικό bit της κεφαλίδας `msgh_bits` ορίζεται.
Ωστόσο, υπάρχουν και άλλα πιο **πολύπλοκα** μηνύματα, όπως αυτά που περνούν επιπλέον δικαιώματα θύρας ή μοιράζονται μνήμη, όπου ο πυρήνας πρέπει επίσης να στείλει αυτά τα αντικείμενα στον παραλήπτη. Σε αυτές τις περιπτώσεις, το πιο σημαντικό bit της κεφαλίδας `msgh_bits` ορίζεται.
Οι πιθανοί περιγραφείς που περνούν ορίζονται στο [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html):
```c
@ -139,12 +139,12 @@ mach_msg_descriptor_type_t type : 8;
{% hint style="danger" %}
Το πυρήνας θα αντιγράψει τις περιγραφές από μια εργασία σε μια άλλη, αλλά πρώτα **δημιουργεί ένα αντίγραφο στη μνήμη του πυρήνα**. Αυτή η τεχνική, γνωστή ως "Feng Shui", έχει καταχραστεί σε αρκετές εκμεταλλεύσεις για να κάνει τον **πυρήνα να αντιγράψει δεδομένα στη μνήμη του** κάνοντας ένα διεργασία να στείλει περιγραφές στον εαυτό της. Στη συνέχεια η διεργασία μπορεί να λάβει τα μηνύματα (ο πυρήνας θα τα απελευθερώσει).
Είναι επίσης δυνατό να **στείλετε δικαιώματα θύρας σε μια ευάλωτη διεργασία**, και τα δικαιώματα θύρας θα εμφανιστούν απλώς στη διεργασία (ακόμα κι αν δεν τα χειρίζεται).
Είναι επίσης δυνατόν να **στείλετε δικαιώματα θύρας σε μια ευάλωτη διεργασία**, και τα δικαιώματα θύρας θα εμφανιστούν απλώς στη διεργασία (ακόμα κι αν δεν τα χειρίζεται).
{% endhint %}
### Προγραμματιστικά Πεδία Mac Ports
Σημειώστε ότι οι θύρες συσχετίζονται με το χώρο ονομάτων της εργασίας, έτσι για τη δημιουργία ή αναζήτηση μιας θύρας, επίσης ερευνάται ο χώρος ονομάτων της εργασίας (περισσότερα στο `mach/mach_port.h`):
Σημειώστε ότι οι θύρες συσχετίζονται με το χώρο ονομάτων της εργασίας, έτσι για τη δημιουργία ή αναζήτηση μιας θύρας, επίσης ερευνάται το χώρο ονομάτων της εργασίας (περισσότερα στο `mach/mach_port.h`):
* **`mach_port_allocate` | `mach_port_construct`**: **Δημιουργία** μιας θύρας.
* Το `mach_port_allocate` μπορεί επίσης να δημιουργήσει ένα **σύνολο θυρών**: δικαίωμα λήψης πάνω από μια ομάδα θυρών. Κάθε φορά που λαμβάνεται ένα μήνυμα, υποδεικνύεται η θύρα από όπου προήλθε.
@ -153,7 +153,7 @@ mach_msg_descriptor_type_t type : 8;
* `mach_port_type`: Λήψη δικαιωμάτων μιας εργασίας πάνω σε ένα όνομα
* `mach_port_rename`: Μετονομασία μιας θύρας (όπως το `dup2` για τα FDs)
* `mach_port_allocate`: Εκχώρηση μιας νέας ΛΗΨΗΣ, ΣΥΝΟΛΟΥΥΡΩΝ ή DEAD_NAME
* `mach_port_insert_right`: Δημιουργία νέου δικαιώματος σε μια θύρα όπου έχετε ΛΗΨΗ
* `mach_port_insert_right`: Δημιουργία ενός νέου δικαιώματος σε μια θύρα όπου έχετε ΛΗΨΗ
* `mach_port_...`
* **`mach_msg`** | **`mach_msg_overwrite`**: Συναρτήσεις που χρησιμοποιούνται για την **αποστολή και λήψη μηνυμάτων mach**. Η έκδοση overwrite επιτρέπει την καθορισμό διαφορετικού buffer για τη λήψη μηνύματος (η άλλη έκδοση θα το επαναχρησιμοποιήσει).
@ -254,11 +254,11 @@ name ipc-object rights flags boost reqs recv send sonce oref q
+ send -------- --- 1 <- 0x00002603 (74295) passd
[...]
```
Το **όνομα** είναι το προεπιλεγμένο όνομα που δίνεται στη θύρα (ελέγξτε πώς **αυξάνεται** στα πρώτα 3 bytes). Το **`ipc-object`** είναι ο **κρυπτογραφημένος** μοναδικός **αναγνωριστικός** της θύρας.\
Το **όνομα** είναι το προεπιλεγμένο όνομα που δίνεται στη θύρα (ελέγξτε πώς **αυξάνεται** στα πρώτα 3 bytes). Το **`ipc-object`** είναι το **κρυπτογραφημένο** μοναδικό **αναγνωριστικό** της θύρας.\
Σημειώστε επίσης πώς οι θύρες με μόνο δικαίωμα **`send`** αναγνωρίζουν τον ιδιοκτήτη τους (όνομα θύρας + pid).\
Επίσης, σημειώστε τη χρήση του **`+`** για να υποδείξετε **άλλες εργασίες που συνδέονται με την ίδια θύρα**.
Σημειώστε επίσης τη χρήση του **`+`** για να υποδείξει **άλλες εργασίες που συνδέονται με την ίδια θύρα**.
Είναι επίσης δυνατόν να χρησιμοποιήσετε το [**procesxp**](https://www.newosxbook.com/tools/procexp.html) για να δείτε επίσης τα **ονόματα εγγεγραμμένων υπηρεσιών** (με απενεργοποιημένο το SIP λόγω της ανάγκης του `com.apple.system-task-port`):
Είναι επίσης δυνατόν να χρησιμοποιήσετε το [**procesxp**](https://www.newosxbook.com/tools/procexp.html) για να δείτε επίσης τα **ονόματα των εγγεγραμμένων υπηρεσιών** (με απενεργοποιημένο το SIP λόγω της ανάγκης του `com.apple.system-task-port`):
```
procesp 1 ports
```
@ -340,35 +340,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
{% tab title="sender.c" %}
### Αποστολέας.c
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key;
int shmid;
char *data;
key = ftok("/tmp", 'a');
shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
data = shmat(shmid, NULL, 0);
strcpy(data, "Hello, shared memory!");
printf("Data sent: %s\n", data);
shmdt(data);
return 0;
}
```
Ο κώδικας του αποστολέα πρέπει να εκτελείται σε ένα macOS σύστημα. Αυτός ο κώδικας χρησιμοποιείται για την αποστολή μηνυμάτων IPC σε διαφορετικές διεργασίες.
{% endtab %}
```c
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
@ -429,13 +401,13 @@ printf("Sent a message\n");
* **Θύρα κεντρικού υπολογιστή**: Αν ένας διεργασία έχει δικαίωμα **Αποστολής** πάνω από αυτήν τη θύρα, μπορεί να λάβει **πληροφορίες** για το **σύστημα** (π.χ. `host_processor_info`).
* **Προνομιούχα θύρα κεντρικού υπολογιστή**: Μια διεργασία με δικαίωμα **Αποστολής** πάνω από αυτήν τη θύρα μπορεί να εκτελέσει **προνομιούχες ενέργειες** όπως φόρτωση επέκτασης πυρήνα. Η **διεργασία πρέπει να είναι ριζική** για να λάβει αυτήν την άδεια.
* Επιπλέον, για να καλέσει το API **`kext_request`** απαιτούνται άλλα δικαιώματα **`com.apple.private.kext*`** τα οποία δίνονται μόνο σε δυαδικά αρχεία της Apple.
* **Θύρα ονόματος εργασίας**: Μια μη προνομιούχα έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχό της. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
* **Θύρα ονόματος εργασίας:** Μια μη προνομιούχα έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχό της. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
* **Θύρα εργασίας** (επίσης γνωστή ως θύρα πυρήνα)**:** Με δικαίωμα Αποστολής πάνω από αυτήν τη θύρα είναι δυνατόν να ελέγχεται η εργασία (ανάγνωση/εγγραφή μνήμης, δημιουργία νημάτων...).
* Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** για αυτήν τη θύρα για την εργασία του καλούντος. Αυτή η θύρα κληρονομείται μόνο κατά τη διάρκεια **`exec()`**· μια νέα εργασία που δημιουργείται με το `fork()` λαμβάνει μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία λαμβάνει επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα δυαδικό suid). Ο μόνος τρόπος να δημιουργηθεί μια εργασία και να ληφθεί η θύρα της είναι να εκτελεστεί ο ["χορός ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) κατά τη διάρκεια ενός `fork()`.
* Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** για αυτήν τη θύρα για την εργασία του καλούντος. Αυτή η θύρα κληρονομείται μόνο κατά τη διάρκεια **`exec()`**· μια νέα εργασία που δημιουργείται με `fork()` λαμβάνει μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία λαμβάνει επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα δυαδικό suid). Ο μόνος τρόπος να δημιουργηθεί μια εργασία και να ληφθεί η θύρα της είναι να εκτελεστεί ο ["χορός ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) κατά τη διάρκεια ενός `fork()`.
* Αυτοί είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το `macos_task_policy` από το δυαδικό `AppleMobileFileIntegrity`):
* Αν η εφαρμογή έχει το δικαίωμα **`com.apple.security.get-task-allow`**, διεργασίες από τον **ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **επικύρωσης** δεν το επιτρέπει σε παραγωγικές εκδόσεις.
* Αν η εφαρμογή έχει το δικαίωμα **`com.apple.security.get-task-allow`**, διεργασίες από τον **ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **επικύρωσης** δεν το επιτρέπει στις παραγωγικές εκδόσεις.
* Οι εφαρμογές με το δικαίωμα **`com.apple.system-task-ports`** μπορούν να λάβουν τη **θύρα εργασίας για οποιαδήποτε** διεργασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
* **Ο ριζικός χρήστης μπορεί να έχει πρόσβαση στις θύρες εργασίας** εφαρμογών που **δεν** έχουν μεταγλωττιστεί με ένα **σκληρυνμένο** χρόνο εκτέλεσης (και όχι από την Apple).
* **Η ρίζα μπορεί να έχει πρόσβαση στις θύρες εργασίας** εφαρμογών που **δεν** έχουν μεταγλωττιστεί με ένα **σκληρυνμένο** χρόνο εκτέλεσης (και όχι από την Apple).
### Εισαγωγή Shellcode σε νήμα μέσω θύρας Εργασίας
@ -475,7 +447,17 @@ return 0;
```
{% endtab %}
{% tab title="entitlements.plist" %}Το αρχείο entitlements.plist περιέχει τις ειδικές άδειες που απαιτούνται από μια εφαρμογή για να έχει πρόσβαση σε συγκεκριμένες λειτουργίες του συστήματος. Αυτό το αρχείο πρέπει να συμπεριλαμβάνεται στο πακέτο εφαρμογής και να είναι υπογεγραμμένο από τον προγραμματιστή για να εγκριθεί από το macOS. Οι ειδικές άδειες μπορούν να περιορίσουν τις δυνατότητες μιας εφαρμογής και να προστατεύσουν το σύστημα από κατάχρηση.{% endtab %}
{% tab title="entitlements.plist" %}
## Αρχείο entitlements.plist
Το αρχείο `entitlements.plist` περιέχει τις ειδικές άδειες που απαιτούνται από μια εφαρμογή για να έχει πρόσβαση σε συγκεκριμένες λειτουργίες του συστήματος. Αυτό το αρχείο καθορίζει τα προνόμια και τις δυνατότητες που έχει μια εφαρμογή κατά την εκτέλεσή της σε ένα macOS σύστημα.
Είναι σημαντικό να διαχειρίζεστε προσεκτικά τις άδειες που παρέχονται σε μια εφαρμογή μέσω του αρχείου `entitlements.plist`, καθώς αυτό μπορεί να επηρεάσει την ασφάλεια και την ιδιωτικότητα του συστήματός σας.
Βεβαιωθείτε ότι οι ειδικές άδειες που παρέχονται είναι αυστηρά απαραίτητες για τη λειτουργία της εφαρμογής και ότι δεν παρέχονται περιττές ή υπερβολικές άδειες που μπορεί να εκμεταλλευτούν κακόβουλες ενέργειες.
{% endtab %}
```xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
@ -488,7 +470,7 @@ return 0;
{% endtab %}
{% endtabs %}
**Συντάξτε** το προηγούμενο πρόγραμμα και προσθέστε τα **δικαιώματα** για να μπορείτε να εισάγετε κώδικα με τον ίδιο χρήστη (αλλιώς θα χρειαστεί να χρησιμοποιήσετε **sudo**).
**Συντάξτε** το προηγούμενο πρόγραμμα και προσθέστε τα **δικαιώματα** για να μπορείτε να εισάγετε κώδικα με τον ίδιο χρήστη (αν όχι, θα χρειαστεί να χρησιμοποιήσετε **sudo**).
<details>
@ -689,7 +671,11 @@ inject(pid);
return 0;
}
```
</details>
</details>
### Επικοινωνία μεταξύ Διεργασιών (IPC) στο macOS
Το macOS χρησιμοποιεί διάφορες μεθόδους IPC για την επικοινωνία μεταξύ διεργασιών. Ορισμένες από αυτές τις μεθόδους μπορεί να χρησιμοποιηθούν για προνομιακή εκτέλεση κώδικα σε μια διεργασία. Είναι σημαντικό να γίνει σωστή διαχείριση των διεργασιϋν IPC για την ενίσχυση της ασφάλειας του συστήματος.
```bash
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
@ -700,9 +686,9 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
Ήταν δυνατό να **διεισδύσουμε ένα απλό shellcode** για να εκτελέσουμε μια εντολή επειδή **δεν χρειαζόταν να λειτουργήσει με συμμορφωμένα posix** apis, μόνο με το Mach. **Πιο πολύπλοκες διεισδύσεις** θα χρειαζόντουσαν το **νήμα** να είναι επίσης **συμμορφωμένο με το posix**.
Συνεπώς, για να **βελτιώσετε το νήμα** θα πρέπει να καλέσει το **`pthread_create_from_mach_thread`** το οποίο θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει το dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι αντί να γράφετε νέο shellcode για να εκτελέσετε διαφορετικές ενέργειες είναι δυνατό να φορτώσετε προσαρμοσμένες βιβλιοθήκες.
Επομένως, για να **βελτιώσετε το νήμα** θα πρέπει να καλέσει το **`pthread_create_from_mach_thread`** το οποίο θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει το dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι αντί να γράφετε νέο shellcode για να εκτελέσετε διαφορετικές ενέργειες είναι δυνατό να φορτώσετε προσαρμοσμένες βιβλιοθήκες.
Μπορείτε να βρείτε **παραδειγματικά dylibs** σε (για παράδειγμα αυτό που δημιουργεί ένα αρχείο καταγραφής και μετά μπορείτε να το ακούσετε):
Μπορείτε να βρείτε **παραδείγματα dylibs** σε (για παράδειγμα αυτό που δημιουργεί ένα αρχείο καταγραφής και μετά μπορείτε να το ακούσετε):
{% content-ref url="../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
@ -982,13 +968,7 @@ fprintf(stderr,"Το Dylib δεν βρέθηκε\n");
}
```
</details>
---
### macOS Inter-Process Communication (IPC)
Inter-Process Communication (IPC) is a mechanism that allows processes to communicate and share data with each other. macOS provides several IPC mechanisms, such as Mach ports, XPC services, and Distributed Objects. Understanding how IPC works in macOS is crucial for analyzing and exploiting vulnerabilities in macOS applications. In this section, we will explore different IPC mechanisms in macOS and discuss how they can be abused for privilege escalation and other malicious purposes.
</details>
```bash
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
./inject <pid-of-mysleep> </path/to/lib.dylib>
@ -1005,7 +985,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
### Βασικές Πληροφορίες
Το XPC, που σημαίνει XNU (το πυρήνας που χρησιμοποιείται από το macOS) Διαδικασία Επικοινωνίας, είναι ένα πλαίσιο για **επικοινωνία μεταξύ διεργασιών** στο macOS και iOS. Το XPC παρέχει ένα μηχανισμό για την πραγματοποίηση **ασύγχρονων κλήσεων μεθόδων με ασφάλεια μεταξύ διαφορετικών διεργασιών** στο σύστημα. Αποτελεί μέρος του παραδείγματος ασφαλείας της Apple, επιτρέποντας την **δημιουργία εφαρμογών με διαχωρισμό προνομίων** όπου κάθε **συστατικό** λειτουργεί με **μόνο τα δικαιώματα που χρειάζεται** για την εκτέλεση της εργασίας του, περιορίζοντας έτσι την πιθανή ζημιά από μια διεργασία που έχει διαρρεύσει.
Το XPC, που σημαίνει XNU (το πυρήνας που χρησιμοποιείται από το macOS) Διαδικασία Επικοινωνίας, είναι ένα πλαίσιο για **επικοινωνία μεταξύ διεργασιών** στο macOS και iOS. Το XPC παρέχει ένα μηχανισμό για την πραγματοποίηση **ασφαλών, ασύγχρονων κλήσεων μεθόδων μεταξύ διαφορετικών διεργασιών** στο σύστημα. Αποτελεί μέρος του παραδείγματος ασφαλείας της Apple, επιτρέποντας την **δημιουργία εφαρμογών με διαχωρισμό προνομίων** όπου κάθε **συστατικό** λειτουργεί με **μόνο τα δικαιώματα που χρειάζεται** για την εκτέλεση της εργασίας του, περιορίζοντας έτσι την πιθανή ζημιά από μια διεργασία που έχει διαρρεύσει.
Για περισσότερες πληροφορίες σχετικά με το πώς αυτή η **επικοινωνία λειτουργεί** και πώς **μπορεί να είναι ευάλωτη** ελέγξτε:
@ -1013,11 +993,11 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
[macos-xpc](macos-xpc/)
{% endcontent-ref %}
## MIG - Παραγωγός Διεπαφής Mach
## MIG - Μετατροπέας Διεπαφής Mach
Το MIG δημιουργήθηκε για να **απλοποιήσει τη διαδικασία δημιουργίας κώδικα Mach IPC**. Αυτό συμβαίνει επειδή πολλή από τη δουλειά για την προγραμματισμό RPC περιλαμβάνει τις ίδιες ενέργειες (συσκευασία ορισμάτων, αποστολή του μηνύματος, αποσυσκευασία των δεδομένων στον εξυπηρετητή...).
Ο MIG δημιουργήθηκε για να **απλοποιήσει τη διαδικασία δημιουργίας κώδικα Mach IPC**. Αυτό συμβαίνει επειδή πολλή από την εργασία για την προγραμματισμό RPC περιλαμβάνει τις ίδιες ενέργειες (συσκευασία ορισμάτων, αποστολή του μηνύματος, αποσυσκευασία των δεδομένων στον εξυπηρετητή...).
Το MIG βασικά **δημιουργεί τον απαιτούμενο κώδικα** για τον εξυπηρετητή και τον πελάτη να επικοινωνούν με μια δεδομένη ορισμένη (στη γλώσσα IDL -Γλώσσα Ορισμού Διεπαφής-). Ακόμα κι αν ο δημιουργημένος κώδικας είναι άσχημος, ένας προγραμματιστής θα χρειαστεί απλώς να τον εισάγει και ο κώδικάς του θα είναι πολύ απλούστερος από πριν.
Ο MIG βασικά **δημιουργεί τον απαιτούμενο κώδικα** για τον εξυπηρετητή και τον πελάτη ώστε να επικοινωνούν με μια δεδομένη ορισμένη (στη γλώσσα IDL -Γλώσσα Ορισμού Διεπαφής-). Ακόμα κι αν ο δημιουργημένος κώδικας είναι ασχημός, ένας προγραμματιστής θα χρειαστεί απλώς να τον εισάγει και ο κώδικάς του θα είναι πολύ απλούστερος από πριν.
Για περισσότερες πληροφορίες ελέγξτε:
@ -1032,17 +1012,4 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
* [https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a](https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a)
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
<details>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι υποστήριξης του HackTricks:
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγράφου**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)

View file

@ -1,33 +1,33 @@
# macOS MIG - Ο Μεταγλωττιστής Διεπαφής Mach
# macOS MIG - Ο Παραγωγός Διεπαφής Mach
<details>
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Μάθετε την χρήση του AWS hacking από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι υποστήριξης του HackTricks:
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα κόλπα σας στο χάκινγκ υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>
## Βασικές Πληροφορίες
Ο MIG δημιουργήθηκε για να **απλοποιήσει τη διαδικασία δημιουργίας κώδικα Mach IPC**. Βασικά **δημιουργεί τον απαιτούμενο κώδικα** για τον εξυπηρετητή και τον πελάτη ώστε να επικοινωνούν με μια δεδομένη ορισμένη λειτουργία. Ακόμα κι αν ο δημιουργημένος κώδικας είναι άσχημος, ένας προγραμματιστής θα χρειαστεί απλά να τον εισάγει και ο κώδικάς του θα είναι πολύ απλούστερος από πριν.
Το MIG δημιουργήθηκε για να **απλοποιήσει τη διαδικασία δημιουργίας κώδικα Mach IPC**. Βασικά **δημιουργεί τον απαιτούμενο κώδικα** για τον εξυπηρετητή και τον πελάτη ώστε να επικοινωνούν με μια δεδομένη ορισμένη λειτουργία. Ακόμα κι αν ο δημιουργημένος κώδικας είναι άσχημος, ένας προγραμματιστής θα χρειαστεί απλώς να τον εισάγει και ο κώδικάς του θα είναι πολύ απλούστερος από πριν.
Η ορισμένη λειτουργία καθορίζεται στη Γλώσσα Ορισμού Διεπαφής (IDL) χρησιμοποιώντας την επέκταση `.defs`.
Αυτές οι ορισμοί έχουν 5 ενότητες:
* **Δήλωση υποσυστήματος**: Η λέξη-κλειδί υποσύστημα χρησιμοποιείται για να υποδείξει το **όνομα** και το **ID**. Είναι επίσης δυνατό να το σημειώσετε ως **`KernelServer`** αν ο εξυπηρετητής πρέπει να εκτελείται στον πυρήνα.
* **Συμπερίληψη και εισαγωγές**: Ο MIG χρησιμοποιεί τον προεπεξεργαστή C, έτσι μπορεί να χρησιμοποιήσει εισαγωγές. Επιπλέον, είναι δυνατό να χρησιμοποιήσετε `uimport` και `simport` για κώδικα που δημιουργείται από χρήστη ή εξυπηρετητή.
* **Δήλωση υποσυστήματος**: Η λέξη-κλειδί υποσύστημα χρησιμοποιείται για να υποδείξει το **όνομα** και το **ID**. Είναι επίσης δυνατό να το σημειώσετε ως **`KernelServer`** αν ο εξυπηρετητής πρέπει να τρέχει στον πυρήνα.
* **Συμπερίληψη και εισαγωγές**: Το MIG χρησιμοποιεί τον προεπεξεργαστή C, έτσι μπορεί να χρησιμοποιήσει εισαγωγές. Επιπλέον, είναι δυνατό να χρησιμοποιήσετε `uimport` και `simport` για κώδικα που δημιουργείται από χρήστη ή εξυπηρετητή.
* **Δηλώσεις τύπων**: Είναι δυνατό να ορίσετε τύπους δεδομένων αν και συνήθως θα εισάγει τα `mach_types.defs` και `std_types.defs`. Για προσαρμοσμένους τύπους μπορεί να χρησιμοποιηθεί κάποια σύνταξη:
* \[i`n/out]tran`: Συνάρτηση που πρέπει να μεταφραστεί από ένα εισερχόμενο ή προς ένα εξερχόμενο μήνυμα
* `c[user/server]type`: Αντιστοίχιση σε άλλον τύπο C.
* `destructor`: Καλέστε αυτήν τη συνάρτηση όταν ο τύπος απελευθερωθεί.
* `destructor`: Καλέστε αυτήν τη συνάρτηση όταν ο τύπος απελευθερώνεται.
* **Λειτουργίες**: Αυτές είναι οι ορισμοί των μεθόδων RPC. Υπάρχουν 5 διαφορετικοί τύποι:
* `routine`: Αναμένει απάντηση
* `simpleroutine`: Δεν αναμένει απάντηση
@ -56,15 +56,20 @@ n2 : uint32_t);
```
{% endcode %}
Σημειώστε ότι το πρώτο **όρισμα είναι τη θύρα προς σύνδεση** και το MIG θα **χειριστεί αυτόματα τη θύρα απάντησης** (εκτός αν καλείτε την `mig_get_reply_port()` στον κώδικα του πελάτη). Επιπλέον, το **ID των λειτουργιών** θα είναι **συνεχόμενο** ξεκινώντας από το ID του υποσυστήματος που υποδεικνύεται (έτσι αν μια λειτουργία είναι αποσυρμένη, διαγράφεται και χρησιμοποιείται το `skip` για να εξακολουθεί να χρησιμοποιείται το ID της).
Σημειώστε ότι το πρώτο **όρισμα είναι τη θύρα προς σύνδεση** και το MIG θα **χειριστεί αυτόματα τη θύρα απάντησης** (εκτός αν καλείτε την `mig_get_reply_port()` στον κώδικα του πελάτη). Επιπλέον, το **ID των λειτουργιών** θα είναι **συνεχόμενο** ξεκινώντας από το ID του υποσυστήματος που υποδεικνύεται (έτσι αν μια λειτουργία είναι αποσυρμένη, διαγράφεται και χρησιμοποιείται το `skip` για να εξακολουθεί να χρησιμοποιεί το ID της).
Τώρα χρησιμοποιήστε το MIG για να δημιουργήσετε τον κώδικα εξυπηρετητή και πελάτη που θα είναι σε θέση να επικοινωνούν μεταξύ τους για να καλέσουν τη λειτουργία Αφαίρεση:
Τώρα χρησιμοποιήστε το MIG για να δημιουργήσετε τον κώδικα εξυπηρετητή και πελάτη που θα μπορούν να επικοινωνούν μεταξύ τους για να καλέσουν τη λειτουργία Αφαίρεση:
```bash
mig -header myipcUser.h -sheader myipcServer.h myipc.defs
```
Θα δημιουργηθούν αρκετά νέα αρχεία στον τρέχοντα κατάλογο.
Στα αρχεία **`myipcServer.c`** και **`myipcServer.h`** μπορείτε να βρείτε τη δήλωση και τον ορισμό της δομής **`SERVERPREFmyipc_subsystem`**, η οποία ουσιαστικά ορίζει τη λειτουργία που θα κληθεί με βάση το αναγνωριστικό μηνύματος που λαμβάνεται (καθορίσαμε έναν αρχικό αριθμό 500):
{% hint style="success" %}
Μπορείτε να βρείτε ένα πιο πολύπλοκο παράδειγμα στο σύστημά σας με: `mdfind mach_port.defs`\
Και μπορείτε να το μεταγλωτίσετε από τον ίδιο φάκελο με: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs`
{% endhint %}
Στα αρχεία **`myipcServer.c`** και **`myipcServer.h`** μπορείτε να βρείτε τη δήλωση και τον ορισμό της δομής **`SERVERPREFmyipc_subsystem`**, η οποία ουσιαστικά ορίζει τη λειτουργία που θα κληθεί με βάση το αναγνωριστικό μηνύματος που λαμβάνεται (καθορίσαμε έναν αριθμό εκκίνησης των 500):
{% tabs %}
{% tab title="myipcServer.c" %}
@ -85,7 +90,7 @@ myipc_server_routine,
```
{% endtab %}
{% tab title="myipcServer.h" %}Ορισμός των συναρτήσεων που υλοποιούνται από τον server για την εξυπηρέτηση των αιτημάτων IPC.{% endtab %}
{% tab title="myipcServer.h" %}Ορισμός των συναρτήσεων που υλοποιούνται από τον server. Κάθε συνάρτηση αντιστοιχεί σε ένα MIG request. Ορίζει τις συναρτήσεις που καλούνται κατά την εκτέλεση των αιτημάτων από τον client. Περιέχει τις υπογραφές των συναρτήσεων που πρέπει να υλοποιηθούν από τον server. %}
```c
/* Description of this subsystem, for use in direct RPC */
extern const struct SERVERPREFmyipc_subsystem {
@ -118,14 +123,16 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
```
Σε αυτό το παράδειγμα έχουμε ορίσει μόνο 1 λειτουργία στις ορισμούς, αλλά αν είχαμε ορίσει περισσότερες λειτουργίες, θα βρίσκονταν μέσα στον πίνακα του **`SERVERPREFmyipc_subsystem`** και η πρώτη θα είχε ανατεθεί στο ID **500**, η δεύτερη στο ID **501**...
Πράγματι, είναι δυνατό να αναγνωριστεί αυτή η σχέση στη δομή **`subsystem_to_name_map_myipc`** από το **`myipcServer.h`**:
Αν η λειτουργία αναμενόταν να στείλει μια **απάντηση**, θα υπήρχε επίσης η λειτουργία `mig_internal kern_return_t __MIG_check__Reply__<όνομα>`.
Πράγματι, είναι δυνατό να αναγνωριστεί αυτή η σχέση στη δομή **`subsystem_to_name_map_myipc`** από το **`myipcServer.h`** (**`subsystem_to_name_map_***`** σε άλλα αρχεία):
```c
#ifndef subsystem_to_name_map_myipc
#define subsystem_to_name_map_myipc \
{ "Subtract", 500 }
#endif
```
Τέλος, μια άλλη σημαντική λειτουργία για τη λειτουργία του διακομιστή θα είναι η **`myipc_server`**, η οποία είναι αυτή που θα καλέσει πραγματικά τη συνάρτηση που σχετίζεται με το ληφθέν αναγνωριστικό:
Τέλος, μια άλλη σημαντική λειτουργία για τη λειτουργία του διακομιστή θα είναι η **`myipc_server`**, η οποία είναι αυτή που θα καλέσει πραγματικά τη σχετική **συνάρτηση** που σχετίζεται με το ληφθέν αναγνωριστικό:
<pre class="language-c"><code class="lang-c">mig_external boolean_t myipc_server
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
@ -159,9 +166,9 @@ return FALSE;
}
</code></pre>
Ελέγξτε τις προηγουμένως επισημασμένες γραμμές πρόσβασης στη συνάρτηση που θα κληθεί με βάση το αναγνωριστικό.
Ελέγξτε τις προηγουμένως επισημασμένες γραμμές προσπελαίνοντας τη συνάρτηση που θα κληθεί με βάση το αναγνωριστικό.
Παρακάτω είναι ο κώδικας για τη δημιουργία ενός απλού **διακομιστή** και **πελάτη** όπου ο πελάτης μπορεί να καλέσει τις λειτουργίες Subtract από το διακομιστή:
Το παρακάτω είναι ο κώδικας για τη δημιουργία ενός απλού **διακομιστή** και **πελάτη** όπου ο πελάτης μπορεί να καλέσει τις λειτουργίες Subtract από το διακομιστή:
{% tabs %}
{% tab title="myipc_server.c" %}
@ -197,7 +204,7 @@ mach_msg_server(myipc_server, sizeof(union __RequestUnion__SERVERPREFmyipc_subsy
```
{% endtab %}
{% tab title="myipc_client.c" %}Το αρχείο `myipc_client.c` περιέχει τον κώδικα για τον πελάτη IPC που χρησιμοποιείται για την επικοινωνία με τον εξυπηρετητή IPC σε ένα σύστημα macOS. Ο κώδικας αυτός χρησιμοποιείται για την αλληλεπίδραση μεταξύ διεργασιών χρησιμοποιώντας το MIG (Mach Interface Generator) στο macOS. Η διεπαφή αυτή επιτρέπει την αποστολή μηνυμάτων και την ανταλλαγή δεδομένων μεταξύ διαφορετικών διεργασιών στο σύστημα. Ο κώδικας αυτός μπορεί να χρησιμοποιηθεί για προσωρινή αύξηση των δικαιωμάτων ή για εκμετάλλευση ευπάθειας στο σύστημα macOS. {% endtab %}
{% tab title="myipc_client.c" %}Ο πελάτης IPC είναι υπεύθυνος για την επικοινωνία με τον εξυπηρετητή IPC και την ανταλλαγή δεδομένων μαζί του. Ο πελάτης χρησιμοποιεί τις συναρτήσεις που δημιουργήθηκαν από το MIG για να αποστείλει αιτήματα στον εξυπηρετητή και να λάβει απαντήσεις. Ο πελάτης πρέπει να είναι προσεκτικός με τα δεδομένα που αποστέλλονται και να ελέγχει την εγκυρότητά τους προκειμένου να αποφευχθεί η κατάχρηση διεργασιϋών. %}
```c
// gcc myipc_client.c myipcUser.c -o myipc_client
@ -225,22 +232,40 @@ USERPREFSubtract(port, 40, 2);
{% endtab %}
{% endtabs %}
### Ανάλυση Δυαδικών Αρχείων
### Το NDR\_record
Καθώς πολλά δυαδικά αρχεία χρησιμοποιούν πλέον το MIG για να αποκαλύπτουν mach ports, είναι ενδιαφέρον να γνωρίζουμε πώς να **αναγνωρίζουμε ότι χρησιμοποιήθηκε το MIG** και τις **λειτουργίες που εκτελεί το MIG** με κάθε αναγνωριστικό μηνύματος (message ID).
Το NDR\_record εξάγεται από το `libsystem_kernel.dylib`, και είναι ένας δομικός τύπος που επιτρέπει στο MIG να **μετασχηματίζει τα δεδομένα ώστε να είναι ανεξάρτητα από το σύστημα** στο οποίο χρησιμοποιείται, καθώς το MIG σχεδιάστηκε να χρησιμοποιείται μεταξύ διαφορετικών συστημάτων (και όχι μόνο στον ίδιο υπολογιστή).
Το [**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) μπορεί να αναλύει πληροφορίες MIG από ένα δυαδικό αρχείο Mach-O, ενδεικτικά του αναγνωριστικού μηνύματος (message ID) και της αναγνώρισης της λειτουργίας προς εκτέλεση:
Αυτό είναι ενδιαφέρον επειδή αν το `_NDR_record` βρεθεί σε ένα δυαδικό ως εξάρτηση (`jtool2 -S <binary> | grep NDR` ή `nm`), σημαίνει ότι το δυαδικό είναι ένας πελάτης ή Διακομιστής MIG.
Επιπλέον, **οι Διακομιστές MIG** έχουν τον πίνακα αποστολής στο `__DATA.__const` (ή στο `__CONST.__constdata` στον πυρήνα macOS και `__DATA_CONST.__const` σε άλλους πυρήνες \*OS). Αυτό μπορεί να ανακτηθεί με το **`jtool2`**.
Και **οι πελάτες MIG** θα χρησιμοποιήσουν το `__NDR_record` για να στείλουν με το `__mach_msg` στους διακομιστές.
## Ανάλυση Δυαδικού
### jtool
Καθώς πολλά δυαδικά χρησιμοποιούν πλέον το MIG για να εκθέτουν mach ports, είναι ενδιαφέρον να γνωρίζουμε πώς να **αναγνωρίσουμε ότι χρησιμοποιήθηκε το MIG** και τις **λειτουργίες που εκτελεί το MIG** με κάθε αναγνωριστικό μηνύματος.
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) μπορεί να αναλύσει πληροφορίες MIG από ένα δυαδικό Mach-O, ενδεικτικά το αναγνωριστικό μηνύματος και την αναγνώριση της λειτουργίας προς εκτέλεση:
```bash
jtool2 -d __DATA.__const myipc_server | grep MIG
```
Ήταν προηγουμένως αναφερόμενο ότι η λειτουργία που θα αναλάβει το **να καλέσει τη σωστή λειτουργία ανάλογα με το αναγνωριστικό μηνύματος που λαμβάνεται** ήταν η `myipc_server`. Ωστόσο, συνήθως δεν θα έχετε τα σύμβολα του δυαδικού (καμία ονομασία λειτουργιών), επομένως είναι ενδιαφέρον να **ελέγξετε πώς φαίνεται αποσυναρμολογημένο** καθώς θα είναι πάντα πολύ παρόμοιο (ο κώδικας αυτής της λειτουργίας είναι ανεξάρτητος από τις εκτεθειμένες λειτουργίες):
Επιπλέον, οι λειτουργίες MIG είναι απλά περιτύλιγμα της πραγματικής λειτουργίας που καλείται, πράγμα που σημαίνει ότι με την ανάλυση του κώδικα και την αναζήτηση για BL ενδέχεται να εντοπίσετε την πραγματική λειτουργία που καλείται:
```bash
jtool2 -d __DATA.__const myipc_server | grep BL
```
### Συναρτήσεις
Προηγουμένως αναφέρθηκε ότι η συνάρτηση που θα αναλάβει το **να καλέσει τη σωστή συνάρτηση ανάλογα με το αναγνωριστικό μηνύματος που λαμβάνεται** ήταν η `myipc_server`. Ωστόσο, συνήθως δεν θα έχετε τα σύμβολα του δυαδικού (καμία ονομασία συναρτήσεων), επομένως είναι ενδιαφέρον να **ελέγξετε πώς μοιάζει αποσυναρμολογημένο** καθώς θα είναι πάντα πολύ παρόμοιο (ο κώδικας αυτής της συνάρτησης είναι ανεξάρτητος από τις εκτεθειμένες συναρτήσεις):
{% tabs %}
{% tab title="myipc_server αποσυναρμολογημένο 1" %}
{% tab title="Αποσυναρμολογημένο myipc_server 1" %}
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
var_10 = arg0;
var_18 = arg1;
// Αρχικές οδηγίες για την εύρεση των κατάλληλων δεικτών λειτουργιών
// Αρχικές οδηγίες για την εύρεση των κατάλληλων δεικτών συναρτήσεων
*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
@ -249,20 +274,20 @@ var_18 = arg1;
*(int32_t *)(var_18 + 0x10) = 0x0;
if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
rax = *(int32_t *)(var_10 + 0x14);
// Κλήση της sign_extend_64 που μπορεί να βοηθήσει στον εντοπισμό αυτής της λειτουργίας
// Κλήση της sign_extend_64 που μπορεί να βοηθήσει στον εντοπισμό αυτής της συνάρτησης
// Αυτό αποθηκεύει στο rax τον δείκτη προς την κλήση που πρέπει να γίνει
// Ελέγξτε τη χρήση της διεύθυνσης 0x100004040 (πίνακας διευθύνσεων λειτουργιών)
// 0x1f4 = 500 (το αρχικό ID)
// Ελέγξτε τη χρήση της διεύθυνσης 0x100004040 (πίνακας διευθύνσεων συναρτήσεων)
// 0x1f4 = 500 (η αρχική ID)
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
</strong> var_20 = rax;
// Αν - αλλιώς, το if επιστρέφει false, ενώ το else καλεί τη σωστή λειτουργία και επιστρέφει true
// Αν - αλλιώς, το if επιστρέφει false, ενώ το else καλεί τη σωστή συνάρτηση και επιστρέφει true
<strong> if (rax == 0x0) {
</strong> *(var_18 + 0x18) = **_NDR_record;
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
var_4 = 0x0;
}
else {
// Υπολογισμένη διεύθυνση που καλεί τη σωστή λειτουργία με 2 ορίσματα
// Υπολογισμένη διεύθυνση που καλεί τη σωστή συνάρτηση με 2 ορίσματα
<strong> (var_20)(var_10, var_18);
</strong> var_4 = 0x1;
}
@ -278,8 +303,8 @@ return rax;
</code></pre>
{% endtab %}
{% tab title="myipc_server αποσυναρμολογημένο 2" %}
Αυτή είναι η ίδια λειτουργία αποσυναρμολογημένη σε μια διαφορετική έκδοση του Hopper free:
{% tab title="Αποσυναρμολογημένο myipc_server 2" %}
Αυτή είναι η ίδια συνάρτηση αποσυναρμολογημένη σε μια διαφορετική έκδοση του Hopper free:
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
r31 = r31 - 0x40;
@ -287,7 +312,7 @@ saved_fp = r29;
stack[-8] = r30;
var_10 = arg0;
var_18 = arg1;
// Αρχικές οδηγίες για την εύρεση των κατάλληλων δεικτών λειτουργιών
// Αρχικές οδηγίες για την εύρεση των κατάλληλων δεικτών συναρτήσεων
*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f | 0x0;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
@ -311,7 +336,7 @@ r8 = 0x1;
}
if ((r8 & 0x1) == 0x0) {
r8 = *(int32_t *)(var_10 + 0x14);
// 0x1f4 = 500 (το αρχικό ID)
// 0x1f4 = 500 (η αρχική ID)
<strong> r8 = r8 - 0x1f4;
</strong> asm { smaddl x8, w8, w9, x10 };
r8 = *(r8 + 0x8);
@ -323,14 +348,14 @@ r8 = 0x1;
}
}
// Ίδιο if else με την προηγούμενη έκδοση
// Ελέγξτε τη χρήση της διεύθυνσης 0x100004040 (πίνακας διευθύνσεων λειτουργιών)
// Ελέγξτε τη χρήση της διεύθυνσης 0x100004040 (πίνακας διευθύνσεων συναρτήσεων)
<strong> if ((r8 & 0x1) == 0x0) {
</strong><strong> *(var_18 + 0x18) = **0x100004000;
</strong> *(int32_t *)(var_18 + 0x20) = 0xfffffed1;
var_4 = 0x0;
}
else {
// Κλήση στην υπολογισμένη διεύθυνση όπου θα πρέπει να εκτελεστεί η λειτουργία
// Κλήση στην υπολογισμένη διεύθυνση όπου πρέπει να γίνει η κλήση της συνάρτησης
<strong> (var_20)(var_10, var_18);
</strong> var_4 = 0x1;
}
@ -354,13 +379,17 @@ return r0;
{% endtab %}
{% endtabs %}
Πράγματι, αν πάτε στη λειτουργία **`0x100004000`** θα βρείτε τον πίνακα των δομών **`routine_descriptor`**. Το πρώτο στοιχείο της δομής είναι η **διεύθυνση** όπου η **λειτουργία** υλοποιείται, και η **δομή παίρνει 0x28 bytes**, οπότε κάθε 0x28 bytes (ξεκινώντας από το byte 0) μπορείτε να πάρετε 8 bytes και αυτό θα είναι η **διεύθυνση της λειτουργίας** που θα κληθεί:
Πράγματι, αν πάτε στη συνάρτηση **`0x100004000`** θα βρείτε τον πίνακα των δομών **`routine_descriptor`**. Το πρώτο στοιχείο της δομής είναι η **διεύθυνση** όπου η **συνάρτηση** υλοποιείται, και η **δομή παίρνει 0x28 bytes**, οπότε κάθε 0x28 bytes (ξεκινώντας από το byte 0) μπορείτε να πάρετε 8 bytes και αυτό θα είναι η **διεύθυνση της συνάρτησης** που θα κληθεί:
<figure><img src="../../../../.gitbook/assets/image (35).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../.gitbook/assets/image (36).png" alt=""><figcaption></figcaption></figure>
Αυτά τα δεδομένα μπορούν να εξαχθούν [**χρησιμοποιώντας αυτό το σενάριο Hopper**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py).
* **Μοιραστείτε τα κόλπα σας στο χάκινγκ υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
### Αποσφαλμάτωση
</details>
Ο κώδικας που δημιουργείται από το MIG καλεί επίσης το `kernel_debug` για τη δημιουργία καταγραφών σχετικά με τις λειτουργίες κατά την είσοδο και έξοδο. Είναι δυνατόν να τις ελέγξετε χρησιμοποιώντας **`trace`** ή **`kdv`**: `kdv all | grep MIG`
## Αναφορές
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)