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, який, можливо, вже не працює, але ви також можете використовувати dyldextractor:
# 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/<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, ви знайдете "+" при переліку дозволів, як у:
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
Ви можете прочитати ACL файлу за допомогою:
ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
0: group:everyone deny delete
Ви можете знайти всі файли з ACL за допомогою (це дуже повільно):
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
Розширені Атрибути
Розширені атрибути мають ім'я та будь-яке бажане значення, і їх можна переглядати за допомогою ls -@
та маніпулювати за допомогою команди xattr
. Деякі загальні розширені атрибути:
com.apple.resourceFork
: Сумісність з ресурсними fork. Також видно як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: Використовується System Integrity Protection для маркування файлу (III/10)com.apple.uuidb.boot-uuid
: маркування logd епох завантаження з унікальним UUIDcom.apple.decmpfs
: MacOS: Прозоре стиснення файлів (II/7)com.apple.cprotect
: *OS: Дані шифрування для кожного файлу (III/11)com.apple.installd.*
: *OS: Метадані, що використовуються installd, наприклад,installType
,uniqueInstallID
Ресурсні Forks | macOS ADS
Це спосіб отримати Альтернативні Потоки Даних у MacOS. Ви можете зберігати вміст всередині розширеного атрибута під назвою com.apple.ResourceFork всередині файлу, зберігаючи його в file/..namedfork/rsrc.
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
Ви можете знайти всі файли, що містять цей розширений атрибут за допомогою:
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}}