9.6 KiB
macOS Keychain
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Main Keychains
- Il Keychain Utente (
~/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 Keychain di Sistema (
/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 richiedere conferma. 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 conferma 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 conferma all'utente).
- Tutte le app possono vedere il controllo di integrità.
- Nessuna app può modificare le ACL.
- Il partitionID è impostato su
teamid:[teamID qui]
.
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
{% hint style="success" %} 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. {% endhint %}
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 gli ACL 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 ogni elenco ha: - Descrizione
- Elenco delle applicazioni fidate. 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 fidate 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 fidata (o essere un membro del giusto KeychainAccessGroup)
- Se tutte le applicazioni sono fidate:
- Necessita delle appropriate autorizzazioni
- Necessita che la firma del codice corrisponda al PartitionID
- Se non c'è PartitionID, allora questo non è necessario
{% hint style="danger" %} 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 fidando tutte le applicazioni con apple nel partitionID. Python
potrebbe anche essere utilizzato per questo.
{% endhint %}
Due attributi aggiuntivi
- Invisible: È un flag booleano per nascondere l'elemento dall'app Keychain UI
- General: Serve a memorizzare metadati (quindi NON È CRIPTATO)
- Microsoft memorizzava in testo chiaro tutti i token di aggiornamento per accedere a endpoint sensibili.
References
{% hint style="success" %}
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il 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.