macOS Keychain
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Keychain użytkownika (~/Library/Keychains/login.keychain-db
), który jest używany do przechowywania poświadczeń specyficznych dla użytkownika, takich jak hasła aplikacji, hasła internetowe, certyfikaty generowane przez użytkownika, hasła sieciowe oraz klucze publiczne/prywatne generowane przez użytkownika.
Keychain systemowy (/Library/Keychains/System.keychain
), który przechowuje poświadczenia systemowe, takie jak hasła WiFi, certyfikaty główne systemu, prywatne klucze systemowe oraz hasła aplikacji systemowych.
Możliwe jest znalezienie innych komponentów, takich jak certyfikaty w /System/Library/Keychains/*
W iOS istnieje tylko jeden Keychain znajdujący się w /private/var/Keychains/
. Ten folder zawiera również bazy danych dla TrustStore
, autorytetów certyfikacyjnych (caissuercache
) oraz wpisów OSCP (ocspache
).
Aplikacje będą miały ograniczony dostęp do keychaina tylko do ich prywatnego obszaru na podstawie ich identyfikatora aplikacji.
Te pliki, chociaż nie mają wbudowanej ochrony i mogą być pobrane, są szyfrowane i wymagają czystego hasła użytkownika do odszyfrowania. Narzędzie takie jak Chainbreaker może być użyte do odszyfrowania.
Każdy wpis w keychainie jest regulowany przez Listy Kontroli Dostępu (ACL), które określają, kto może wykonywać różne działania na wpisie keychaina, w tym:
ACLAuhtorizationExportClear: Pozwala posiadaczowi uzyskać czysty tekst sekretu.
ACLAuhtorizationExportWrapped: Pozwala posiadaczowi uzyskać czysty tekst zaszyfrowany innym podanym hasłem.
ACLAuhtorizationAny: Pozwala posiadaczowi na wykonanie dowolnej akcji.
ACL są dodatkowo wspierane przez listę zaufanych aplikacji, które mogą wykonywać te działania bez wywoływania monitu. Może to być:
Nil
(brak wymaganej autoryzacji, wszyscy są zaufani)
Pusta lista (nikt nie jest zaufany)
Lista konkretnych aplikacji.
Wpis może również zawierać klucz ACLAuthorizationPartitionID
, który służy do identyfikacji teamid, apple i cdhash.
Jeśli teamid jest określony, to aby uzyskać dostęp do wartości wpisu bez monitu, używana aplikacja musi mieć to samo teamid.
Jeśli apple jest określony, to aplikacja musi być podpisana przez Apple.
Jeśli cdhash jest wskazany, to aplikacja musi mieć konkretny cdhash.
Gdy nowy wpis jest tworzony za pomocą Keychain Access.app
, obowiązują następujące zasady:
Wszystkie aplikacje mogą szyfrować.
Żadne aplikacje nie mogą eksportować/odszyfrowywać (bez wywoływania monitu użytkownika).
Wszystkie aplikacje mogą zobaczyć kontrolę integralności.
Żadne aplikacje nie mogą zmieniać ACL.
partitionID jest ustawiony na apple
.
Gdy aplikacja tworzy wpis w keychainie, zasady są nieco inne:
Wszystkie aplikacje mogą szyfrować.
Tylko tworząca aplikacja (lub inne aplikacje wyraźnie dodane) mogą eksportować/odszyfrowywać (bez wywoływania monitu użytkownika).
Wszystkie aplikacje mogą zobaczyć kontrolę integralności.
Żadne aplikacje nie mogą zmieniać ACL.
partitionID jest ustawiony na teamid:[teamID tutaj]
.
security
Enumeracja i zrzut keychain sekretów, które nie wygenerują powiadomienia, można wykonać za pomocą narzędzia LockSmith
Inne punkty końcowe API można znaleźć w kodzie źródłowym SecKeyChain.h.
Wypisz i uzyskaj informacje o każdym wpisie w keychain za pomocą Security Framework lub możesz również sprawdzić narzędzie CLI Apple'a security. Oto kilka przykładów API:
API SecItemCopyMatching
daje informacje o każdym wpisie i są pewne atrybuty, które możesz ustawić podczas jego używania:
kSecReturnData
: Jeśli prawda, spróbuje odszyfrować dane (ustaw na fałsz, aby uniknąć potencjalnych wyskakujących okienek)
kSecReturnRef
: Uzyskaj również odniesienie do elementu keychain (ustaw na prawda, jeśli później zobaczysz, że możesz odszyfrować bez wyskakującego okienka)
kSecReturnAttributes
: Uzyskaj metadane o wpisach
kSecMatchLimit
: Ile wyników zwrócić
kSecClass
: Jaki rodzaj wpisu w keychain
Uzyskaj ACL każdego wpisu:
Za pomocą API SecAccessCopyACLList
możesz uzyskać ACL dla elementu keychain, a zwróci to listę ACL (takich jak ACLAuhtorizationExportClear
i inne wcześniej wspomniane), gdzie każda lista ma:
Opis
Lista Zaufanych Aplikacji. To może być:
Aplikacja: /Applications/Slack.app
Plik binarny: /usr/libexec/airportd
Grupa: group://AirPort
Eksportuj dane:
API SecKeychainItemCopyContent
uzyskuje tekst jawny
API SecItemExport
eksportuje klucze i certyfikaty, ale może być konieczne ustawienie haseł do eksportu zawartości w formie zaszyfrowanej
A oto wymagania, aby móc eksportować sekret bez powiadomienia:
Jeśli 1+ zaufane aplikacje są wymienione:
Potrzebne są odpowiednie autoryzacje (Nil
, lub być częścią dozwolonej listy aplikacji w autoryzacji do uzyskania dostępu do informacji o sekrecie)
Potrzebny jest podpis kodu, aby pasował do PartitionID
Potrzebny jest podpis kodu, aby pasował do jednego zaufanego programu (lub być członkiem odpowiedniej grupy KeychainAccessGroup)
Jeśli wszystkie aplikacje zaufane:
Potrzebne są odpowiednie autoryzacje
Potrzebny jest podpis kodu, aby pasował do PartitionID
Jeśli brak PartitionID, to nie jest potrzebne
Dlatego, jeśli jest 1 aplikacja wymieniona, musisz wstrzyknąć kod w tę aplikację.
Jeśli apple jest wskazane w partitionID, możesz uzyskać do niego dostęp za pomocą osascript
, więc wszystko, co ufa wszystkim aplikacjom z apple w partitionID. Python
również może być użyty do tego.
Niewidoczny: To booleanowy znacznik do ukrycia wpisu w aplikacji UI Keychain
Ogólny: Służy do przechowywania metadanych (więc NIE JEST ZASZYFROWANY)
Microsoft przechowywał w postaci jawnej wszystkie tokeny odświeżania do uzyskania dostępu do wrażliwego punktu końcowego.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)