macOS Keychain

Reading time: 5 minutes

tip

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

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

Main Keychains

  • Ключниця користувача (~/Library/Keychains/login.keychain-db), яка використовується для зберігання облікових даних, специфічних для користувача, таких як паролі додатків, паролі в Інтернеті, сертифікати, створені користувачем, паролі мережі та публічні/приватні ключі, створені користувачем.
  • Системна ключниця (/Library/Keychains/System.keychain), яка зберігає системні облікові дані, такі як паролі WiFi, кореневі сертифікати системи, приватні ключі системи та паролі додатків системи.
  • Можна знайти інші компоненти, такі як сертифікати, у /System/Library/Keychains/*
  • У iOS є лише одна ключниця, розташована в /private/var/Keychains/. Ця папка також містить бази даних для TrustStore, органів сертифікації (caissuercache) та записів OSCP (ocspache).
  • Додатки будуть обмежені в ключниці лише до їх приватної області на основі їх ідентифікатора додатка.

Доступ до ключниці паролів

Ці файли, хоча й не мають вбудованого захисту і можуть бути завантажені, зашифровані і вимагають плоского пароля користувача для розшифровки. Інструмент, такий як Chainbreaker, може бути використаний для розшифровки.

Захист записів ключниці

ACLs

Кожен запис у ключниці регулюється Списками контролю доступу (ACLs), які визначають, хто може виконувати різні дії над записом ключниці, включаючи:

  • ACLAuhtorizationExportClear: Дозволяє власнику отримати відкритий текст секрету.
  • ACLAuhtorizationExportWrapped: Дозволяє власнику отримати відкритий текст, зашифрований іншим наданим паролем.
  • ACLAuhtorizationAny: Дозволяє власнику виконувати будь-яку дію.

ACL супроводжуються переліком довірених додатків, які можуть виконувати ці дії без запиту. Це може бути:

  • Nil (необхідна авторизація, всі довірені)
  • порожній список (ніхто не довірений)
  • Список конкретних додатків.

Також запис може містити ключ ACLAuthorizationPartitionID, який використовується для ідентифікації teamid, apple, та cdhash.

  • Якщо teamid вказано, то для доступу до значення запису без запиту використовуваний додаток повинен мати той же teamid.
  • Якщо apple вказано, то додаток повинен бути підписаний Apple.
  • Якщо cdhash вказано, то додаток повинен мати конкретний cdhash.

Створення запису в ключниці

Коли новий запис створюється за допомогою Keychain Access.app, застосовуються такі правила:

  • Усі додатки можуть шифрувати.
  • Жоден додаток не може експортувати/розшифровувати (без запиту користувача).
  • Усі додатки можуть бачити перевірку цілісності.
  • Жоден додаток не може змінювати ACLs.
  • partitionID встановлюється на apple.

Коли додаток створює запис у ключниці, правила трохи інші:

  • Усі додатки можуть шифрувати.
  • Тільки додаток, що створює, (або будь-які інші додатки, які явно додані) можуть експортувати/розшифровувати (без запиту користувача).
  • Усі додатки можуть бачити перевірку цілісності.
  • Жоден додаток не може змінювати ACLs.
  • partitionID встановлюється на teamid:[teamID here].

Доступ до ключниці

security

bash
# List keychains
security list-keychains

# Dump all metadata and decrypted secrets (a lot of pop-ups)
security dump-keychain -a -d

# Find generic password for the "Slack" account and print the secrets
security find-generic-password -a "Slack" -g

# Change the specified entrys PartitionID entry
security set-generic-password-parition-list -s "test service" -a "test acount" -S

# Dump specifically the user keychain
security dump-keychain ~/Library/Keychains/login.keychain-db

APIs

tip

Перерахунок ключів та вивантаження секретів, які не викликають запит, можна виконати за допомогою інструмента LockSmith

Інші кінцеві точки API можна знайти в SecKeyChain.h вихідному коді.

Список та отримання інформації про кожен запис ключа за допомогою Security Framework або ви також можете перевірити відкритий інструмент командного рядка Apple security. Деякі приклади API:

  • API SecItemCopyMatching надає інформацію про кожен запис, і є кілька атрибутів, які ви можете встановити при його використанні:
  • kSecReturnData: Якщо істинно, він спробує розшифрувати дані (встановіть в хибне, щоб уникнути потенційних спливаючих вікон)
  • kSecReturnRef: Отримати також посилання на елемент ключа (встановіть в істинне, якщо пізніше ви побачите, що можете розшифрувати без спливаючого вікна)
  • kSecReturnAttributes: Отримати метадані про записи
  • kSecMatchLimit: Скільки результатів повернути
  • kSecClass: Який тип запису ключа

Отримати ACL кожного запису:

  • За допомогою API SecAccessCopyACLList ви можете отримати ACL для елемента ключа, і він поверне список ACL (як ACLAuhtorizationExportClear та інші, згадані раніше), де кожен список має:
  • Опис
  • Список довірених додатків. Це може бути:
  • Додаток: /Applications/Slack.app
  • Бінарний файл: /usr/libexec/airportd
  • Група: group://AirPort

Експортувати дані:

  • API SecKeychainItemCopyContent отримує відкритий текст
  • API SecItemExport експортує ключі та сертифікати, але може знадобитися встановити паролі для експорту вмісту в зашифрованому вигляді

І це вимоги для того, щоб експортувати секрет без запиту:

  • Якщо 1+ довірених додатків у списку:
  • Потрібні відповідні авторизації (Nil, або бути частиною дозволеного списку додатків для авторизації доступу до секретної інформації)
  • Потрібен підпис коду, щоб відповідати PartitionID
  • Потрібен підпис коду, щоб відповідати одному довіреному додатку (або бути членом правильного KeychainAccessGroup)
  • Якщо всі додатки довірені:
  • Потрібні відповідні авторизації
  • Потрібен підпис коду, щоб відповідати PartitionID
  • Якщо немає PartitionID, тоді це не потрібно

caution

Отже, якщо є 1 додаток у списку, вам потрібно впровадити код у цей додаток.

Якщо apple вказано в partitionID, ви можете отримати доступ до нього за допомогою osascript, тому все, що довіряє всім додаткам з apple в partitionID. Python також можна використовувати для цього.

Два додаткові атрибути

  • Невидимий: Це булевий прапор для приховування запису з UI додатку Keychain
  • Загальний: Це для зберігання метаданих (тому це НЕ ЗАШИФРОВАНО)
  • Microsoft зберігала в відкритому тексті всі токени оновлення для доступу до чутливих кінцевих точок.

References

tip

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

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