# Struttura dei file, delle cartelle, dei binari e della memoria di macOS
Impara l'hacking di AWS da zero a eroe conhtARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
* 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 [**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.
## Layout della gerarchia dei file
* **/Applications**: Le app installate dovrebbero essere qui. Tutti gli utenti potranno accedervi.
* **/bin**: Binari della riga di comando
* **/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 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. 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 log
* **/Volumes**: Le unità montate appariranno qui.
* **/.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
* 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** 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
macOS memorizza informazioni come password in diversi luoghi:
{% content-ref url="macos-sensitive-locations.md" %}
[macos-sensitive-locations.md](macos-sensitive-locations.md)
{% endcontent-ref %}
### Installatori pkg vulnerabili
{% content-ref url="macos-installers-abuse.md" %}
[macos-installers-abuse.md](macos-installers-abuse.md)
{% endcontent-ref %}
## Estensioni Specifiche di OS X
* **`.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`
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
* `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 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 è 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`).
{% content-ref url="macos-bundles.md" %}
[macos-bundles.md](macos-bundles.md)
{% endcontent-ref %}
## Dyld Shared Cache
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 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 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
# dyld_shared_cache_util
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
# dyldextractor
dyldex -l [dyld_shared_cache_path] # List libraries
dyldex_all [dyld_shared_cache_path] # Extract all
# More options inside the readme
```
{% endcode %}
Nelle versioni più vecchie potresti trovare la **cache condivisa** in **`/System/Library/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 quale** vuoi investigare:
{% endhint %}
## Permessi Speciali dei File
### Permessi delle Cartelle
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.
### Modificatori di Flag
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`**: 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.
Tutti i flag possono essere trovati nel file `sys/stat.h` (trovalo usando `mdfind stat.h | grep stat.h`) e sono:
* `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:
```bash
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
```
Puoi **leggere gli ACL** del file con:
```bash
ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
0: group:everyone deny delete
```
Puoi trovare **tutti i file con ACL** con (questo è moooolto lento):
```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
```
### Attributi Estesi
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
xattr -l a.txt #Read extended attributes
com.apple.ResourceFork: Hello Mac ADS
ls -l a.txt #The file length is still q
-rw-r--r--@ 1 username wheel 6 17 Jul 01:15 a.txt
```
Puoi **trovare tutti i file che contengono questo attributo esteso** con:
{% code overflow="wrap" %}
```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"
```
### decmpfs
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.
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 `, 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)
{% endcontent-ref %}
## Dumping della memoria di macOS
{% content-ref url="macos-memory-dumping.md" %}
[macos-memory-dumping.md](macos-memory-dumping.md)
{% endcontent-ref %}
## File di categoria di rischio Mac OS
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 **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 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`**: 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 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.