macOS Keychain
Reading time: 5 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
Główne Keychainy
- 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 dlaTrustStore
, autorytetów certyfikacji (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.
Dostęp do Keychaina z Hasłem
Te pliki, mimo że 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.
Ochrona Wpisów w Keychainie
ACL
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 w keychainie, 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 pytania. Może to być:
- N
il
(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ślone, to aplikacja musi być podpisana przez Apple.
- Jeśli cdhash jest wskazany, to aplikacja musi mieć konkretny cdhash.
Tworzenie Wpisu w Keychainie
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 pytania użytkownika).
- Wszystkie aplikacje mogą zobaczyć kontrolę integralności.
- Żadne aplikacje nie mogą zmieniać ACL.
- partitionID jest ustawione 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 pytania użytkownika).
- Wszystkie aplikacje mogą zobaczyć kontrolę integralności.
- Żadne aplikacje nie mogą zmieniać ACL.
- partitionID jest ustawione na
teamid:[teamID here]
.
Uzyskiwanie Dostępu do Keychaina
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
Enumeracja keychain i zrzut 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.
Wymień i uzyskaj informacje o każdym wpisie w keychain za pomocą Security Framework lub możesz również sprawdzić narzędzie CLI open source Apple security. Oto kilka przykładów API:
- API
SecItemCopyMatching
daje informacje o każdym wpisie, a niektóre 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 okna)kSecReturnAttributes
: Uzyskaj metadane o wpisachkSecMatchLimit
: 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 listę ACL (takich jakACLAuhtorizationExportClear
i inne wcześniej wspomniane), gdzie każda lista ma: - Opis
- Lista Zaufanych Aplikacji. Może to być:
- Aplikacja: /Applications/Slack.app
- 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 zaszyfrowanej
A oto wymagania, aby móc eksportować sekret bez powiadomienia:
- Jeśli 1+ zaufane aplikacje są wymienione:
- Potrzebne odpowiednie autoryzacje (
Nil
, lub być częścią dozwolonej listy aplikacji w autoryzacji do uzyskania dostępu do informacji o sekrecie) - Potrzebny podpis kodu, aby pasował do PartitionID
- Potrzebny podpis kodu, aby pasował do jednego zaufanego programu (lub być członkiem odpowiedniej grupy KeychainAccessGroup)
- Jeśli wszystkie aplikacje zaufane:
- Potrzebne odpowiednie autoryzacje
- Potrzebny podpis kodu, aby pasował do PartitionID
- Jeśli brak PartitionID, to nie jest potrzebne
caution
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.
Dwa dodatkowe atrybuty
- Niewidoczny: To flaga boolean 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.
References
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.