macOS Keychain

HackTricks'i Destekleyin

Anahtar Zincirleri

  • Kullanıcı Anahtar Zinciri (~/Library/Keychains/login.keycahin-db), uygulama şifreleri, internet şifreleri, kullanıcı tarafından oluşturulan sertifikalar, ağ şifreleri ve kullanıcı tarafından oluşturulan açık/özel anahtarlar gibi kullanıcıya özgü kimlik bilgilerini saklamak için kullanılır.

  • Sistem Anahtar Zinciri (/Library/Keychains/System.keychain), WiFi şifreleri, sistem kök sertifikaları, sistem özel anahtarları ve sistem uygulama şifreleri gibi sistem genelinde kimlik bilgilerini saklar.

Şifre Anahtar Zinciri Erişimi

Bu dosyalar, doğrudan koruma içermemelerine rağmen indirilebilir, şifrelenmiştir ve şifresinin çözülmesi için kullanıcının düz metin şifresini gerektirir. Şifre çözme için Chainbreaker gibi bir araç kullanılabilir.

Anahtar Zinciri Girişleri Koruma

ACL'ler

Anahtar zincirindeki her giriş, çeşitli eylemleri gerçekleştirebilecek kişileri belirleyen Erişim Kontrol Listeleri (ACL'ler) ile yönetilir:

  • ACLAuhtorizationExportClear: Sahip olanın sıfır metin gizliliğini almasına izin verir.

  • ACLAuhtorizationExportWrapped: Sahip olanın başka bir sağlanan şifre ile şifrelenmiş sıfır metin almasına izin verir.

  • ACLAuhtorizationAny: Sahip olanın herhangi bir eylemi gerçekleştirmesine izin verir.

ACL'ler, bu eylemleri istem olmadan gerçekleştirebilecek güvenilir uygulamalar listesini de içerir. Bu şunlar olabilir:

  • Nil (yetki gerektirmiyor, herkes güvenilir)

  • Boş bir liste (hiç kimse güvenilir değil)

  • Belirli uygulamaların listesi.

Ayrıca giriş, ACLAuthorizationPartitionID anahtarını içerebilir; bu, teamid, apple ve cdhash'i tanımlamak için kullanılır.

  • Eğer teamid belirtilmişse, giriş değerine istem olmadan erişmek için kullanılan uygulamanın aynı teamid'ye sahip olması gerekir.

  • Eğer apple belirtilmişse, uygulamanın Apple tarafından imzalanmış olması gerekir.

  • Eğer cdhash belirtilmişse, uygulama belirli bir cdhash'e sahip olmalıdır.

Anahtar Zinciri Girişi Oluşturma

Bir yeni giriş Keychain Access.app kullanılarak oluşturulduğunda, aşağıdaki kurallar geçerlidir:

  • Tüm uygulamalar şifreleyebilir.

  • Hiçbir uygulama dışa aktaramaz/şifre çözemez (kullanıcıyı istemeden).

  • Tüm uygulamalar bütünlük kontrolünü görebilir.

  • Hiçbir uygulama ACL'leri değiştiremez.

  • partitionID apple olarak ayarlanır.

Bir uygulama anahtar zincirinde bir giriş oluşturduğunda, kurallar biraz farklıdır:

  • Tüm uygulamalar şifreleyebilir.

  • Sadece oluşturan uygulama (veya açıkça eklenen diğer uygulamalar) dışa aktarabilir/şifre çözebilir (kullanıcıyı istemeden).

  • Tüm uygulamalar bütünlük kontrolünü görebilir.

  • Hiçbir uygulama ACL'leri değiştiremez.

  • partitionID teamid:[teamID burada] olarak ayarlanır.

Anahtar Zincirine Erişim

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

Anahtar zinciri numaralandırması ve istemci istemi oluşturmayacak gizli bilgilerin dökümü LockSmith aracıyla yapılabilir.

Her anahtar zinciri girişi hakkında bilgi listeleyin ve alın:

  • API SecItemCopyMatching her giriş hakkında bilgi verir ve kullanırken ayarlayabileceğiniz bazı özellikler vardır:

  • kSecReturnData: Doğruysa, veriyi şifre çözmeye çalışır (potansiyel açılır pencereleri önlemek için yanlış olarak ayarlayın)

  • kSecReturnRef: Anahtar zinciri öğesine referans da alın (daha sonra açılır pencere olmadan şifre çözebileceğinizi görürseniz doğru olarak ayarlayın)

  • kSecReturnAttributes: Girişler hakkında meta verileri alın

  • kSecMatchLimit: Kaç sonuç döndürüleceği

  • kSecClass: Hangi tür anahtar zinciri girişi

Her girişin ACL'lerini alın:

  • API SecAccessCopyACLList ile anahtar zinciri öğesi için ACL'yi alabilirsiniz ve bu, her liste için:

  • Açıklama

  • Güvenilir Uygulama Listesi. Bu şunlar olabilir:

  • Bir uygulama: /Applications/Slack.app

  • Bir ikili: /usr/libexec/airportd

  • Bir grup: group://AirPort

Verileri dışa aktarın:

  • API SecKeychainItemCopyContent düz metni alır

  • API SecItemExport anahtarları ve sertifikaları dışa aktarır ancak içeriği şifreli olarak dışa aktarmak için şifre ayarlamanız gerekebilir

Ve bu, istemci istemi olmadan bir gizli bilgiyi dışa aktarabilmek için gereksinimlerdir:

  • Eğer 1+ güvenilir uygulama listelenmişse:

  • Uygun yetkilere ihtiyaç vardır (Nil, veya gizli bilgiye erişim için yetkilendirme listesinde yer almak)

  • PartitionID ile eşleşen bir kod imzasına ihtiyaç vardır

  • Bir güvenilir uygulama ile eşleşen bir kod imzasına ihtiyaç vardır (veya doğru KeychainAccessGroup'un üyesi olmalısınız)

  • Eğer tüm uygulamalar güvenilir ise:

  • Uygun yetkilere ihtiyaç vardır

  • PartitionID ile eşleşen bir kod imzasına ihtiyaç vardır

  • Eğer PartitionID yoksa, bu gerekli değildir

Bu nedenle, eğer 1 uygulama listelenmişse, o uygulamaya kod enjekte etmeniz gerekir.

Eğer apple partitionID'de belirtilmişse, osascript ile erişebilirsiniz, bu nedenle partitionID'de apple olan tüm uygulamalara güvenen herhangi bir şey. Python de bunun için kullanılabilir.

İki ek özellik

  • Gizli: Bu, girişi UI Anahtar Zinciri uygulamasından gizlemek için bir boolean bayraktır

  • Genel: Meta verileri depolamak içindir (yani ŞİFRELİ DEĞİLDİR)

  • Microsoft, hassas uç noktaya erişim için tüm yenileme jetonlarını düz metin olarak saklıyordu.

Referanslar

HackTricks'i Destekleyin

Last updated