# macOS Dateien, Ordner, Binaries & Speicher
{{#include ../../../banners/hacktricks-training.md}}
## Dateihierarchie
- **/Applications**: Die installierten Apps sollten hier sein. Alle Benutzer können darauf zugreifen.
- **/bin**: Befehlszeilen-Binaries
- **/cores**: Wenn vorhanden, wird es verwendet, um Core-Dumps zu speichern
- **/dev**: Alles wird als Datei behandelt, sodass Sie hier Hardwaregeräte sehen können.
- **/etc**: Konfigurationsdateien
- **/Library**: Viele Unterverzeichnisse und Dateien, die mit Einstellungen, Caches und Protokollen zu tun haben, finden sich hier. Ein Library-Ordner existiert im Root-Verzeichnis und im Verzeichnis jedes Benutzers.
- **/private**: Nicht dokumentiert, aber viele der genannten Ordner sind symbolische Links zum privaten Verzeichnis.
- **/sbin**: Essentielle System-Binaries (bezogen auf die Verwaltung)
- **/System**: Dateien, um OS X auszuführen. Hier sollten hauptsächlich nur Apple-spezifische Dateien zu finden sein (keine Drittanbieter).
- **/tmp**: Dateien werden nach 3 Tagen gelöscht (es ist ein symbolischer Link zu /private/tmp)
- **/Users**: Heimatverzeichnis für Benutzer.
- **/usr**: Konfigurations- und System-Binaries
- **/var**: Protokolldateien
- **/Volumes**: Die gemounteten Laufwerke erscheinen hier.
- **/.vol**: Wenn Sie `stat a.txt` ausführen, erhalten Sie etwas wie `16777223 7545753 -rw-r--r-- 1 username wheel ...`, wobei die erste Zahl die ID-Nummer des Volumes ist, auf dem die Datei existiert, und die zweite die Inode-Nummer ist. Sie können den Inhalt dieser Datei über /.vol/ mit diesen Informationen abrufen, indem Sie `cat /.vol/16777223/7545753` ausführen.
### Anwendungsordner
- **Systemanwendungen** befinden sich unter `/System/Applications`
- **Installierte** Anwendungen sind normalerweise in `/Applications` oder in `~/Applications` installiert.
- **Anwendungsdaten** finden sich in `/Library/Application Support` für Anwendungen, die als Root ausgeführt werden, und in `~/Library/Application Support` für Anwendungen, die als Benutzer ausgeführt werden.
- Drittanbieteranwendungen **Dämonen**, die **als Root ausgeführt werden müssen**, befinden sich normalerweise in `/Library/PrivilegedHelperTools/`
- **Sandboxed** Apps sind im Ordner `~/Library/Containers` abgebildet. Jede App hat einen Ordner, der nach der Bundle-ID der Anwendung benannt ist (`com.apple.Safari`).
- Der **Kernel** befindet sich in `/System/Library/Kernels/kernel`
- **Apples Kernel-Erweiterungen** befinden sich in `/System/Library/Extensions`
- **Drittanbieter-Kernel-Erweiterungen** werden in `/Library/Extensions` gespeichert.
### Dateien mit sensiblen Informationen
MacOS speichert Informationen wie Passwörter an mehreren Orten:
{{#ref}}
macos-sensitive-locations.md
{{#endref}}
### Verwundbare pkg-Installer
{{#ref}}
macos-installers-abuse.md
{{#endref}}
## OS X spezifische Erweiterungen
- **`.dmg`**: Apple Disk Image-Dateien sind sehr häufig für Installer.
- **`.kext`**: Es muss einer bestimmten Struktur folgen und ist die OS X-Version eines Treibers. (es ist ein Bundle)
- **`.plist`**: Auch bekannt als Property List, speichert Informationen im XML- oder Binärformat.
- Kann XML oder binär sein. Binäre können gelesen werden mit:
- `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`**: Apple-Anwendungen, die der Verzeichnisstruktur folgen (es ist ein Bundle).
- **`.dylib`**: Dynamische Bibliotheken (wie Windows DLL-Dateien)
- **`.pkg`**: Sind dasselbe wie xar (eXtensible Archive Format). Der Installer-Befehl kann verwendet werden, um den Inhalt dieser Dateien zu installieren.
- **`.DS_Store`**: Diese Datei befindet sich in jedem Verzeichnis, sie speichert die Attribute und Anpassungen des Verzeichnisses.
- **`.Spotlight-V100`**: Dieser Ordner erscheint im Root-Verzeichnis jedes Volumes im System.
- **`.metadata_never_index`**: Wenn sich diese Datei im Root eines Volumes befindet, wird Spotlight dieses Volume nicht indizieren.
- **`.noindex`**: Dateien und Ordner mit dieser Erweiterung werden von Spotlight nicht indiziert.
- **`.sdef`**: Dateien innerhalb von Bundles, die angeben, wie mit der Anwendung über ein AppleScript interagiert werden kann.
### macOS Bundles
Ein Bundle ist ein **Verzeichnis**, das **wie ein Objekt im Finder aussieht** (ein Beispiel für ein Bundle sind `*.app`-Dateien).
{{#ref}}
macos-bundles.md
{{#endref}}
## Dyld Shared Library Cache (SLC)
Auf macOS (und iOS) sind alle systemweiten Shared Libraries, wie Frameworks und dylibs, **in einer einzigen Datei kombiniert**, die als **dyld shared cache** bezeichnet wird. Dies verbessert die Leistung, da der Code schneller geladen werden kann.
Dies befindet sich in macOS unter `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/` und in älteren Versionen finden Sie den **shared cache** möglicherweise in **`/System/Library/dyld/`**.\
In iOS finden Sie sie in **`/System/Library/Caches/com.apple.dyld/`**.
Ähnlich wie der dyld shared cache sind der Kernel und die Kernel-Erweiterungen ebenfalls in einem Kernel-Cache kompiliert, der beim Booten geladen wird.
Um die Bibliotheken aus der einzelnen Datei des dylib shared cache zu extrahieren, war es möglich, das Binary [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) zu verwenden, das möglicherweise heutzutage nicht mehr funktioniert, aber Sie können auch [**dyldextractor**](https://github.com/arandomdev/dyldextractor) verwenden:
```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
```
> [!TIP]
> Beachten Sie, dass selbst wenn das Tool `dyld_shared_cache_util` nicht funktioniert, Sie das **gemeinsame dyld-Binärformat an Hopper übergeben** können und Hopper in der Lage sein wird, alle Bibliotheken zu identifizieren und Ihnen zu **ermöglichen, auszuwählen, welche Sie** untersuchen möchten:
Einige Extraktoren funktionieren möglicherweise nicht, da dylibs mit fest codierten Adressen vorverlinkt sind, wodurch sie möglicherweise zu unbekannten Adressen springen.
> [!TIP]
> Es ist auch möglich, den Shared Library Cache anderer \*OS-Geräte in macos herunterzuladen, indem Sie einen Emulator in Xcode verwenden. Sie werden heruntergeladen in: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport//Symbols/System/Library/Caches/com.apple.dyld/`, wie: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
### Mapping SLC
**`dyld`** verwendet den Syscall **`shared_region_check_np`**, um zu wissen, ob das SLC gemappt wurde (was die Adresse zurückgibt) und **`shared_region_map_and_slide_np`**, um das SLC zu mappen.
Beachten Sie, dass selbst wenn das SLC beim ersten Gebrauch verschoben wird, alle **Prozesse** die **gleiche Kopie** verwenden, was den ASLR-Schutz **eliminierte**, wenn der Angreifer in der Lage war, Prozesse im System auszuführen. Dies wurde in der Vergangenheit tatsächlich ausgenutzt und mit einem Shared Region Pager behoben.
Branch-Pools sind kleine Mach-O dylibs, die kleine Räume zwischen Bildzuordnungen schaffen, wodurch es unmöglich wird, die Funktionen zu interponieren.
### Override SLCs
Verwendung der Umgebungsvariablen:
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR= DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Dies ermöglicht das Laden eines neuen Shared Library Cache
- **`DYLD_SHARED_CACHE_DIR=avoid`** und manuelles Ersetzen der Bibliotheken durch Symlinks zum Shared Cache mit den echten (Sie müssen sie extrahieren)
## Besondere Dateiberechtigungen
### Ordners Berechtigungen
In einem **Ordner** erlaubt **lesen**, ihn **aufzulisten**, **schreiben** erlaubt das **Löschen** und **Schreiben** von Dateien darin, und **ausführen** erlaubt das **Durchqueren** des Verzeichnisses. Ein Benutzer mit **Lesezugriff auf eine Datei** in einem Verzeichnis, in dem er **keine Ausführungsberechtigung** hat, **wird die Datei nicht lesen können**.
### Flag-Modifikatoren
Es gibt einige Flags, die in den Dateien gesetzt werden können, die das Verhalten der Datei ändern. Sie können die **Flags** der Dateien in einem Verzeichnis mit `ls -lO /path/directory` überprüfen.
- **`uchg`**: Bekannt als **uchange**-Flag, wird **jede Aktion** zum Ändern oder Löschen der **Datei** verhindern. Um es zu setzen, tun Sie: `chflags uchg file.txt`
- Der Root-Benutzer könnte **das Flag entfernen** und die Datei ändern.
- **`restricted`**: Dieses Flag schützt die Datei **durch SIP** (Sie können dieses Flag nicht zu einer Datei hinzufügen).
- **`Sticky bit`**: Wenn ein Verzeichnis mit Sticky Bit, **kann nur** der **Verzeichnisbesitzer oder Root Dateien umbenennen oder löschen**. Typischerweise wird dies im /tmp-Verzeichnis gesetzt, um zu verhindern, dass normale Benutzer die Dateien anderer Benutzer löschen oder verschieben.
Alle Flags sind in der Datei `sys/stat.h` zu finden (finden Sie sie mit `mdfind stat.h | grep stat.h`) und sind:
- `UF_SETTABLE` 0x0000ffff: Maske der vom Eigentümer änderbaren Flags.
- `UF_NODUMP` 0x00000001: Datei nicht dumpen.
- `UF_IMMUTABLE` 0x00000002: Datei darf nicht geändert werden.
- `UF_APPEND` 0x00000004: Schreibvorgänge in die Datei dürfen nur anhängen.
- `UF_OPAQUE` 0x00000008: Verzeichnis ist undurchsichtig in Bezug auf Union.
- `UF_COMPRESSED` 0x00000020: Datei ist komprimiert (einige Dateisysteme).
- `UF_TRACKED` 0x00000040: Keine Benachrichtigungen für Löschungen/Umbenennungen für Dateien mit diesem Set.
- `UF_DATAVAULT` 0x00000080: Berechtigung erforderlich zum Lesen und Schreiben.
- `UF_HIDDEN` 0x00008000: Hinweis, dass dieses Element nicht in einer GUI angezeigt werden sollte.
- `SF_SUPPORTED` 0x009f0000: Maske der vom Superuser unterstützten Flags.
- `SF_SETTABLE` 0x3fff0000: Maske der vom Superuser änderbaren Flags.
- `SF_SYNTHETIC` 0xc0000000: Maske der systemeigenen schreibgeschützten synthetischen Flags.
- `SF_ARCHIVED` 0x00010000: Datei ist archiviert.
- `SF_IMMUTABLE` 0x00020000: Datei darf nicht geändert werden.
- `SF_APPEND` 0x00040000: Schreibvorgänge in die Datei dürfen nur anhängen.
- `SF_RESTRICTED` 0x00080000: Berechtigung erforderlich zum Schreiben.
- `SF_NOUNLINK` 0x00100000: Element darf nicht entfernt, umbenannt oder gemountet werden.
- `SF_FIRMLINK` 0x00800000: Datei ist ein Firmlink.
- `SF_DATALESS` 0x40000000: Datei ist ein dataloses Objekt.
### **Datei-ACLs**
Datei-**ACLs** enthalten **ACE** (Access Control Entries), bei denen granularere Berechtigungen verschiedenen Benutzern zugewiesen werden können.
Es ist möglich, einem **Verzeichnis** diese Berechtigungen zu gewähren: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
Und für eine **Datei**: `read`, `write`, `append`, `execute`.
Wenn die Datei ACLs enthält, werden Sie **ein "+" finden, wenn Sie die Berechtigungen auflisten, wie in**:
```bash
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
```
Sie können die **ACLs** der Datei mit folgendem Befehl lesen:
```bash
ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
0: group:everyone deny delete
```
Sie können **alle Dateien mit ACLs** mit (das ist sehr langsam) finden:
```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
```
### Erweiterte Attribute
Erweiterte Attribute haben einen Namen und einen beliebigen gewünschten Wert und können mit `ls -@` angezeigt und mit dem Befehl `xattr` bearbeitet werden. Einige gängige erweiterte Attribute sind:
- `com.apple.resourceFork`: Kompatibilität mit Resource Fork. Auch sichtbar als `filename/..namedfork/rsrc`
- `com.apple.quarantine`: MacOS: Gatekeeper-Quarantänemechanismus (III/6)
- `metadata:*`: MacOS: verschiedene Metadaten, wie `_backup_excludeItem` oder `kMD*`
- `com.apple.lastuseddate` (#PS): Letztes Dateinutzungsdatum
- `com.apple.FinderInfo`: MacOS: Finder-Informationen (z.B. Farb-Tags)
- `com.apple.TextEncoding`: Gibt die Textkodierung von ASCII-Textdateien an
- `com.apple.logd.metadata`: Wird von logd für Dateien in `/var/db/diagnostics` verwendet
- `com.apple.genstore.*`: Generational storage (`/.DocumentRevisions-V100` im Wurzelverzeichnis des Dateisystems)
- `com.apple.rootless`: MacOS: Wird von System Integrity Protection verwendet, um Dateien zu kennzeichnen (III/10)
- `com.apple.uuidb.boot-uuid`: logd-Markierungen von Boot-Epochen mit eindeutiger UUID
- `com.apple.decmpfs`: MacOS: Transparente Dateikompression (II/7)
- `com.apple.cprotect`: \*OS: Verschlüsselungsdaten pro Datei (III/11)
- `com.apple.installd.*`: \*OS: Metadaten, die von installd verwendet werden, z.B. `installType`, `uniqueInstallID`
### Resource Forks | macOS ADS
Dies ist eine Möglichkeit, **Alternate Data Streams in MacOS**-Maschinen zu erhalten. Sie können Inhalte in einem erweiterten Attribut namens **com.apple.ResourceFork** innerhalb einer Datei speichern, indem Sie es in **file/..namedfork/rsrc** speichern.
```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
```
Sie können **alle Dateien, die dieses erweiterte Attribut enthalten**, mit folgendem Befehl finden:
```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
Das erweiterte Attribut `com.apple.decmpfs` zeigt an, dass die Datei verschlüsselt gespeichert ist, `ls -l` wird eine **Größe von 0** melden und die komprimierten Daten befinden sich in diesem Attribut. Jedes Mal, wenn auf die Datei zugegriffen wird, wird sie im Speicher entschlüsselt.
Dieses Attribut kann mit `ls -lO` gesehen werden, das als komprimiert angezeigt wird, da komprimierte Dateien auch mit dem Flag `UF_COMPRESSED` gekennzeichnet sind. Wenn eine komprimierte Datei mit `chflags nocompressed ` entfernt wird, weiß das System nicht, dass die Datei komprimiert war, und kann daher die Daten nicht dekomprimieren und darauf zugreifen (es wird denken, dass sie tatsächlich leer ist).
Das Tool afscexpand kann verwendet werden, um eine Datei zwangsweise zu dekomprimieren.
## **Universelle Binaries &** Mach-o Format
Mac OS-Binaries werden normalerweise als **universelle Binaries** kompiliert. Eine **universelle Binary** kann **mehrere Architekturen in derselben Datei unterstützen**.
{{#ref}}
universal-binaries-and-mach-o-format.md
{{#endref}}
## macOS Prozessspeicher
## macOS Speicher-Dumping
{{#ref}}
macos-memory-dumping.md
{{#endref}}
## Risikokategorie Dateien Mac OS
Das Verzeichnis `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` ist der Ort, an dem Informationen über das **Risiko, das mit verschiedenen Dateierweiterungen verbunden ist**, gespeichert werden. Dieses Verzeichnis kategorisiert Dateien in verschiedene Risikostufen, die beeinflussen, wie Safari mit diesen Dateien beim Herunterladen umgeht. Die Kategorien sind wie folgt:
- **LSRiskCategorySafe**: Dateien in dieser Kategorie gelten als **vollständig sicher**. Safari öffnet diese Dateien automatisch, nachdem sie heruntergeladen wurden.
- **LSRiskCategoryNeutral**: Diese Dateien kommen ohne Warnungen und werden **nicht automatisch von Safari geöffnet**.
- **LSRiskCategoryUnsafeExecutable**: Dateien in dieser Kategorie **lösen eine Warnung aus**, die darauf hinweist, dass die Datei eine Anwendung ist. Dies dient als Sicherheitsmaßnahme, um den Benutzer zu alarmieren.
- **LSRiskCategoryMayContainUnsafeExecutable**: Diese Kategorie ist für Dateien, wie Archive, die möglicherweise eine ausführbare Datei enthalten. Safari wird **eine Warnung auslösen**, es sei denn, es kann bestätigen, dass alle Inhalte sicher oder neutral sind.
## Protokolldateien
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Enthält Informationen über heruntergeladene Dateien, wie die URL, von der sie heruntergeladen wurden.
- **`/var/log/system.log`**: Hauptprotokoll der OSX-Systeme. com.apple.syslogd.plist ist verantwortlich für die Ausführung des Sysloggings (Sie können überprüfen, ob es deaktiviert ist, indem Sie nach "com.apple.syslogd" in `launchctl list` suchen).
- **`/private/var/log/asl/*.asl`**: Dies sind die Apple-Systemprotokolle, die interessante Informationen enthalten können.
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Speichert kürzlich aufgerufene Dateien und Anwendungen über "Finder".
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Speichert Elemente, die beim Systemstart gestartet werden sollen.
- **`$HOME/Library/Logs/DiskUtility.log`**: Protokolldatei für die DiskUtility-App (Informationen über Laufwerke, einschließlich USBs).
- **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Daten über drahtlose Zugangspunkte.
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Liste der deaktivierten Daemons.
{{#include ../../../banners/hacktricks-training.md}}