macOS Keychain

Support HackTricks

Main Keychains

  • Korisnički ključ (~/Library/Keychains/login.keycahin-db), koji se koristi za čuvanje korisničkih kredencijala kao što su lozinke za aplikacije, lozinke za internet, korisnički generisani sertifikati, lozinke za mrežu i korisnički generisani javni/privatni ključevi.

  • Sistemski ključ (/Library/Keychains/System.keychain), koji čuva sistemske kredencijale kao što su WiFi lozinke, sistemski root sertifikati, sistemski privatni ključevi i lozinke za sistemske aplikacije.

Pristup lozinkama u ključu

Ove datoteke, iako nemaju inherentnu zaštitu i mogu biti preuzete, su enkriptovane i zahtevaju korisničku lozinku u čistom tekstu za dekripciju. Alat kao što je Chainbreaker može se koristiti za dekripciju.

Zaštita unosa u ključ

ACLs

Svaki unos u ključu je pod kontrolom Lista Kontrole Pristupa (ACLs) koje određuju ko može da izvrši različite radnje na unosu u ključ, uključujući:

  • ACLAuhtorizationExportClear: Omogućava nosiocu da dobije čist tekst tajne.

  • ACLAuhtorizationExportWrapped: Omogućava nosiocu da dobije čist tekst enkriptovan drugom datom lozinkom.

  • ACLAuhtorizationAny: Omogućava nosiocu da izvrši bilo koju radnju.

ACLs su dodatno praćene listom pouzdanih aplikacija koje mogu izvršiti ove radnje bez traženja potvrde. Ovo može biti:

  • Nil (nije potrebna autorizacija, svi su pouzdani)

  • Prazna lista (niko nije pouzdan)

  • Lista specifičnih aplikacija.

Takođe, unos može sadržati ključ ACLAuthorizationPartitionID, koji se koristi za identifikaciju teamid, apple, i cdhash.

  • Ako je teamid specificiran, tada da bi se pristupilo vrednosti unosa bez potvrde aplikacija koja se koristi mora imati isti teamid.

  • Ako je apple specificiran, tada aplikacija mora biti potpisana od strane Apple.

  • Ako je cdhash naznačen, tada aplikacija mora imati specifični cdhash.

Kreiranje unosa u ključ

Kada se novi unos kreira koristeći Keychain Access.app, sledeća pravila se primenjuju:

  • Sve aplikacije mogu enkriptovati.

  • Nijedna aplikacija ne može izvesti/dekriptovati (bez traženja potvrde od korisnika).

  • Sve aplikacije mogu videti proveru integriteta.

  • Nijedna aplikacija ne može menjati ACLs.

  • partitionID je postavljen na apple.

Kada aplikacija kreira unos u ključ, pravila su malo drugačija:

  • Sve aplikacije mogu enkriptovati.

  • Samo aplikacija koja kreira (ili bilo koja druga aplikacija eksplicitno dodata) može izvesti/dekriptovati (bez traženja potvrde od korisnika).

  • Sve aplikacije mogu videti proveru integriteta.

  • Nijedna aplikacija ne može menjati ACLs.

  • partitionID je postavljen na teamid:[teamID ovde].

Pristupanje ključu

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

Enumeracija i dumpovanje tajni koje neće generisati prompt može se uraditi sa alatom LockSmith

Lista i dobijanje informacija o svakom unosu u keychain:

  • API SecItemCopyMatching daje informacije o svakom unosu i postoje neki atributi koje možete postaviti prilikom korišćenja:

  • kSecReturnData: Ako je tačno, pokušaće da dekriptuje podatke (postavite na netačno da biste izbegli potencijalne iskačuće prozore)

  • kSecReturnRef: Takođe dobijate referencu na stavku keychain-a (postavite na tačno u slučaju da kasnije vidite da možete dekriptovati bez iskačućeg prozora)

  • kSecReturnAttributes: Dobijate metapodatke o unosima

  • kSecMatchLimit: Koliko rezultata da se vrati

  • kSecClass: Koja vrsta unosa u keychain

Dobijanje ACL-ova svakog unosa:

  • Sa API-jem SecAccessCopyACLList možete dobiti ACL za stavku keychain-a, i vratiće listu ACL-ova (kao što su ACLAuhtorizationExportClear i drugi prethodno pomenuti) gde svaka lista ima:

  • Opis

  • Lista pouzdanih aplikacija. Ovo može biti:

  • Aplikacija: /Applications/Slack.app

  • Binarni fajl: /usr/libexec/airportd

  • Grupa: group://AirPort

Izvoz podataka:

  • API SecKeychainItemCopyContent dobija plaintext

  • API SecItemExport izvozi ključeve i sertifikate, ali možda će biti potrebno postaviti lozinke za izvoz sadržaja enkriptovanog

I ovo su zahtevi da biste mogli da izvezete tajnu bez prompta:

  • Ako su 1+ pouzdane aplikacije navedene:

  • Potrebne su odgovarajuće autorizacije (Nil, ili biti deo dozvoljene liste aplikacija u autorizaciji za pristup tajnim informacijama)

  • Potrebna je potpisna šifra koja se poklapa sa PartitionID

  • Potrebna je potpisna šifra koja se poklapa sa jednom pouzdanom aplikacijom (ili biti član prave KeychainAccessGroup)

  • Ako su sve aplikacije pouzdane:

  • Potrebne su odgovarajuće autorizacije

  • Potrebna je potpisna šifra koja se poklapa sa PartitionID

  • Ako nema PartitionID, onda ovo nije potrebno

Dakle, ako postoji 1 aplikacija navedena, potrebno je ubaciti kod u tu aplikaciju.

Ako je apple naznačen u partitionID, mogli biste mu pristupiti sa osascript tako da bilo šta što veruje svim aplikacijama sa apple u partitionID. Python se takođe može koristiti za ovo.

Dva dodatna atributa

  • Nevidljivo: To je boolean zastavica za sakrivanje unosa iz UI aplikacije Keychain

  • Opšte: To je za čuvanje metapodataka (tako da nije ENKRIPTOVANO)

  • Microsoft je čuvao u običnom tekstu sve osvežavajuće tokene za pristup osetljivim krajnjim tačkama.

Reference

Podrška HackTricks

Last updated