macOS Файли, Папки, Бінарні Файли та Пам'ять

Reading time: 11 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Структура файлової ієрархії

  • /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 зберігає інформацію, таку як паролі, у кількох місцях:

macOS Sensitive Locations & Interesting Daemons

Вразливі установники pkg

macOS Installers Abuse

Специфічні розширення 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).

macOS Bundles

Кеш спільних бібліотек 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:

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/<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 зазвичай компілюються як універсальні бінарні файли. Універсальний бінарний файл може підтримувати кілька архітектур в одному файлі.

macOS Universal binaries & Mach-O Format

macOS Процес Пам'яті

Вивантаження пам'яті macOS

macOS Memory Dumping

Категорія ризику файлів 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: Список деактивованих демонів.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks