macOS Keychain

Support HackTricks

Main Keychains

  • Ключова схованка користувача (~/Library/Keychains/login.keycahin-db), яка використовується для зберігання облікових даних, специфічних для користувача, таких як паролі додатків, паролі в Інтернеті, сертифікати, створені користувачем, паролі мережі та публічні/приватні ключі, створені користувачем.

  • Системна ключова схованка (/Library/Keychains/System.keychain), яка зберігає системні облікові дані, такі як паролі WiFi, кореневі сертифікати системи, приватні ключі системи та паролі додатків системи.

Password Keychain Access

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

Keychain Entries Protections

ACLs

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

  • ACLAuhtorizationExportClear: Дозволяє власнику отримати відкритий текст секрету.

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

  • ACLAuhtorizationAny: Дозволяє власнику виконувати будь-яку дію.

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

  • Nil (необхідна авторизація, всі довірені)

  • Порожній список (ніхто не довірений)

  • Список конкретних додатків.

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

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

  • Якщо apple вказано, то додаток повинен бути підписаний Apple.

  • Якщо cdhash вказано, то додаток повинен мати конкретний cdhash.

Creating a Keychain Entry

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

  • Усі додатки можуть шифрувати.

  • Жоден додаток не може експортувати/розшифровувати (без запиту користувача).

  • Усі додатки можуть бачити перевірку цілісності.

  • Жоден додаток не може змінювати ACL.

  • partitionID встановлюється на apple.

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

  • Усі додатки можуть шифрувати.

  • Тільки додаток, що створює (або будь-які інші додатки, які явно додані) можуть експортувати/розшифровувати (без запиту користувача).

  • Усі додатки можуть бачити перевірку цілісності.

  • Жоден додаток не може змінювати ACL.

  • partitionID встановлюється на teamid:[teamID here].

Accessing the Keychain

security

# 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

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

Список та отримання інформації про кожен запис у keychain:

  • API SecItemCopyMatching надає інформацію про кожен запис, і є кілька атрибутів, які ви можете встановити при його використанні:

  • kSecReturnData: Якщо true, він спробує розшифрувати дані (встановіть false, щоб уникнути потенційних спливаючих вікон)

  • kSecReturnRef: Отримати також посилання на елемент keychain (встановіть true, якщо пізніше ви побачите, що можете розшифрувати без спливаючого вікна)

  • kSecReturnAttributes: Отримати метадані про записи

  • kSecMatchLimit: Скільки результатів повернути

  • kSecClass: Який тип запису в keychain

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

  • За допомогою API SecAccessCopyACLList ви можете отримати ACL для елемента keychain, і він поверне список ACL (як ACLAuhtorizationExportClear та інші, згадані раніше), де кожен список має:

  • Опис

  • Список довірених додатків. Це може бути:

  • Додаток: /Applications/Slack.app

  • Бінарний файл: /usr/libexec/airportd

  • Група: group://AirPort

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

  • API SecKeychainItemCopyContent отримує відкритий текст

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

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

  • Якщо 1+ довірених додатків у списку:

  • Потрібні відповідні авторизації (Nil, або бути частиною дозволеного списку додатків у авторизації для доступу до секретної інформації)

  • Потрібен підпис коду, щоб відповідати PartitionID

  • Потрібен підпис коду, щоб відповідати підпису одного довіреного додатку (або бути членом правильного KeychainAccessGroup)

  • Якщо всі додатки довірені:

  • Потрібні відповідні авторизації

  • Потрібен підпис коду, щоб відповідати PartitionID

  • Якщо немає PartitionID, тоді це не потрібно

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

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

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

  • Невидимий: Це булевий прапорець для приховування запису з UI додатку Keychain

  • Загальний: Це для зберігання метаданих (тому це НЕ ЗАШИФРОВАНО)

  • Microsoft зберігав у відкритому тексті всі токени оновлення для доступу до чутливих кінцевих точок.

References

Підтримати HackTricks

Last updated