macOS Keychain
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ключовий ланцюг користувача (~/Library/Keychains/login.keychain-db
), який використовується для зберігання облікових даних, специфічних для користувача, таких як паролі додатків, паролі в Інтернеті, сертифікати, створені користувачем, паролі мережі та публічні/приватні ключі, створені користувачем.
Системний ключовий ланцюг (/Library/Keychains/System.keychain
), який зберігає системні облікові дані, такі як паролі WiFi, кореневі сертифікати системи, приватні ключі системи та паролі додатків системи.
Можна знайти інші компоненти, такі як сертифікати в /System/Library/Keychains/*
В iOS є лише один ключовий ланцюг, розташований у /private/var/Keychains/
. Ця папка також містить бази даних для TrustStore
, органів сертифікації (caissuercache
) та записів OSCP (ocspache
).
Додатки будуть обмежені в ключовому ланцюзі лише до їх приватної області на основі їх ідентифікатора додатка.
Ці файли, хоча й не мають вбудованого захисту і можуть бути завантажені, зашифровані і вимагають плоского пароля користувача для розшифровки. Інструмент, такий як Chainbreaker, може бути використаний для розшифровки.
Кожен запис у ключовому ланцюзі регулюється Списками контролю доступу (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
Перерахунок keychain та вивантаження** секретів, які не викликають запит, можна виконати за допомогою інструмента LockSmith
Інші кінцеві точки API можна знайти в SecKeyChain.h вихідному коді.
Перелічіть та отримайте інформацію про кожен запис у keychain, використовуючи Security Framework, або ви також можете перевірити відкритий інструмент командного рядка Apple security. Деякі приклади API:
API SecItemCopyMatching
надає інформацію про кожен запис, і є кілька атрибутів, які ви можете встановити при його використанні:
kSecReturnData
: Якщо істинно, він спробує розшифрувати дані (встановіть на хибне, щоб уникнути потенційних спливаючих вікон)
kSecReturnRef
: Отримати також посилання на елемент keychain (встановіть на істинне, якщо пізніше ви побачите, що можете розшифрувати без спливаючого вікна)
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 зберігав у відкритому тексті всі токени оновлення для доступу до чутливих кінцевих точок.
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)