macOS Keychain
Reading time: 6 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Main Keychains
- Il User Keychain (
~/Library/Keychains/login.keychain-db
), che viene utilizzato per memorizzare credenziali specifiche dell'utente come password delle applicazioni, password di internet, certificati generati dall'utente, password di rete e chiavi pubbliche/private generate dall'utente. - Il System Keychain (
/Library/Keychains/System.keychain
), che memorizza credenziali a livello di sistema come password WiFi, certificati root di sistema, chiavi private di sistema e password delle applicazioni di sistema. - È possibile trovare altri componenti come certificati in
/System/Library/Keychains/*
- In iOS c'è solo un Keychain situato in
/private/var/Keychains/
. Questa cartella contiene anche database per ilTrustStore
, autorità di certificazione (caissuercache
) e voci OSCP (ocspache
). - Le app saranno limitate nel keychain solo alla loro area privata in base al loro identificatore di applicazione.
Password Keychain Access
Questi file, pur non avendo protezione intrinseca e potendo essere scaricati, sono crittografati e richiedono la password in chiaro dell'utente per essere decrittografati. Uno strumento come Chainbreaker potrebbe essere utilizzato per la decrittografia.
Keychain Entries Protections
ACLs
Ogni voce nel keychain è governata da Access Control Lists (ACLs) che determinano chi può eseguire varie azioni sulla voce del keychain, inclusi:
- ACLAuhtorizationExportClear: Consente al titolare di ottenere il testo in chiaro del segreto.
- ACLAuhtorizationExportWrapped: Consente al titolare di ottenere il testo in chiaro crittografato con un'altra password fornita.
- ACLAuhtorizationAny: Consente al titolare di eseguire qualsiasi azione.
Le ACL sono ulteriormente accompagnate da un elenco di applicazioni fidate che possono eseguire queste azioni senza richiesta. Questo potrebbe essere:
- N
il
(nessuna autorizzazione richiesta, tutti sono fidati) - Un elenco vuoto (nessuno è fidato)
- Elenco di applicazioni specifiche.
Inoltre, la voce potrebbe contenere la chiave ACLAuthorizationPartitionID
, che viene utilizzata per identificare il teamid, apple, e cdhash.
- Se il teamid è specificato, allora per accedere al valore della voce senza un prompt l'applicazione utilizzata deve avere lo stesso teamid.
- Se l'apple è specificato, allora l'app deve essere firmata da Apple.
- Se il cdhash è indicato, allora l'app deve avere il cdhash specifico.
Creating a Keychain Entry
Quando viene creata una nuova voce utilizzando Keychain Access.app
, si applicano le seguenti regole:
- Tutte le app possono crittografare.
- Nessuna app può esportare/decrittografare (senza richiedere all'utente).
- Tutte le app possono vedere il controllo di integrità.
- Nessuna app può modificare le ACL.
- Il partitionID è impostato su
apple
.
Quando un'applicazione crea una voce nel keychain, le regole sono leggermente diverse:
- Tutte le app possono crittografare.
- Solo l'applicazione che crea (o altre app esplicitamente aggiunte) può esportare/decrittografare (senza richiedere all'utente).
- Tutte le app possono vedere il controllo di integrità.
- Nessuna app può modificare le ACL.
- Il partitionID è impostato su
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
tip
L'enumerazione e il dumping del keychain di segreti che non genereranno un prompt possono essere effettuati con lo strumento LockSmith
Altri endpoint API possono essere trovati nel codice sorgente di SecKeyChain.h.
Elenca e ottieni info su ciascun elemento del keychain utilizzando il Security Framework oppure puoi anche controllare lo strumento cli open source di Apple security. Alcuni esempi di API:
- L'API
SecItemCopyMatching
fornisce informazioni su ciascun elemento e ci sono alcuni attributi che puoi impostare quando la utilizzi: kSecReturnData
: Se vero, tenterà di decrittografare i dati (imposta su falso per evitare potenziali pop-up)kSecReturnRef
: Ottieni anche un riferimento all'elemento del keychain (imposta su vero nel caso in cui successivamente vedi che puoi decrittografare senza pop-up)kSecReturnAttributes
: Ottieni metadati sugli elementikSecMatchLimit
: Quanti risultati restituirekSecClass
: Che tipo di elemento del keychain
Ottieni ACLs di ciascun elemento:
- Con l'API
SecAccessCopyACLList
puoi ottenere l'ACL per l'elemento del keychain, e restituirà un elenco di ACL (comeACLAuhtorizationExportClear
e gli altri precedentemente menzionati) dove ciascun elenco ha: - Descrizione
- Elenco delle Applicazioni Affidabili. Questo potrebbe essere:
- Un'app: /Applications/Slack.app
- Un binario: /usr/libexec/airportd
- Un gruppo: group://AirPort
Esporta i dati:
- L'API
SecKeychainItemCopyContent
ottiene il testo in chiaro - L'API
SecItemExport
esporta le chiavi e i certificati ma potrebbe essere necessario impostare le password per esportare il contenuto crittografato
E questi sono i requisiti per poter esportare un segreto senza un prompt:
- Se ci sono 1+ app affidabili elencate:
- Necessita delle appropriate autorizzazioni (
Nil
, o essere parte dell'elenco consentito di app nell'autorizzazione per accedere alle informazioni segrete) - Necessita che la firma del codice corrisponda al PartitionID
- Necessita che la firma del codice corrisponda a quella di un app affidabile (o essere un membro del giusto KeychainAccessGroup)
- Se tutte le applicazioni sono affidabili:
- Necessita delle appropriate autorizzazioni
- Necessita che la firma del codice corrisponda al PartitionID
- Se non c'è PartitionID, allora questo non è necessario
caution
Pertanto, se c'è 1 applicazione elencata, è necessario iniettare codice in quell'applicazione.
Se apple è indicato nel partitionID, potresti accedervi con osascript
quindi qualsiasi cosa che stia fidandosi di tutte le applicazioni con apple nel partitionID. Python
potrebbe essere utilizzato anche per questo.
Due attributi aggiuntivi
- Invisible: È un flag booleano per nascondere l'elemento dall'app Keychain UI
- General: Serve a memorizzare metadati (quindi NON è CRITTOGRAFATO)
- Microsoft memorizzava in testo chiaro tutti i token di aggiornamento per accedere a endpoint sensibili.
References
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.