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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
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 супроводжуються переліком довірених додатків, які можуть виконувати ці дії без запиту. Це може бути:
- N
il
(необхідна авторизація, всі довірені) - порожній список (ніхто не довірений)
- Список конкретних додатків.
Також запис може містити ключ ACLAuthorizationPartitionID
, який використовується для ідентифікації teamid, apple, та cdhash.
- Якщо teamid вказано, то для доступу до значення запису без запиту використовуваний додаток повинен мати той же teamid.
- Якщо apple вказано, то додаток повинен бути підписаний Apple.
- Якщо cdhash вказано, то додаток повинен мати конкретний cdhash.
Створення запису в ключниці
Коли новий запис створюється за допомогою Keychain Access.app
, застосовуються такі правила:
- Усі додатки можуть шифрувати.
- Жоден додаток не може експортувати/розшифровувати (без запиту користувача).
- Усі додатки можуть бачити перевірку цілісності.
- Жоден додаток не може змінювати ACLs.
- partitionID встановлюється на
apple
.
Коли додаток створює запис у ключниці, правила трохи інші:
- Усі додатки можуть шифрувати.
- Тільки додаток, що створює, (або будь-які інші додатки, які явно додані) можуть експортувати/розшифровувати (без запиту користувача).
- Усі додатки можуть бачити перевірку цілісності.
- Жоден додаток не може змінювати ACLs.
- partitionID встановлюється на
teamid:[teamID here]
.
Доступ до ключниці
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
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.