259 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 зможе ідентифікувати всі бібліотеки та дозволити вам **вибрати, яку саме** ви хочете дослідити:
<figure><img src="../../../images/image (1152).png" alt="" width="563"><figcaption></figcaption></figure>
Деякі екстрактори не працюватимуть, оскільки dylibs попередньо зв'язані з жорстко закодованими адресами, тому вони можуть переходити на невідомі адреси.
> [!TIP]
> Також можливо завантажити кеш спільних бібліотек інших \*OS пристроїв в macos, використовуючи емулятор в Xcode. Вони будуть завантажені в: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/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=</path/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 </path/to/file>`, система не знатиме, що файл був стиснутий, і тому не зможе розпакувати та отримати доступ до даних (вона подумає, що він насправді порожній).
Інструмент 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}}