# macOS Файли, Папки, Бінарні Файли та Пам'ять
{{#include ../../../banners/hacktricks-training.md}}
## Структура файлової ієрархії
- **/Applications**: Встановлені програми повинні бути тут. Усі користувачі зможуть отримати до них доступ.
- **/bin**: Бінарні файли командного рядка
- **/cores**: Якщо існує, використовується для зберігання дампів пам'яті
- **/dev**: Все розглядається як файл, тому ви можете побачити апаратні пристрої, збережені тут.
- **/etc**: Конфігураційні файли
- **/Library**: Тут можна знайти багато підкаталогів і файлів, пов'язаних з налаштуваннями, кешами та журналами. Папка Library існує в кореневому каталозі та в каталозі кожного користувача.
- **/private**: Не задокументовано, але багато з вказаних папок є символічними посиланнями на приватний каталог.
- **/sbin**: Основні системні бінарні файли (пов'язані з адмініструванням)
- **/System**: Файл для запуску OS X. Тут ви повинні знайти в основному лише специфічні для Apple файли (не сторонні).
- **/tmp**: Файли видаляються через 3 дні (це м'яке посилання на /private/tmp)
- **/Users**: Домашній каталог для користувачів.
- **/usr**: Конфігураційні та системні бінарні файли
- **/var**: Журнальні файли
- **/Volumes**: Змонтовані диски з'являться тут.
- **/.vol**: Запустивши `stat a.txt`, ви отримаєте щось на зразок `16777223 7545753 -rw-r--r-- 1 username wheel ...`, де перше число - це ідентифікатор тому, де існує файл, а друге - номер inode. Ви можете отримати доступ до вмісту цього файлу через /.vol/ з цією інформацією, запустивши `cat /.vol/16777223/7545753`
### Папки додатків
- **Системні програми** розташовані в `/System/Applications`
- **Встановлені** програми зазвичай встановлюються в `/Applications` або в `~/Applications`
- **Дані програми** можна знайти в `/Library/Application Support` для програм, що працюють від імені root, і `~/Library/Application Support` для програм, що працюють від імені користувача.
- Сторонні програми **демони**, які **потрібно запускати від імені root**, зазвичай розташовані в `/Library/PrivilegedHelperTools/`
- **Пісочниці** програми відображаються в папці `~/Library/Containers`. Кожна програма має папку, названу відповідно до ідентифікатора пакету програми (`com.apple.Safari`).
- **Ядро** розташоване в `/System/Library/Kernels/kernel`
- **Розширення ядра Apple** розташовані в `/System/Library/Extensions`
- **Сторонні розширення ядра** зберігаються в `/Library/Extensions`
### Файли з чутливою інформацією
MacOS зберігає інформацію, таку як паролі, у кількох місцях:
{{#ref}}
macos-sensitive-locations.md
{{#endref}}
### Вразливі установники pkg
{{#ref}}
macos-installers-abuse.md
{{#endref}}
## Специфічні розширення OS X
- **`.dmg`**: Файли образу диска Apple дуже поширені для установників.
- **`.kext`**: Він повинен відповідати певній структурі і є версією драйвера для OS X. (це пакет)
- **`.plist`**: Відомий також як список властивостей, зберігає інформацію в XML або бінарному форматі.
- Може бути XML або бінарним. Бінарні можна прочитати за допомогою:
- `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, які дотримуються структури каталогу (це пакет).
- **`.dylib`**: Динамічні бібліотеки (як файли DLL Windows)
- **`.pkg`**: Це те ж саме, що і xar (формат розширеного архіву). Команда установника може бути використана для встановлення вмісту цих файлів.
- **`.DS_Store`**: Цей файл є в кожному каталозі, він зберігає атрибути та налаштування каталогу.
- **`.Spotlight-V100`**: Ця папка з'являється в кореневому каталозі кожного тому в системі.
- **`.metadata_never_index`**: Якщо цей файл знаходиться в корені тому, Spotlight не буде індексувати цей том.
- **`.noindex`**: Файли та папки з цим розширенням не будуть індексуватися Spotlight.
- **`.sdef`**: Файли всередині пакетів, що вказують, як можна взаємодіяти з програмою з AppleScript.
### Пакети macOS
Пакет - це **каталог**, який **виглядає як об'єкт у Finder** (приклад пакета - це файли `*.app`).
{{#ref}}
macos-bundles.md
{{#endref}}
## Кеш спільних бібліотек Dyld (SLC)
У macOS (і iOS) всі системні спільні бібліотеки, такі як фреймворки та dylibs, **об'єднані в один файл**, який називається **кешем спільного dyld**. Це покращує продуктивність, оскільки код може завантажуватися швидше.
Це розташовано в macOS в `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`, а в старіших версіях ви можете знайти **спільний кеш** в **`/System/Library/dyld/`**.\
В iOS ви можете знайти їх у **`/System/Library/Caches/com.apple.dyld/`**.
Подібно до кешу спільного dyld, ядро та розширення ядра також компілюються в кеш ядра, який завантажується під час завантаження.
Щоб витягти бібліотеки з єдиного файлу кешу спільного dylib, можна було використовувати бінарний [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip), який, можливо, зараз не працює, але ви також можете використовувати [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
```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]
> Зверніть увагу, що навіть якщо інструмент `dyld_shared_cache_util` не працює, ви можете передати **спільний двійковий файл dyld в Hopper**, і Hopper зможе ідентифікувати всі бібліотеки та дозволити вам **вибрати, яку саме** ви хочете дослідити:
Деякі екстрактори не працюватимуть, оскільки dylibs попередньо зв'язані з жорстко закодованими адресами, тому вони можуть переходити на невідомі адреси.
> [!TIP]
> Також можливо завантажити кеш спільних бібліотек інших \*OS пристроїв в macos, використовуючи емулятор в Xcode. Вони будуть завантажені в: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport//Symbols/System/Library/Caches/com.apple.dyld/`, наприклад: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
### Mapping SLC
**`dyld`** використовує системний виклик **`shared_region_check_np`**, щоб дізнатися, чи був SLC змапований (що повертає адресу), і **`shared_region_map_and_slide_np`**, щоб змапувати SLC.
Зверніть увагу, що навіть якщо SLC зсувається при першому використанні, всі **процеси** використовують **ту ж саму копію**, що **усуває захист ASLR**, якщо зловмисник зміг запустити процеси в системі. Це насправді було використано в минулому і виправлено за допомогою спільного регіонального пагера.
Пул гілок - це маленькі Mach-O dylibs, які створюють невеликі простори між відображеннями зображень, що ускладнює перехоплення функцій.
### Override SLCs
Використовуючи змінні середовища:
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR= DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Це дозволить завантажити новий кеш спільних бібліотек.
- **`DYLD_SHARED_CACHE_DIR=avoid`** і вручну замінити бібліотеки на символічні посилання на спільний кеш з реальними (вам потрібно буде їх витягти).
## Special File Permissions
### Folder permissions
У **папці**, **читання** дозволяє **переглядати її**, **запис** дозволяє **видаляти** та **записувати** файли в ній, а **виконання** дозволяє **переміщатися** по директорії. Тож, наприклад, користувач з **дозволом на читання файлу** всередині директорії, де він **не має дозволу на виконання**, **не зможе прочитати** файл.
### Flag modifiers
Є деякі прапори, які можуть бути встановлені у файлах, що змусить файл поводитися інакше. Ви можете **перевірити прапори** файлів всередині директорії за допомогою `ls -lO /path/directory`
- **`uchg`**: Відомий як **uchange** прапор, який **запобігає будь-якій дії** зміни або видалення **файлу**. Щоб його встановити, виконайте: `chflags uchg file.txt`
- Користувач root може **зняти прапор** і змінити файл.
- **`restricted`**: Цей прапор робить файл **захищеним SIP** (ви не можете додати цей прапор до файлу).
- **`Sticky bit`**: Якщо директорія має sticky bit, **тільки** власник **директорії або root можуть перейменовувати або видаляти** файли. Зазвичай це встановлюється на директорії /tmp, щоб запобігти звичайним користувачам видаляти або переміщати файли інших користувачів.
Всі прапори можна знайти у файлі `sys/stat.h` (знайдіть його за допомогою `mdfind stat.h | grep stat.h`) і вони є:
- `UF_SETTABLE` 0x0000ffff: Маска прапорів, що можуть змінюватися власником.
- `UF_NODUMP` 0x00000001: Не створювати дамп файлу.
- `UF_IMMUTABLE` 0x00000002: Файл не може бути змінений.
- `UF_APPEND` 0x00000004: Записи у файл можуть лише додаватися.
- `UF_OPAQUE` 0x00000008: Директорія є непрозорою щодо об'єднання.
- `UF_COMPRESSED` 0x00000020: Файл стиснутий (деякі файлові системи).
- `UF_TRACKED` 0x00000040: Немає сповіщень про видалення/перейменування для файлів з цим встановленим прапором.
- `UF_DATAVAULT` 0x00000080: Потрібно право для читання та запису.
- `UF_HIDDEN` 0x00008000: Підказка, що цей елемент не повинен відображатися в GUI.
- `SF_SUPPORTED` 0x009f0000: Маска прапорів, що підтримуються суперкористувачем.
- `SF_SETTABLE` 0x3fff0000: Маска прапорів, що можуть змінюватися суперкористувачем.
- `SF_SYNTHETIC` 0xc0000000: Маска системних синтетичних прапорів, що є тільки для читання.
- `SF_ARCHIVED` 0x00010000: Файл архівований.
- `SF_IMMUTABLE` 0x00020000: Файл не може бути змінений.
- `SF_APPEND` 0x00040000: Записи у файл можуть лише додаватися.
- `SF_RESTRICTED` 0x00080000: Потрібно право для запису.
- `SF_NOUNLINK` 0x00100000: Елемент не може бути видалений, перейменований або змонтований.
- `SF_FIRMLINK` 0x00800000: Файл є firmlink.
- `SF_DATALESS` 0x40000000: Файл є об'єктом без даних.
### **File ACLs**
Файлові **ACLs** містять **ACE** (Записи контролю доступу), де можуть бути призначені більш **деталізовані дозволи** для різних користувачів.
Можна надати **директорії** ці дозволи: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
А для **файлу**: `read`, `write`, `append`, `execute`.
Коли файл містить ACLs, ви **знайдете "+" при переліку дозволів, як у**:
```bash
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
```
Ви можете **прочитати ACL** файлу за допомогою:
```bash
ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
0: group:everyone deny delete
```
Ви можете знайти **всі файли з ACL** за допомогою (це дуже повільно):
```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
```
### Розширені атрибути
Розширені атрибути мають ім'я та будь-яке бажане значення, і їх можна переглядати за допомогою `ls -@` та маніпулювати за допомогою команди `xattr`. Деякі поширені розширені атрибути:
- `com.apple.resourceFork`: Сумісність з ресурсними форками. Також видно як `filename/..namedfork/rsrc`
- `com.apple.quarantine`: MacOS: механізм карантину Gatekeeper (III/6)
- `metadata:*`: MacOS: різні метадані, такі як `_backup_excludeItem`, або `kMD*`
- `com.apple.lastuseddate` (#PS): Дата останнього використання файлу
- `com.apple.FinderInfo`: MacOS: інформація Finder (наприклад, кольорові мітки)
- `com.apple.TextEncoding`: Визначає кодування тексту файлів ASCII
- `com.apple.logd.metadata`: Використовується logd для файлів у `/var/db/diagnostics`
- `com.apple.genstore.*`: Генераційне зберігання (`/.DocumentRevisions-V100` у корені файлової системи)
- `com.apple.rootless`: MacOS: Використовується захистом цілісності системи для маркування файлів (III/10)
- `com.apple.uuidb.boot-uuid`: маркування logd епох завантаження з унікальним UUID
- `com.apple.decmpfs`: MacOS: Прозоре стиснення файлів (II/7)
- `com.apple.cprotect`: \*OS: Дані шифрування для кожного файлу (III/11)
- `com.apple.installd.*`: \*OS: Метадані, що використовуються installd, наприклад, `installType`, `uniqueInstallID`
### Ресурсні форки | macOS ADS
Це спосіб отримати **Альтернативні потоки даних у MacOS**. Ви можете зберігати вміст всередині розширеного атрибута під назвою **com.apple.ResourceFork** всередині файлу, зберігаючи його в **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
```
Ви можете **знайти всі файли, що містять цей розширений атрибут** за допомогою:
```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
Розширена атрибутика `com.apple.decmpfs` вказує на те, що файл зберігається в зашифрованому вигляді, `ls -l` повідомить про **розмір 0**, а стиснуті дані знаходяться всередині цього атрибута. Кожного разу, коли файл відкривається, він буде розшифрований в пам'яті.
Цей атрибут можна побачити за допомогою `ls -lO`, вказаним як стиснутий, оскільки стиснуті файли також позначені прапором `UF_COMPRESSED`. Якщо стиснутий файл буде видалено з цього прапора за допомогою `chflags nocompressed `, система не знатиме, що файл був стиснутий, і тому не зможе розпакувати та отримати доступ до даних (вона подумає, що він насправді порожній).
Інструмент afscexpand можна використовувати для примусового розпакування файлу.
## **Універсальні бінарні файли &** Формат Mach-o
Бінарні файли Mac OS зазвичай компілюються як **універсальні бінарні файли**. **Універсальний бінарний файл** може **підтримувати кілька архітектур в одному файлі**.
{{#ref}}
universal-binaries-and-mach-o-format.md
{{#endref}}
## macOS Процес Пам'яті
## Вивантаження пам'яті macOS
{{#ref}}
macos-memory-dumping.md
{{#endref}}
## Категорія ризику файлів Mac OS
Каталог `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` є місцем, де зберігається інформація про **ризик, пов'язаний з різними розширеннями файлів**. Цей каталог класифікує файли за різними рівнями ризику, впливаючи на те, як Safari обробляє ці файли під час завантаження. Категорії такі:
- **LSRiskCategorySafe**: Файли в цій категорії вважаються **абсолютно безпечними**. Safari автоматично відкриє ці файли після їх завантаження.
- **LSRiskCategoryNeutral**: Ці файли не супроводжуються попередженнями і **не відкриваються автоматично** Safari.
- **LSRiskCategoryUnsafeExecutable**: Файли в цій категорії **викликають попередження**, що вказує на те, що файл є додатком. Це служить заходом безпеки для попередження користувача.
- **LSRiskCategoryMayContainUnsafeExecutable**: Ця категорія призначена для файлів, таких як архіви, які можуть містити виконуваний файл. Safari **викличе попередження**, якщо не зможе підтвердити, що всі вмісти безпечні або нейтральні.
## Лог файли
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Містить інформацію про завантажені файли, такі як URL, з якого вони були завантажені.
- **`/var/log/system.log`**: Основний журнал систем OSX. com.apple.syslogd.plist відповідає за виконання syslogging (ви можете перевірити, чи він вимкнений, шукаючи "com.apple.syslogd" у `launchctl list`).
- **`/private/var/log/asl/*.asl`**: Це журнали системи Apple, які можуть містити цікаву інформацію.
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Зберігає нещодавно відкриті файли та програми через "Finder".
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Зберігає елементи для запуску під час старту системи.
- **`$HOME/Library/Logs/DiskUtility.log`**: Журнал для програми DiskUtility (інформація про диски, включаючи USB).
- **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Дані про бездротові точки доступу.
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Список деактивованих демонів.
{{#include ../../../banners/hacktricks-training.md}}