macOS Keychain
Reading time: 6 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Haupt-Keychains
- Der Benutzer-Keychain (
~/Library/Keychains/login.keychain-db
), der verwendet wird, um benutzerspezifische Anmeldeinformationen wie Anwendungskennwörter, Internetkennwörter, benutzergenerierte Zertifikate, Netzwerkkennwörter und benutzergenerierte öffentliche/private Schlüssel zu speichern. - Der System-Keychain (
/Library/Keychains/System.keychain
), der systemweite Anmeldeinformationen wie WiFi-Kennwörter, Systemstammzertifikate, systemprivate Schlüssel und Systemanwendungskennwörter speichert. - Es ist möglich, andere Komponenten wie Zertifikate in
/System/Library/Keychains/*
zu finden. - In iOS gibt es nur einen Keychain, der sich in
/private/var/Keychains/
befindet. Dieser Ordner enthält auch Datenbanken für denTrustStore
, Zertifizierungsstellen (caissuercache
) und OSCP-Einträge (ocspache
). - Apps werden im Keychain nur auf ihren privaten Bereich basierend auf ihrer Anwendungskennung beschränkt.
Passwort-Keychain-Zugriff
Diese Dateien, obwohl sie keinen inhärenten Schutz haben und heruntergeladen werden können, sind verschlüsselt und erfordern das Klartextpasswort des Benutzers zur Entschlüsselung. Ein Tool wie Chainbreaker könnte zur Entschlüsselung verwendet werden.
Schutz der Keychain-Einträge
ACLs
Jeder Eintrag im Keychain wird durch Zugriffskontrolllisten (ACLs) geregelt, die festlegen, wer verschiedene Aktionen auf dem Keychain-Eintrag ausführen kann, einschließlich:
- ACLAuhtorizationExportClear: Erlaubt dem Inhaber, den Klartext des Geheimnisses zu erhalten.
- ACLAuhtorizationExportWrapped: Erlaubt dem Inhaber, den Klartext, der mit einem anderen bereitgestellten Passwort verschlüsselt ist, zu erhalten.
- ACLAuhtorizationAny: Erlaubt dem Inhaber, jede Aktion auszuführen.
Die ACLs werden zusätzlich von einer Liste vertrauenswürdiger Anwendungen begleitet, die diese Aktionen ohne Aufforderung ausführen können. Dies könnte sein:
- N
il
(keine Autorisierung erforderlich, jeder ist vertrauenswürdig) - Eine leere Liste (niemand ist vertrauenswürdig)
- Liste spezifischer Anwendungen.
Außerdem könnte der Eintrag den Schlüssel ACLAuthorizationPartitionID
enthalten, der verwendet wird, um die teamid, apple und cdhash zu identifizieren.
- Wenn die teamid angegeben ist, muss die verwendete Anwendung, um den Eintrag ohne Aufforderung zu zugreifen, die gleiche teamid haben.
- Wenn apple angegeben ist, muss die App von Apple signiert sein.
- Wenn die cdhash angegeben ist, muss die App die spezifische cdhash haben.
Erstellen eines Keychain-Eintrags
Wenn ein neuer Eintrag mit Keychain Access.app
erstellt wird, gelten die folgenden Regeln:
- Alle Apps können verschlüsseln.
- Keine Apps können exportieren/entschlüsseln (ohne den Benutzer aufzufordern).
- Alle Apps können die Integritätsprüfung sehen.
- Keine Apps können ACLs ändern.
- Die partitionID wird auf
apple
gesetzt.
Wenn eine Anwendung einen Eintrag im Keychain erstellt, sind die Regeln etwas anders:
- Alle Apps können verschlüsseln.
- Nur die erstellende Anwendung (oder andere explizit hinzugefügte Apps) können exportieren/entschlüsseln (ohne den Benutzer aufzufordern).
- Alle Apps können die Integritätsprüfung sehen.
- Keine Apps können die ACLs ändern.
- Die partitionID wird auf
teamid:[teamID hier]
gesetzt.
Zugriff auf den 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
tip
Die Aufzählung und das Dumping von Geheimnissen, die keine Eingabeaufforderung erzeugen, kann mit dem Tool LockSmith durchgeführt werden.
Weitere API-Endpunkte finden Sie im Quellcode von SecKeyChain.h.
Listen Sie die Informationen zu jedem Schlüsselbund-Eintrag mit dem Security Framework auf oder überprüfen Sie auch das Open-Source-CLI-Tool von Apple security. Einige API-Beispiele:
- Die API
SecItemCopyMatching
gibt Informationen zu jedem Eintrag und es gibt einige Attribute, die Sie bei der Verwendung festlegen können: kSecReturnData
: Wenn wahr, wird versucht, die Daten zu entschlüsseln (auf falsch setzen, um potenzielle Pop-ups zu vermeiden)kSecReturnRef
: Auch Referenz auf den Schlüsselbund-Eintrag erhalten (auf wahr setzen, falls Sie später sehen, dass Sie ohne Pop-up entschlüsseln können)kSecReturnAttributes
: Metadaten über Einträge erhaltenkSecMatchLimit
: Wie viele Ergebnisse zurückgegeben werden sollenkSecClass
: Welche Art von Schlüsselbund-Eintrag
Erhalten Sie die ACLs jedes Eintrags:
- Mit der API
SecAccessCopyACLList
können Sie die ACL für den Schlüsselbund-Eintrag abrufen, und es wird eine Liste von ACLs zurückgegeben (wieACLAuhtorizationExportClear
und die zuvor genannten), wobei jede Liste hat: - Beschreibung
- Vertrauenswürdige Anwendungs-Liste. Dies könnte sein:
- Eine App: /Applications/Slack.app
- Ein Binary: /usr/libexec/airportd
- Eine Gruppe: group://AirPort
Exportieren Sie die Daten:
- Die API
SecKeychainItemCopyContent
erhält den Klartext - Die API
SecItemExport
exportiert die Schlüssel und Zertifikate, könnte jedoch erforderlich sein, Passwörter festzulegen, um den Inhalt verschlüsselt zu exportieren
Und dies sind die Anforderungen, um ein Geheimnis ohne Eingabeaufforderung zu exportieren:
- Wenn 1+ vertrauenswürdige Apps aufgelistet sind:
- Benötigen Sie die entsprechenden Berechtigungen (
Nil
, oder Teil der erlaubten Liste von Apps in der Berechtigung zum Zugriff auf die geheimen Informationen sein) - Benötigen Sie eine Codesignatur, die mit PartitionID übereinstimmt
- Benötigen Sie eine Codesignatur, die mit der eines vertrauenswürdigen Apps übereinstimmt (oder Mitglied der richtigen KeychainAccessGroup sein)
- Wenn alle Anwendungen vertrauenswürdig sind:
- Benötigen Sie die entsprechenden Berechtigungen
- Benötigen Sie eine Codesignatur, die mit PartitionID übereinstimmt
- Wenn keine PartitionID, dann ist dies nicht erforderlich
caution
Daher, wenn 1 Anwendung aufgelistet ist, müssen Sie Code in dieser Anwendung injizieren.
Wenn apple in der partitionID angegeben ist, könnten Sie darauf mit osascript
zugreifen, sodass alles, was alle Anwendungen mit apple in der partitionID vertraut, darauf zugreifen kann. Python
könnte auch dafür verwendet werden.
Zwei zusätzliche Attribute
- Unsichtbar: Es ist ein boolesches Flag, um den Eintrag aus der UI Schlüsselbund-App zu verbergen
- Allgemein: Es dient zur Speicherung von Metadaten (es ist also NICHT VERSCHLÜSSELT)
- Microsoft speicherte alle Refresh-Token im Klartext, um auf sensible Endpunkte zuzugreifen.
References
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.