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

This commit is contained in:
Translator 2024-03-28 17:34:45 +00:00
parent 2716c994f9
commit 2cdc1e1d97
3 changed files with 208 additions and 206 deletions

View file

@ -2,72 +2,76 @@
<details>
<summary><strong>Impara l'hacking di AWS da zero a esperto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Se desideri vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione esclusiva di [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
</details>
## Mach messaging tramite porte
## Messaggistica Mach tramite Porte
### Informazioni di base
### Informazioni di Base
Mach utilizza **task** come **unità più piccola** per la condivisione delle risorse, e ogni task può contenere **più thread**. Questi **task e thread sono mappati 1:1 su processi e thread POSIX**.
Mach utilizza **task** come **unità più piccola** per la condivisione di risorse, e ogni task può contenere **più thread**. Questi **task e thread sono mappati 1:1 ai processi e ai thread POSIX**.
La comunicazione tra i task avviene tramite la Comunicazione tra Processi Mach (IPC), utilizzando canali di comunicazione unidirezionali. **I messaggi vengono trasferiti tra le porte**, che agiscono come **code di messaggi** gestite dal kernel.
Ogni processo ha una **tabella IPC**, in cui è possibile trovare le **porte Mach del processo**. Il nome di una porta Mach è in realtà un numero (un puntatore all'oggetto del kernel).
Ogni processo ha una **tabella IPC**, dove è possibile trovare le **porte mach del processo**. Il nome di una porta mach è in realtà un numero (un puntatore all'oggetto del kernel).
Un processo può anche inviare un nome di porta con alcuni diritti **a un task diverso** e il kernel farà apparire questa voce nella **tabella IPC dell'altro task**.
### Diritti di porta
### Diritti delle Porte
I diritti di porta, che definiscono le operazioni che un task può eseguire, sono fondamentali per questa comunicazione. I possibili **diritti di porta** sono ([definizioni da qui](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
I diritti delle porte, che definiscono le operazioni che un task può eseguire, sono fondamentali per questa comunicazione. I possibili **diritti delle porte** sono ([definizioni da qui](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
* **Diritto di ricezione**, che consente di ricevere messaggi inviati alla porta. Le porte Mach sono code MPSC (multiple-producer, single-consumer), il che significa che può esserci **solo un diritto di ricezione per ogni porta** in tutto il sistema (a differenza delle pipe, in cui più processi possono tutti detenere descrittori di file per l'estremità di lettura di una pipe).
* Un **task con il diritto di ricezione** può ricevere messaggi e **creare diritti di invio**, consentendo di inviare messaggi. Originariamente solo il **proprio task ha il diritto di ricezione sulla sua porta**.
* **Diritto di ricezione**, che consente di ricevere messaggi inviati alla porta. Le porte Mach sono code MPSC (multiple-producer, single-consumer), il che significa che può esserci solo **un diritto di ricezione per ogni porta** in tutto il sistema (a differenza delle pipe, dove più processi possono tutti detenere descrittori di file per l'estremità di lettura di una pipe).
* Un **task con il diritto di ricezione** può ricevere messaggi e **creare diritti di invio**, consentendogli di inviare messaggi. Originariamente solo il **proprio task ha il diritto di ricezione sulla sua porta**.
* **Diritto di invio**, che consente di inviare messaggi alla porta.
* Il diritto di invio può essere **clonato** in modo che un task che possiede un diritto di invio possa clonare il diritto e **concederlo a un terzo task**.
* **Diritto di invio una volta**, che consente di inviare un solo messaggio alla porta e poi scompare.
* **Diritto di insieme di porte**, che indica un _insieme di porte_ anziché una singola porta. Estrarre un messaggio da un insieme di porte estrae un messaggio da una delle porte che contiene. Gli insiemi di porte possono essere utilizzati per ascoltare su più porte contemporaneamente, molto simili a `select`/`poll`/`epoll`/`kqueue` in Unix.
* **Nome morto**, che non è un vero e proprio diritto di porta, ma solo un segnaposto. Quando una porta viene distrutta, tutti i diritti di porta esistenti per la porta diventano nomi morti.
* **Diritto di invio una sola volta**, che consente di inviare un messaggio alla porta e poi scompare.
* **Diritto di insieme di porte**, che indica un _insieme di porte_ anziché una singola porta. Estrarre un messaggio da un insieme di porte estrae un messaggio da una delle porte che contiene. Gli insiemi di porte possono essere utilizzati per ascoltare su più porte contemporaneamente, molto simile a `select`/`poll`/`epoll`/`kqueue` in Unix.
* **Nome morto**, che non è effettivamente un diritto di porta, ma solo un segnaposto. Quando una porta viene distrutta, tutti i diritti di porta esistenti alla porta diventano nomi morti.
**I task possono trasferire diritti di INVIO ad altri**, consentendo loro di inviare messaggi indietro. **I diritti di INVIO possono anche essere clonati, quindi un task può duplicare e dare il diritto a un terzo task**. Questo, combinato con un processo intermedio noto come **bootstrap server**, consente una comunicazione efficace tra i task.
**I task possono trasferire i diritti di INVIO ad altri**, consentendo loro di inviare messaggi indietro. **I diritti di INVIO possono anche essere clonati, quindi un task può duplicare e dare il diritto a un terzo task**. Questo, combinato con un processo intermedio noto come **bootstrap server**, consente una comunicazione efficace tra i task.
### Porte File
Le porte file consentono di incapsulare i descrittori di file in porte Mac (utilizzando i diritti delle porte Mach). È possibile creare un `fileport` da un determinato FD utilizzando `fileport_makeport` e creare un FD da un fileport utilizzando `fileport_makefd`.
### Stabilire una comunicazione
#### Passaggi:
Come accennato, per stabilire il canale di comunicazione, è coinvolto il **bootstrap server** (**launchd** in mac).
Come già menzionato, per stabilire il canale di comunicazione è coinvolto il **bootstrap server** (**launchd** in mac).
1. Il task **A** inizia una **nuova porta**, ottenendo un **diritto di ricezione** nel processo.
2. Il task **A**, essendo il detentore del diritto di ricezione, **genera un diritto di invio per la porta**.
3. Il task **A** stabilisce una **connessione** con il **bootstrap server**, fornendo il **nome del servizio della porta** e il **diritto di invio** tramite una procedura nota come registrazione bootstrap.
4. Il task **B** interagisce con il **bootstrap server** per eseguire una **ricerca bootstrap per il servizio**. Se ha successo, il **server duplica il diritto di invio** ricevuto dal Task A e lo **trasmette al Task B**.
5. Una volta acquisito un diritto di invio, il task **B** è in grado di **formulare** un **messaggio** e inviarlo **al task A**.
6. Per una comunicazione bidirezionale di solito il task **B** genera una nuova porta con un **diritto di ricezione** e un **diritto di invio**, e dà il **diritto di invio al task A** in modo che possa inviare messaggi a TASK B (comunicazione bidirezionale).
1. Il Task **A** inizia una **nuova porta**, ottenendo un **diritto di ricezione** nel processo.
2. Il Task **A**, essendo il detentore del diritto di ricezione, **genera un diritto di invio per la porta**.
3. Il Task **A** stabilisce una **connessione** con il **bootstrap server**, fornendo il **nome del servizio della porta** e il **diritto di invio** attraverso una procedura nota come registrazione bootstrap.
4. Il Task **B** interagisce con il **bootstrap server** per eseguire una **ricerca bootstrap per il nome del servizio**. Se riuscito, il **server duplica il diritto di invio** ricevuto dal Task A e lo **trasmette al Task B**.
5. Una volta acquisito un diritto di invio, il Task **B** è in grado di **formulare** un **messaggio** e inviarlo **al Task A**.
6. Per una comunicazione bidirezionale di solito il Task **B** genera una nuova porta con un **diritto di ricezione** e un **diritto di invio**, e dà il **diritto di invio al Task A** in modo che possa inviare messaggi al TASK B (comunicazione bidirezionale).
Il bootstrap server **non può autenticare** il nome del servizio reclamato da un task. Ciò significa che un **task** potrebbe potenzialmente **fingere di essere qualsiasi task di sistema**, ad esempio reclamando falsamente un nome di servizio di autorizzazione e quindi approvando ogni richiesta.
Il bootstrap server **non può autenticare** il nome del servizio reclamato da un task. Ciò significa che un **task** potrebbe potenzialmente **fingere di essere qualsiasi task di sistema**, come reclamare falsamente un nome di servizio di autorizzazione e quindi approvare ogni richiesta.
Successivamente, Apple memorizza i **nomi dei servizi forniti dal sistema** in file di configurazione sicuri, situati in directory protette da SIP: `/System/Library/LaunchDaemons` e `/System/Library/LaunchAgents`. Accanto a ciascun nome di servizio, viene anche memorizzato il **binario associato**. Il bootstrap server creerà e conserverà un **diritto di ricezione per ciascuno di questi nomi di servizio**.
Successivamente, Apple memorizza i **nomi dei servizi forniti dal sistema** in file di configurazione sicuri, situati in directory protette da SIP: `/System/Library/LaunchDaemons` e `/System/Library/LaunchAgents`. Accanto a ciascun nome di servizio, è anche memorizzato il **binario associato**. Il bootstrap server, creerà e manterrà un **diritto di ricezione per ciascuno di questi nomi di servizio**.
Per questi servizi predefiniti, il **processo di ricerca differisce leggermente**. Quando viene cercato un nome di servizio, launchd avvia il servizio in modo dinamico. Il nuovo flusso di lavoro è il seguente:
Per questi servizi predefiniti, il **processo di ricerca differisce leggermente**. Quando viene cercato un nome di servizio, launchd avvia il servizio dinamicamente. Il nuovo flusso di lavoro è il seguente:
* Il task **B** inizia una **ricerca bootstrap** per un nome di servizio.
* **launchd** controlla se il task è in esecuzione e, se non lo è, lo **avvia**.
* Il task **A** (il servizio) esegue un **check-in bootstrap**. Qui, il **bootstrap** server crea un diritto di invio, lo trattiene e **trasferisce il diritto di ricezione al task A**.
* launchd duplica il **diritto di invio e lo invia al task B**.
* Il task **B** genera una nuova porta con un **diritto di ricezione** e un **diritto di invio**, e dà il **diritto di invio al task A** (il svc) in modo che possa inviare messaggi a TASK B (comunicazione bidirezionale).
* Il Task **B** inizia una **ricerca bootstrap** per un nome di servizio.
* **launchd** controlla se il task è in esecuzione e se non lo è, lo **avvia**.
* Il Task **A** (il servizio) esegue un **check-in bootstrap**. Qui, il **bootstrap** server crea un diritto di invio, lo mantiene e **trasferisce il diritto di ricezione al Task A**.
* launchd duplica il **diritto di invio e lo invia al Task B**.
* Il Task **B** genera una nuova porta con un **diritto di ricezione** e un **diritto di invio**, e dà il **diritto di invio al Task A** (il svc) in modo che possa inviare messaggi al TASK B (comunicazione bidirezionale).
Tuttavia, questo processo si applica solo ai task di sistema predefiniti. I task non di sistema continuano a funzionare come descritto originariamente, il che potrebbe potenzialmente consentire l'usurpazione di identità.
Tuttavia, questo processo si applica solo ai task di sistema predefiniti. I task non di sistema continuano a operare come descritto originariamente, il che potrebbe potenzialmente consentire l'usurpazione.
### Un messaggio Mach
### Un Messaggio Mach
[Trova ulteriori informazioni qui](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
@ -82,26 +86,26 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
I processi che possiedono un _**diritto di ricezione**_ possono ricevere messaggi su una porta Mach. Al contrario, i **mittenti** ottengono un _**diritto di invio**_ o un _**diritto di invio una volta**_. Il diritto di invio una volta è esclusivamente per l'invio di un singolo messaggio, dopo il quale diventa invalido.
I processi che possiedono un _**diritto di ricezione**_ possono ricevere messaggi su una porta Mach. Al contrario, i **mittenti** ottengono un _**diritto di invio**_ o un _**diritto di invio una volta sola**_. Il diritto di invio una volta sola è esclusivamente per l'invio di un singolo messaggio, dopodiché diventa non valido.
Per ottenere una **comunicazione bidirezionale** semplice, un processo può specificare una **porta Mach** nell'**intestazione del messaggio Mach** chiamata _porta di risposta_ (**`msgh_local_port`**) dove il **ricevitore** del messaggio può **inviare una risposta** a questo messaggio. I bitflag in **`msgh_bits`** possono essere utilizzati per **indicare** che un **diritto di invio una volta** dovrebbe essere derivato e trasferito per questa porta (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
Per ottenere una **comunicazione bidirezionale** semplice, un processo può specificare una **porta mach** nell'**intestazione del messaggio** mach chiamata _porta di risposta_ (**`msgh_local_port`**) dove il **ricevitore** del messaggio può **inviare una risposta** a questo messaggio. I bitflag in **`msgh_bits`** possono essere utilizzati per **indicare** che un **diritto di invio una volta sola** dovrebbe essere derivato e trasferito per questa porta (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
{% hint style="success" %}
Si noti che questo tipo di comunicazione bidirezionale viene utilizzato nei messaggi XPC che si aspettano una risposta (`xpc_connection_send_message_with_reply` e `xpc_connection_send_message_with_reply_sync`). Ma **di solito vengono creati porti diversi** come spiegato in precedenza per creare la comunicazione bidirezionale.
Nota che questo tipo di comunicazione bidirezionale è utilizzato nei messaggi XPC che si aspettano una risposta (`xpc_connection_send_message_with_reply` e `xpc_connection_send_message_with_reply_sync`). Ma **di solito vengono creati porti diversi** come spiegato in precedenza per creare la comunicazione bidirezionale.
{% endhint %}
Gli altri campi dell'intestazione del messaggio sono:
* `msgh_size`: la dimensione dell'intero pacchetto.
* `msgh_remote_port`: la porta su cui viene inviato questo messaggio.
* `msgh_voucher_port`: [buoni Mach](https://robert.sesek.com/2023/6/mach\_vouchers.html).
* `msgh_id`: l'ID di questo messaggio, che viene interpretato dal ricevitore.
- `msgh_size`: la dimensione dell'intero pacchetto.
- `msgh_remote_port`: la porta su cui viene inviato questo messaggio.
- `msgh_voucher_port`: [voucher mach](https://robert.sesek.com/2023/6/mach\_vouchers.html).
- `msgh_id`: l'ID di questo messaggio, interpretato dal ricevitore.
{% hint style="danger" %}
Si noti che i **messaggi Mach vengono inviati su una **_**porta Mach**_, che è un canale di comunicazione **singolo ricevitore**, **multiplo mittente** incorporato nel kernel Mach. **Più processi** possono **inviare messaggi** a una porta Mach, ma in ogni momento solo **un singolo processo può leggere** da essa.
Nota che i **messaggi mach vengono inviati su una \_porta mach**\_, che è un canale di comunicazione **singolo ricevitore**, **multiplo mittente** integrato nel kernel mach. **Diversi processi** possono **inviare messaggi** a una porta mach, ma in qualsiasi momento solo **un singolo processo può leggere** da essa.
{% endhint %}
### Enumerare le porte
### Elencazione delle porte
```bash
lsmp -p <pid>
```
@ -109,7 +113,7 @@ Puoi installare questo strumento su iOS scaricandolo da [http://newosxbook.com/t
### Esempio di codice
Nota come il **mittente** **alloca** una porta, crea un **diritto di invio** per il nome `org.darlinghq.example` e lo invia al **bootstrap server** mentre il mittente richiede il **diritto di invio** di quel nome e lo usa per **inviare un messaggio**.
Nota come il **mittente** **alloca** una porta, crea un **diritto di invio** per il nome `org.darlinghq.example` e lo invia al **server di avvio** mentre il mittente ha richiesto il **diritto di invio** di quel nome e lo ha usato per **inviare un messaggio**.
{% tabs %}
{% tab title="receiver.c" %}
@ -178,43 +182,9 @@ message.some_text[9] = 0;
printf("Text: %s, number: %d\n", message.some_text, message.some_number);
}
```
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mach/mach.h>
#define BUFFER_SIZE 100
int main(int argc, char** argv) {
mach_port_t server_port;
kern_return_t kr;
char buffer[BUFFER_SIZE];
// Create a send right to the bootstrap port
kr = bootstrap_look_up(bootstrap_port, "com.apple.securityd", &server_port);
if (kr != KERN_SUCCESS) {
printf("Failed to look up the securityd service: %s\n", mach_error_string(kr));
return 1;
}
// Send a message to the securityd service
strcpy(buffer, "Hello, securityd!");
kr = mach_msg((mach_msg_header_t*)&buffer, MACH_SEND_MSG, sizeof(buffer), 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
if (kr != KERN_SUCCESS) {
printf("Failed to send message to securityd: %s\n", mach_error_string(kr));
return 1;
}
printf("Message sent to securityd\n");
return 0;
}
```
{% endtab %}
{% tab title="receiver.c" %}
{% tab title="sender.c" %}
```c
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
// gcc sender.c -o sender
@ -271,27 +241,24 @@ printf("Sent a message\n");
### Porte privilegiate
* **Porta host**: se un processo ha il **privilegio di invio** su questa porta, può ottenere **informazioni** sul **sistema** (ad esempio, `host_processor_info`).
* **Porta host priv**: un processo con il **diritto di invio** su questa porta può eseguire **azioni privilegiate** come caricare un'estensione del kernel. Il **processo deve essere root** per ottenere questa autorizzazione.
* Inoltre, per chiamare l'API **`kext_request`**, è necessario avere altri diritti **`com.apple.private.kext*`**, che vengono concessi solo ai binari Apple.
* **Porta nome attività**: una versione non privilegiata della _porta attività_. Fa riferimento all'attività, ma non consente di controllarla. L'unica cosa che sembra essere disponibile attraverso di essa è `task_info()`.
* **Porta attività** (alias porta kernel)**:** con il permesso di invio su questa porta è possibile controllare l'attività (leggere/scrivere memoria, creare thread...).
* Chiamare `mach_task_self()` per **ottenere il nome** di questa porta per l'attività chiamante. Questa porta viene ereditata solo attraverso **`exec()`**; una nuova attività creata con `fork()` ottiene una nuova porta attività (come caso speciale, un'attività ottiene anche una nuova porta attività dopo `exec()` in un binario suid). L'unico modo per generare un'attività e ottenere la sua porta è eseguire la ["port swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) durante un `fork()`.
* Queste sono le restrizioni per accedere alla porta (da `macos_task_policy` dal binario `AppleMobileFileIntegrity`):
* Se l'app ha il diritto **`com.apple.security.get-task-allow`**, i processi dello **stesso utente possono accedere alla porta dell'attività** (comunemente aggiunto da Xcode per il debug). Il processo di **notarizzazione** non lo permetterà per le versioni di produzione.
* Le app con il diritto **`com.apple.system-task-ports`** possono ottenere la **porta dell'attività per qualsiasi** processo, tranne il kernel. Nelle versioni precedenti era chiamato **`task_for_pid-allow`**. Questo viene concesso solo alle applicazioni Apple.
* **Root può accedere alle porte delle attività** delle applicazioni **non** compilato con un runtime **harden** (e non da Apple).
- **Porta host**: Se un processo ha il privilegio di **Invio** su questa porta, può ottenere **informazioni** sul **sistema** (ad esempio, `host_processor_info`).
- **Porta host priv**: Un processo con il diritto di **Invio** su questa porta può eseguire **azioni privilegiate** come caricare un'estensione del kernel. Il **processo deve essere root** per ottenere questo permesso.
- Inoltre, per chiamare l'API **`kext_request`** è necessario avere altri diritti **`com.apple.private.kext*`** che vengono concessi solo ai binari Apple.
- **Porta nome attività**: Una versione non privilegiata della _porta attività_. Fa riferimento all'attività, ma non consente di controllarla. L'unica cosa disponibile tramite essa sembra essere `task_info()`.
- **Porta attività** (alias porta kernel)**:** Con il permesso di Invio su questa porta è possibile controllare l'attività (leggere/scrivere memoria, creare thread...).
- Chiamare `mach_task_self()` per **ottenere il nome** di questa porta per l'attività chiamante. Questa porta viene ereditata solo attraverso **`exec()`**; una nuova attività creata con `fork()` ottiene una nuova porta attività (come caso speciale, un'attività ottiene anche una nuova porta attività dopo `exec()` in un binario suid). L'unico modo per generare un'attività e ottenere la sua porta è eseguire la ["danza dello scambio di porte"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) durante un `fork()`.
- Queste sono le restrizioni per accedere alla porta (da `macos_task_policy` dal binario `AppleMobileFileIntegrity`):
- Se l'app ha il diritto **`com.apple.security.get-task-allow`**, i processi dello **stesso utente possono accedere alla porta attività** (comunemente aggiunto da Xcode per il debug). Il processo di **notarizzazione** non lo permetterà per i rilasci in produzione.
- Le app con il diritto **`com.apple.system-task-ports`** possono ottenere la **porta attività per qualsiasi** processo, tranne il kernel. Nelle versioni precedenti era chiamato **`task_for_pid-allow`**. Questo è concesso solo alle applicazioni Apple.
- **Root può accedere alle porte attività** delle applicazioni **non** compilati con un **ambiente di esecuzione protetto** (e non di Apple).
### Iniezione di shellcode nel thread tramite porta attività&#x20;
### Iniezione di shellcode nel thread tramite porta attività
Puoi ottenere uno shellcode da:
È possibile ottenere un shellcode da:
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
{% endcontent-ref %}
{% tabs %}
{% tab title="mysleep.m" %}
```objectivec
// clang -framework Foundation mysleep.m -o mysleep
// codesign --entitlements entitlements.plist -s - mysleep
@ -321,7 +288,9 @@ performMathOperations(); // Silent action
return 0;
}
```
{% tab title="entitlements.plist" %}
{% endtab %}
{% tab title="entitlements.plist" %}Il file `entitlements.plist` contiene le informazioni sulle autorizzazioni concesse a un'applicazione su macOS. Queste autorizzazioni determinano quali risorse di sistema l'applicazione può accedere e utilizzare. Modificare questo file può influenzare il comportamento dell'applicazione e potenzialmente consentire privilegi elevati o vulnerabilità di sicurezza. È importante gestire attentamente le autorizzazioni all'interno di questo file per garantire la sicurezza del sistema. {% endtab %}
```xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
@ -334,7 +303,7 @@ return 0;
{% endtab %}
{% endtabs %}
**Compila** il programma precedente e aggiungi i **diritti** per poter iniettare il codice con lo stesso utente (altrimenti dovrai usare **sudo**).
**Compila** il programma precedente e aggiungi i **privilegi** per poter iniettare codice con lo stesso utente (altrimenti dovrai usare **sudo**).
<details>
@ -542,16 +511,16 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
```
### Iniezione di Dylib nel thread tramite porta Task
In macOS, i **thread** possono essere manipolati tramite **Mach** o utilizzando l'API **posix `pthread`**. Il thread generato nell'iniezione precedente è stato generato utilizzando l'API Mach, quindi **non è conforme a posix**.
In macOS i **thread** possono essere manipolati tramite **Mach** o utilizzando l'api **posix `pthread`**. Il thread generato nell'iniezione precedente è stato generato utilizzando l'api Mach, quindi **non è conforme a posix**.
È stato possibile **iniettare un semplice shellcode** per eseguire un comando perché non era necessario lavorare con API conformi a posix, ma solo con Mach. **Iniezioni più complesse** richiederebbero che il **thread** sia anche **conforme a posix**.
È stato possibile **iniettare un semplice shellcode** per eseguire un comando perché non era necessario lavorare con api conformi a posix, solo con Mach. **Iniezioni più complesse** avrebbero bisogno che il **thread** sia anche **conforme a posix**.
Pertanto, per **migliorare il thread**, dovrebbe chiamare **`pthread_create_from_mach_thread`**, che creerà un pthread valido. Quindi, questo nuovo pthread potrebbe **chiamare dlopen** per **caricare una dylib** dal sistema, quindi anziché scrivere nuovo shellcode per eseguire diverse azioni, è possibile caricare librerie personalizzate.
Pertanto, per **migliorare il thread**, dovrebbe chiamare **`pthread_create_from_mach_thread`** che creerà un pthread valido. Quindi, questo nuovo pthread potrebbe **chiamare dlopen** per **caricare una dylib** dal sistema, quindi anziché scrivere nuovo shellcode per eseguire azioni diverse è possibile caricare librerie personalizzate.
Puoi trovare **esempi di dylib** in (ad esempio, quella che genera un log e poi puoi ascoltarlo):
Puoi trovare **esempi di dylibs** in (ad esempio quella che genera un log e poi puoi ascoltarlo):
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert_libraries.md)
{% endcontent-ref %}
<details>
@ -775,14 +744,14 @@ return (-4);
}
// Crea il thread per eseguire lo shellcode
// Crea un thread per eseguire lo shellcode
struct arm_unified_thread_state remoteThreadState64;
thread_act_t remoteThread;
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
remoteStack64 += (STACK_SIZE / 2); // questo è lo stack reale
//remoteStack64 -= 8; // necessita di un allineamento di 16
//remoteStack64 -= 8; // necessario allineamento di 16
const char* p = (const char*) remoteCode64;
@ -828,12 +797,12 @@ fprintf(stderr,"Dylib non trovato\n");
}
```
</details>
</dettagli>
```bash
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
./inject <pid-of-mysleep> </path/to/lib.dylib>
```
### Hijacking del thread tramite la porta Task <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
### Dirottamento del thread tramite la porta Task <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
In questa tecnica viene dirottato un thread del processo:
@ -845,9 +814,9 @@ In questa tecnica viene dirottato un thread del processo:
### Informazioni di base
XPC, che sta per XNU (il kernel utilizzato da macOS) inter-Process Communication, è un framework per la **comunicazione tra processi** su macOS e iOS. XPC fornisce un meccanismo per effettuare **chiamate di metodo sicure e asincrone tra processi diversi** nel sistema. Fa parte del paradigma di sicurezza di Apple, consentendo la **creazione di applicazioni con privilegi separati** in cui ogni **componente** viene eseguito con **solo i permessi necessari** per svolgere il proprio lavoro, limitando così i danni potenziali da un processo compromesso.
XPC, che sta per XNU (il kernel utilizzato da macOS) Inter-Process Communication, è un framework per la **comunicazione tra processi** su macOS e iOS. XPC fornisce un meccanismo per effettuare **chiamate di metodo sicure e asincrone tra processi diversi** sul sistema. Fa parte del paradigma di sicurezza di Apple, consentendo la **creazione di applicazioni con privilegi separati** in cui ogni **componente** viene eseguito con **solo i permessi necessari** per svolgere il proprio lavoro, limitando così i danni potenziali da un processo compromesso.
Per ulteriori informazioni su come funziona questa **comunicazione** e su come **potrebbe essere vulnerabile**, consulta:
Per ulteriori informazioni su come questa **comunicazione funziona** e su come **potrebbe essere vulnerabile**, controlla:
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/" %}
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
@ -855,9 +824,9 @@ Per ulteriori informazioni su come funziona questa **comunicazione** e su come *
## MIG - Mach Interface Generator
MIG è stato creato per **semplificare il processo di creazione del codice Mach IPC**. Fondamentalmente, **genera il codice necessario** per la comunicazione tra server e client con una definizione data. Anche se il codice generato è brutto, uno sviluppatore dovrà solo importarlo e il suo codice sarà molto più semplice rispetto a prima.
MIG è stato creato per **semplificare il processo di creazione del codice Mach IPC**. Fondamentalmente **genera il codice necessario** per far comunicare server e client con una definizione data. Anche se il codice generato è brutto, uno sviluppatore dovrà solo importarlo e il suo codice sarà molto più semplice rispetto a prima.
Per ulteriori informazioni, consulta:
Per ulteriori informazioni, controlla:
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md" %}
[macos-mig-mach-interface-generator.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md)
@ -877,10 +846,10 @@ Per ulteriori informazioni, consulta:
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF**, controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>

View file

@ -1,49 +1,49 @@
# File, Cartelle, Binari e Memoria di macOS
# Struttura dei file, delle cartelle, dei binari e della memoria di macOS
<details>
<summary><strong>Impara l'hacking di AWS da zero a esperto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
## Layout della gerarchia dei file
* **/Applications**: Le app installate dovrebbero essere qui. Tutti gli utenti saranno in grado di accedervi.
* **/Applications**: Le app installate dovrebbero essere qui. Tutti gli utenti potranno accedervi.
* **/bin**: Binari della riga di comando
* **/cores**: Se esiste, viene utilizzato per archiviare i core dump
* **/dev**: Tutto viene trattato come un file, quindi è possibile trovare qui dispositivi hardware.
* **/cores**: Se esiste, viene utilizzato per memorizzare i dump core
* **/dev**: Tutto è trattato come un file quindi potresti vedere dispositivi hardware memorizzati qui.
* **/etc**: File di configurazione
* **/Library**: Molte sottodirectory e file relativi a preferenze, cache e registri possono essere trovati qui. Esiste una cartella Library nella root e in ogni directory dell'utente.
* **/private**: Non documentato, ma molte delle cartelle menzionate sono collegamenti simbolici alla directory privata.
* **/Library**: Molte sottodirectory e file relativi a preferenze, cache e log possono essere trovati qui. Esiste una cartella Library nella root e in ogni directory dell'utente.
* **/private**: Non documentato ma molte delle cartelle menzionate sono collegamenti simbolici alla directory private.
* **/sbin**: Binari di sistema essenziali (relativi all'amministrazione)
* **/System**: File per far funzionare OS X. Qui dovresti trovare principalmente file specifici di Apple (non di terze parti).
* **/System**: File per far funzionare OS X. Dovresti trovare principalmente solo file specifici di Apple qui (non di terze parti).
* **/tmp**: I file vengono eliminati dopo 3 giorni (è un collegamento simbolico a /private/tmp)
* **/Users**: Directory home degli utenti.
* **/usr**: Configurazione e binari di sistema
* **/var**: File di registro
* **/var**: File di log
* **/Volumes**: Le unità montate appariranno qui.
* **/.vol**: Eseguendo `stat a.txt` otterrai qualcosa del genere `16777223 7545753 -rw-r--r-- 1 username wheel ...`, dove il primo numero è l'id del volume in cui si trova il file e il secondo è il numero di inode. Puoi accedere al contenuto di questo file tramite /.vol/ con queste informazioni eseguendo `cat /.vol/16777223/7545753`
* **/.vol**: Eseguendo `stat a.txt` ottieni qualcosa come `16777223 7545753 -rw-r--r-- 1 username wheel ...` dove il primo numero è l'id del volume in cui si trova il file e il secondo è il numero di inode. Puoi accedere al contenuto di questo file tramite /.vol/ con queste informazioni eseguendo `cat /.vol/16777223/7545753`
### Cartelle delle applicazioni
### Cartelle delle Applicazioni
* Le **applicazioni di sistema** si trovano in `/System/Applications`
* Le applicazioni **installate** di solito vengono installate in `/Applications` o in `~/Applications`
* Le **applicazioni di sistema** si trovano sotto `/System/Applications`
* Le applicazioni **installate** di solito sono installate in `/Applications` o in `~/Applications`
* I **dati dell'applicazione** possono essere trovati in `/Library/Application Support` per le applicazioni in esecuzione come root e `~/Library/Application Support` per le applicazioni in esecuzione come utente.
* I **daemon** delle applicazioni di terze parti che **devono essere eseguiti come root** di solito si trovano in `/Library/PrivilegedHelperTools/`
* Le app **sandboxed** sono mappate nella cartella `~/Library/Containers`. Ogni app ha una cartella con il nome dell'ID del bundle dell'applicazione (`com.apple.Safari`).
* I **daemon** delle applicazioni di terze parti che **devono essere eseguiti come root** sono di solito situati in `/Library/PrivilegedHelperTools/`
* Le app **sandboxed** sono mappate nella cartella `~/Library/Containers`. Ogni app ha una cartella denominata in base all'ID del bundle dell'applicazione (`com.apple.Safari`).
* Il **kernel** si trova in `/System/Library/Kernels/kernel`
* Le **estensioni del kernel di Apple** si trovano in `/System/Library/Extensions`
* Le **estensioni del kernel di terze parti** sono memorizzate in `/Library/Extensions`
### File con informazioni sensibili
### File con Informazioni Sensibili
macOS memorizza informazioni come password in diversi luoghi:
@ -57,11 +57,11 @@ macOS memorizza informazioni come password in diversi luoghi:
[macos-installers-abuse.md](macos-installers-abuse.md)
{% endcontent-ref %}
## Estensioni specifiche di OS X
## Estensioni Specifiche di OS X
* **`.dmg`**: I file di immagine disco di Apple sono molto frequenti per gli installatori.
* **`.kext`**: Deve seguire una struttura specifica ed è la versione di OS X di un driver. (è un bundle)
* **`.plist`**: Conosciuto anche come property list, memorizza informazioni in formato XML o binario.
* **`.dmg`**: I file immagine disco di Apple sono molto frequenti per gli installatori.
* **`.kext`**: Deve seguire una struttura specifica ed è la versione OS X di un driver. (è un bundle)
* **`.plist`**: Conosciuto anche come property list memorizza informazioni in formato XML o binario.
* Può essere XML o binario. Quelli binari possono essere letti con:
* `defaults read config.plist`
* `/usr/libexec/PlistBuddy -c print config.plsit`
@ -70,15 +70,15 @@ macOS memorizza informazioni come password in diversi luoghi:
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
* **`.app`**: Applicazioni Apple che seguono la struttura delle directory (è un bundle).
* **`.dylib`**: Librerie dinamiche (come i file DLL di Windows)
* **`.pkg`**: Sono gli stessi di xar (formato di archivio estensibile). Il comando installer può essere utilizzato per installare i contenuti di questi file.
* **`.DS_Store`**: Questo file è presente in ogni directory, salva gli attributi e le personalizzazioni della directory.
* **`.pkg`**: Sono gli stessi di xar (formato di archivio eXtensible). Il comando installer può essere usato per installare i contenuti di questi file.
* **`.DS_Store`**: Questo file è in ogni directory, salva gli attributi e le personalizzazioni della directory.
* **`.Spotlight-V100`**: Questa cartella appare nella directory radice di ogni volume del sistema.
* **`.metadata_never_index`**: Se questo file si trova alla radice di un volume, Spotlight non indizzerà quel volume.
* **`.metadata_never_index`**: Se questo file è nella radice di un volume, Spotlight non indizzerà quel volume.
* **`.noindex`**: I file e le cartelle con questa estensione non verranno indicizzati da Spotlight.
### Bundle di macOS
Un bundle è una **directory** che **sembra un oggetto in Finder** (un esempio di bundle sono i file `*.app`).
Un bundle è una **directory** che **sembra un oggetto in Finder** (un esempio di Bundle sono i file `*.app`).
{% content-ref url="macos-bundles.md" %}
[macos-bundles.md](macos-bundles.md)
@ -86,11 +86,11 @@ Un bundle è una **directory** che **sembra un oggetto in Finder** (un esempio d
## Dyld Shared Cache
Su macOS (e iOS) tutte le librerie condivise di sistema, come framework e dylib, vengono **combinate in un singolo file**, chiamato **dyld shared cache**. Questo migliora le prestazioni, poiché il codice può essere caricato più velocemente.
Su macOS (e iOS) tutte le librerie di sistema condivise, come framework e dylib, sono **combinate in un unico file**, chiamato **dyld shared cache**. Ciò migliora le prestazioni, poiché il codice può essere caricato più velocemente.
Analogamente alla dyld shared cache, il kernel e le estensioni del kernel vengono anche compilati in una cache del kernel, che viene caricata all'avvio.
Analogamente al dyld shared cache, il kernel e le estensioni del kernel sono anche compilati in una cache del kernel, che viene caricata all'avvio.
Per estrarre le librerie dal file singolo dylib shared cache era possibile utilizzare il binario [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip) che potrebbe non funzionare al giorno d'oggi, ma è possibile utilizzare anche [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
Per estrarre le librerie dal file unico dylib shared cache era possibile utilizzare il binario [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip) che potrebbe non funzionare al giorno d'oggi ma è possibile utilizzare anche [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
{% code overflow="wrap" %}
```bash
@ -104,39 +104,61 @@ dyldex_all [dyld_shared_cache_path] # Extract all
```
{% endcode %}
Nelle versioni più vecchie potresti essere in grado di trovare la **cache condivisa** in **`/System/Library/dyld/`**.
Nelle versioni più vecchie potresti trovare la **cache condivisa** in **`/System/Library/dyld/`**.
In iOS puoi trovarli in **`/System/Library/Caches/com.apple.dyld/`**.
In iOS puoi trovarle in **`/System/Library/Caches/com.apple.dyld/`**.
{% hint style="success" %}
Nota che anche se lo strumento `dyld_shared_cache_util` non funziona, puoi passare il **binario dyld condiviso a Hopper** e Hopper sarà in grado di identificare tutte le librerie e permetterti di **selezionare quella** che desideri investigare:
Nota che anche se lo strumento `dyld_shared_cache_util` non funziona, puoi passare il **binario dyld condiviso a Hopper** e Hopper sarà in grado di identificare tutte le librerie e permetterti di **selezionare quale** vuoi investigare:
{% endhint %}
<figure><img src="../../../.gitbook/assets/image (680).png" alt="" width="563"><figcaption></figcaption></figure>
## Permessi speciali dei file
## Permessi Speciali dei File
### Permessi delle cartelle
### Permessi delle Cartelle
In una **cartella**, **read** permette di **elencarla**, **write** permette di **eliminare** e **scrivere** file al suo interno, e **execute** permette di **attraversare** la directory. Quindi, ad esempio, un utente con **permesso di lettura su un file** all'interno di una directory in cui non ha il permesso di **esecuzione non sarà in grado di leggere** il file.
In una **cartella**, **read** permette di **elencarla**, **write** permette di **eliminare** e **scrivere** file al suo interno, ed **execute** permette di **attraversare** la directory. Quindi, ad esempio, un utente con **permesso di lettura su un file** all'interno di una directory dove non ha il permesso di **esecuzione non potrà leggere** il file.
### Flag modificatori
### Modificatori di Flag
Ci sono alcuni flag che possono essere impostati sui file e che ne modificano il comportamento. Puoi **controllare i flag** dei file all'interno di una directory con `ls -lO /percorso/directory`
Ci sono alcuni flag che possono essere impostati nei file e che li faranno comportare in modo diverso. Puoi **controllare i flag** dei file all'interno di una directory con `ls -lO /percorso/directory`
* **`uchg`**: Conosciuto come flag **uchange** impedirà qualsiasi azione di modifica o eliminazione del **file**. Per impostarlo: `chflags uchg file.txt`
* L'utente root p **rimuovere il flag** e modificare il file
* **`restricted`**: Questo flag rende il file **protetto da SIP** (non puoi aggiungere questo flag a un file).
* **`Sticky bit`**: Se una directory ha il bit sticky, **solo** il **proprietario della directory o root può rinominare o eliminare** i file. Tipicamente questo viene impostato sulla directory /tmp per impedire agli utenti ordinari di eliminare o spostare i file di altri utenti.
* **`uchg`**: Noto come flag **uchange** impedirà qualsiasi azione di cambiare o eliminare il **file**. Per impostarlo fai: `chflags uchg file.txt`
* L'utente root potrebbe **rimuovere il flag** e modificare il file
* **`restricted`**: Questo flag fa sì che il file sia **protetto da SIP** (non puoi aggiungere questo flag a un file).
* **`Sticky bit`**: Se una directory ha il bit sticky, **solo** il **proprietario delle directory o root può rinominare o eliminare** i file. Tipicamente questo è impostato sulla directory /tmp per impedire agli utenti ordinari di eliminare o spostare i file di altri utenti.
### **File ACL**
Tutti i flag possono essere trovati nel file `sys/stat.h` (trovalo usando `mdfind stat.h | grep stat.h`) e sono:
Le ACL dei file contengono **ACE** (Access Control Entries) in cui possono essere assegnati permessi più **granulari** a diversi utenti.
* `UF_SETTABLE` 0x0000ffff: Maschera dei flag modificabili dal proprietario.
* `UF_NODUMP` 0x00000001: Non eseguire il dump del file.
* `UF_IMMUTABLE` 0x00000002: Il file non può essere modificato.
* `UF_APPEND` 0x00000004: Le scritture nel file possono solo essere aggiunte.
* `UF_OPAQUE` 0x00000008: La directory è opaca rispetto all'unione.
* `UF_COMPRESSED` 0x00000020: Il file è compresso (alcuni file-system).
* `UF_TRACKED` 0x00000040: Nessuna notifica per eliminazioni/ridenominazioni per i file con questo set.
* `UF_DATAVAULT` 0x00000080: Richiesta l'abilitazione per la lettura e la scrittura.
* `UF_HIDDEN` 0x00008000: Suggerimento che questo elemento non dovrebbe essere visualizzato in un'interfaccia grafica.
* `SF_SUPPORTED` 0x009f0000: Maschera dei flag supportati dal superutente.
* `SF_SETTABLE` 0x3fff0000: Maschera dei flag modificabili dal superutente.
* `SF_SYNTHETIC` 0xc0000000: Maschera dei flag sintetici di sola lettura del sistema.
* `SF_ARCHIVED` 0x00010000: Il file è archiviato.
* `SF_IMMUTABLE` 0x00020000: Il file non può essere modificato.
* `SF_APPEND` 0x00040000: Le scritture nel file possono solo essere aggiunte.
* `SF_RESTRICTED` 0x00080000: Richiesta l'abilitazione per la scrittura.
* `SF_NOUNLINK` 0x00100000: L'elemento non può essere rimosso, rinominato o montato.
* `SF_FIRMLINK` 0x00800000: Il file è un firmlink.
* `SF_DATALESS` 0x40000000: Il file è un oggetto senza dati.
### **ACL dei File**
Gli **ACL dei file** contengono **ACE** (voci di controllo dell'accesso) dove possono essere assegnati **permessi più granulari** a diversi utenti.
È possibile concedere a una **directory** questi permessi: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
E a un **file**: `read`, `write`, `append`, `execute`.
Quando il file contiene ACL, troverai un "+" quando elenchi i permessi come in:
Quando il file contiene ACL troverai un "+" quando elenchi i permessi come in:
```bash
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
@ -151,9 +173,27 @@ Puoi trovare **tutti i file con ACL** con (questo è moooolto lento):
```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
```
### Forchette di risorse | ADS di macOS
### Attributi Estesi
Questa è un modo per ottenere **Alternate Data Streams in MacOS**. Puoi salvare il contenuto all'interno di un attributo esteso chiamato **com.apple.ResourceFork** all'interno di un file salvandolo in **file/..namedfork/rsrc**.
Gli attributi estesi hanno un nome e un valore desiderato, e possono essere visualizzati utilizzando `ls -@` e manipolati utilizzando il comando `xattr`. Alcuni attributi estesi comuni sono:
- `com.apple.resourceFork`: Compatibilità con la biforcazione delle risorse. Visibile anche come `filename/..namedfork/rsrc`
- `com.apple.quarantine`: MacOS: meccanismo di quarantena di Gatekeeper (III/6)
- `metadata:*`: MacOS: vari metadati, come `_backup_excludeItem`, o `kMD*`
- `com.apple.lastuseddate` (#PS): Data dell'ultimo utilizzo del file
- `com.apple.FinderInfo`: MacOS: informazioni del Finder (ad es., Tag di colore)
- `com.apple.TextEncoding`: Specifica la codifica del testo dei file di testo ASCII
- `com.apple.logd.metadata`: Utilizzato da logd su file in `/var/db/diagnostics`
- `com.apple.genstore.*`: Archiviazione generazionale (`/.DocumentRevisions-V100` nella radice del filesystem)
- `com.apple.rootless`: MacOS: Utilizzato da System Integrity Protection per etichettare il file (III/10)
- `com.apple.uuidb.boot-uuid`: Marcature di logd degli epoche di avvio con UUID univoci
- `com.apple.decmpfs`: MacOS: Compressione trasparente dei file (II/7)
- `com.apple.cprotect`: \*OS: Dati di crittografia per file (III/11)
- `com.apple.installd.*`: \*OS: Metadati utilizzati da installd, ad es., `installType`, `uniqueInstallID`
### Biforcazioni delle Risorse | ADS di macOS
Questo è un modo per ottenere **Stream di Dati Alternativi in macOS**. È possibile salvare contenuti all'interno di un attributo esteso chiamato **com.apple.ResourceFork** all'interno di un file salvandolo in **file/..namedfork/rsrc**.
```bash
echo "Hello" > a.txt
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
@ -170,11 +210,17 @@ Puoi **trovare tutti i file che contengono questo attributo esteso** con:
```bash
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
```
{% endcode %}
### decmpfs
## **Universal binaries &** Mach-o Format
L'attributo esteso `com.apple.decmpfs` indica che il file è memorizzato criptato, `ls -l` riporterà una **dimensione di 0** e i dati compressi sono all'interno di questo attributo. Ogni volta che il file viene accesso, verrà decriptato in memoria.
I binari di Mac OS di solito vengono compilati come **universal binaries**. Un **universal binary** può **supportare più architetture nello stesso file**.
Questo attributo può essere visto con `ls -lO` indicato come compresso perché i file compressi sono contrassegnati anche con il flag `UF_COMPRESSED`. Se un file compresso viene rimosso, questo flag con `chflags nocompressed </percorso/al/file>`, il sistema non saprà che il file era compresso e quindi non sarà in grado di decomprimere e accedere ai dati (penserà che sia effettivamente vuoto).
Lo strumento afscexpand può essere utilizzato per forzare la decompressione di un file.
## **Universal binaries &** Formato Mach-o
I binari di Mac OS di solito sono compilati come **binari universali**. Un **binario universale** può **supportare più architetture nello stesso file**.
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
@ -186,36 +232,22 @@ I binari di Mac OS di solito vengono compilati come **universal binaries**. Un *
[macos-memory-dumping.md](macos-memory-dumping.md)
{% endcontent-ref %}
## File di categoria di rischio di Mac OS
## File di categoria di rischio Mac OS
La directory `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` è dove vengono memorizzate le informazioni sul **rischio associato a diverse estensioni di file**. Questa directory categorizza i file in vari livelli di rischio, influenzando il modo in cui Safari gestisce questi file al momento del download. Le categorie sono le seguenti:
La directory `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` è dove sono memorizzate le informazioni sul **rischio associato a diverse estensioni di file**. Questa directory categorizza i file in vari livelli di rischio, influenzando come Safari gestisce questi file al momento del download. Le categorie sono le seguenti:
- **LSRiskCategorySafe**: I file in questa categoria sono considerati **completamente sicuri**. Safari aprirà automaticamente questi file dopo il download.
- **LSRiskCategoryNeutral**: Questi file non presentano avvertimenti e non vengono aperti automaticamente da Safari.
- **LSRiskCategoryUnsafeExecutable**: I file in questa categoria **generano un avviso** che indica che il file è un'applicazione. Questo serve come misura di sicurezza per avvisare l'utente.
- **LSRiskCategoryMayContainUnsafeExecutable**: Questa categoria è per i file, come gli archivi, che potrebbero contenere un eseguibile. Safari **genererà un avviso** a meno che non possa verificare che tutti i contenuti siano sicuri o neutrali.
* **LSRiskCategorySafe**: I file in questa categoria sono considerati **completamente sicuri**. Safari aprirà automaticamente questi file dopo il download.
* **LSRiskCategoryNeutral**: Questi file non presentano avvertimenti e non vengono **aperti automaticamente** da Safari.
* **LSRiskCategoryUnsafeExecutable**: I file in questa categoria **attivano un avviso** che indica che il file è un'applicazione. Questo serve come misura di sicurezza per avvisare l'utente.
* **LSRiskCategoryMayContainUnsafeExecutable**: Questa categoria è per i file, come gli archivi, che potrebbero contenere un eseguibile. Safari **attiverà un avviso** a meno che non possa verificare che tutti i contenuti siano sicuri o neutrali.
## File di registro
## File di log
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Contiene informazioni sui file scaricati, come l'URL da cui sono stati scaricati.
* **`/var/log/system.log`**: Registro principale dei sistemi OSX. com.apple.syslogd.plist è responsabile dell'esecuzione del syslog (puoi verificare se è disabilitato cercando "com.apple.syslogd" in `launchctl list`.
* **`/private/var/log/asl/*.asl`**: Questi sono i log di sistema di Apple che possono contenere informazioni interessanti.
* **`/var/log/system.log`**: Log principale dei sistemi OSX. com.apple.syslogd.plist è responsabile dell'esecuzione del logging di sistema (puoi verificare se è disabilitato cercando "com.apple.syslogd" in `launchctl list`.
* **`/private/var/log/asl/*.asl`**: Questi sono i Log di Sistema Apple che potrebbero contenere informazioni interessanti.
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Memorizza i file e le applicazioni recentemente accessi tramite "Finder".
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Memorizza gli elementi da avviare all'avvio del sistema.
* **`$HOME/Library/Logs/DiskUtility.log`**: File di registro per l'app DiskUtility (informazioni su unità, inclusi USB).
* **`$HOME/Library/Logs/DiskUtility.log`**: File di log per l'applicazione DiskUtility (informazioni sui drive, inclusi gli USB).
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Dati sugli access point wireless.
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Elenco dei daemon disattivati.
<details>
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>

View file

@ -10,7 +10,7 @@ Altri modi per supportare HackTricks:
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
</details>
@ -20,9 +20,9 @@ Autorizzazioni in una **directory**:
* **lettura** - puoi **enumerare** le voci della directory
* **scrittura** - puoi **eliminare/scrivere** **file** nella directory e puoi **eliminare cartelle vuote**.
* Ma **non puoi eliminare/modificare cartelle non vuote** a meno che tu non abbia le autorizzazioni di scrittura su di esse.
* Ma **non puoi eliminare/modificare cartelle non vuote** a meno che tu abbia le autorizzazioni di scrittura su di esse.
* **Non puoi modificare il nome di una cartella** a meno che tu ne sia il proprietario.
* **esecuzione** - ti è **permesso attraversare** la directory - se non hai questo diritto, non puoi accedere a nessun file al suo interno o in eventuali sottodirectory.
* **esecuzione** - ti è **permesso attraversare** la directory - se non hai questo diritto, non puoi accedere a nessun file al suo interno, o in eventuali sottodirectory.
### Combinazioni Pericolose
@ -36,19 +36,19 @@ Con una qualsiasi delle combinazioni precedenti, un attaccante potrebbe **iniett
### Caso speciale Folder root R+X
Se ci sono file in una **directory** in cui **solo root ha accesso R+X**, questi non sono **accessibili ad altri**. Quindi una vulnerabilità che permette di **spostare un file leggibile da un utente**, che non può essere letto a causa di tale **restrizione**, da questa cartella **a un'altra**, potrebbe essere sfruttata per leggere questi file.
Se ci sono file in una **directory** dove **solo root ha accesso R+X**, questi non sono **accessibili a nessun altro**. Quindi una vulnerabilità che permette di **spostare un file leggibile da un utente**, che non può essere letto a causa di tale **restrizione**, da questa cartella **a un'altra**, potrebbe essere sfruttata per leggere questi file.
Esempio in: [https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions)
## Collegamento simbolico / Collegamento fisico
Se un processo privilegiato sta scrivendo dati in un **file** che potrebbe essere **controllato** da un **utente con privilegi inferiori**, o che potrebbe essere **precedentemente creato** da un utente con privilegi inferiori. L'utente potrebbe semplicemente **puntarlo su un altro file** tramite un collegamento simbolico o fisico, e il processo privilegiato scriverà su quel file.
Se un processo privilegiato sta scrivendo dati in un **file** che potrebbe essere **controllato** da un **utente meno privilegiato**, o che potrebbe essere **precedentemente creato** da un utente meno privilegiato. L'utente potrebbe semplicemente **puntarlo su un altro file** tramite un collegamento simbolico o fisico, e il processo privilegiato scriverà su quel file.
Controlla nelle altre sezioni dove un attaccante potrebbe **abusare di una scrittura arbitraria per ottenere privilegi**.
## .fileloc
I file con estensione **`.fileloc`** possono puntare ad altre applicazioni o binari in modo che quando vengono aperti, l'applicazione/binario eseguirà.\
I file con estensione **`.fileloc`** possono puntare ad altre applicazioni o binari in modo che quando vengono aperti, l'applicazione/binario sarà quello eseguito.\
Esempio:
```xml
<?xml version="1.0" encoding="UTF-8"?>
@ -68,7 +68,7 @@ Se riesci a fare in modo che un **processo apra un file o una cartella con privi
Ad esempio: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)
## Trucchi per evitare gli xattrs di quarantena
## Trucchi per Evitare gli xattrs di Quarantena
### Rimuovilo
```bash
@ -124,7 +124,7 @@ ls -le /tmp/test
Il formato file **AppleDouble** copia un file inclusi i suoi ACE.
Nel [**codice sorgente**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) è possibile vedere che la rappresentazione testuale ACL memorizzata all'interno dell'xattr chiamato **`com.apple.acl.text`** verrà impostata come ACL nel file decompresso. Quindi, se si comprime un'applicazione in un file zip con il formato file **AppleDouble** con un ACL che impedisce ad altri xattr di essere scritti su di esso... l'xattr di quarantena non è impostato nell'applicazione:
Nel [**codice sorgente**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) è possibile vedere che la rappresentazione testuale ACL memorizzata all'interno dell'xattr chiamato **`com.apple.acl.text`** verrà impostata come ACL nel file decompresso. Quindi, se hai compresso un'applicazione in un file zip con il formato file **AppleDouble** con un ACL che impedisce ad altri xattr di essere scritti su di esso... l'xattr di quarantena non è stato impostato nell'applicazione:
Controlla il [**rapporto originale**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) per ulteriori informazioni.
@ -146,9 +146,9 @@ ditto -c -k del test.zip
ditto -x -k --rsrc test.zip .
ls -le test
```
(Nota che anche se questo funziona la sandbox scrive l'xattr di quarantena prima)
(Nota che anche se questo funziona, la sandbox scrive l'xattr di quarantena prima)
Non proprio necessario ma lo lascio lì nel caso:
Non è proprio necessario ma lo lascio lì nel caso:
{% content-ref url="macos-xattr-acls-extra-stuff.md" %}
[macos-xattr-acls-extra-stuff.md](macos-xattr-acls-extra-stuff.md)
@ -156,7 +156,7 @@ Non proprio necessario ma lo lascio lì nel caso:
## Ignorare le Firme dei Codici
I Bundle contengono il file **`_CodeSignature/CodeResources`** che contiene l'**hash** di ogni singolo **file** nel **bundle**. Nota che l'hash di CodeResources è anche **incorporato nell'eseguibile**, quindi non possiamo manipolarlo.
I Bundle contengono il file **`_CodeSignature/CodeResources`** che contiene l'**hash** di ogni singolo **file** nel **bundle**. Nota che l'hash di CodeResources è anche **incorporato nell'eseguibile**, quindi non possiamo intaccarlo.
Tuttavia, ci sono alcuni file la cui firma non verrà verificata, questi hanno la chiave omit nel plist, come:
```xml
@ -210,9 +210,7 @@ openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/
```
## Montare i file DMG
Un utente può montare un file DMG personalizzato anche sopra alcune cartelle esistenti. Ecco come potresti creare un pacchetto DMG personalizzato con contenuti personalizzati:
{% code overflow="wrap" %}
Un utente può montare un file DMG personalizzato anche sopra alcune cartelle esistenti. Ecco come è possibile creare un pacchetto DMG personalizzato con contenuti personalizzati:
```bash
# Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
@ -235,13 +233,16 @@ hdiutil create -srcfolder justsome.app justsome.dmg
```
{% endcode %}
Di solito macOS monta il disco parlando con il servizio Mach `com.apple.DiskArbitrarion.diskarbitrariond` (fornito da `/usr/libexec/diskarbitrationd`). Se si aggiunge il parametro `-d` al file plist di LaunchDaemons e si riavvia, verranno memorizzati i log in `/var/log/diskarbitrationd.log`.\
Tuttavia, è possibile utilizzare strumenti come `hdik` e `hdiutil` per comunicare direttamente con il kext `com.apple.driver.DiskImages`.
## Scritture Arbitrarie
### Script sh periodici
Se il tuo script potrebbe essere interpretato come uno **script shell** potresti sovrascrivere lo script shell **`/etc/periodic/daily/999.local`** che verrà attivato ogni giorno.
Se il tuo script potrebbe essere interpretato come uno **script shell**, potresti sovrascrivere lo script shell **`/etc/periodic/daily/999.local`** che verrà attivato ogni giorno.
Puoi **falsificare** l'esecuzione di questo script con: **`sudo periodic daily`**
Puoi **simulare** l'esecuzione di questo script con: **`sudo periodic daily`**
### Daemon
@ -292,14 +293,14 @@ echo $FILENAME
<details>
<summary><strong>Impara l'hacking su AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
Altri modi per supportare HackTricks:
* Se desideri vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Se desideri vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione esclusiva di [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
</details>