macOS Keychain
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
O Keychain do Usuário (~/Library/Keychains/login.keychain-db
), que é usado para armazenar credenciais específicas do usuário como senhas de aplicativos, senhas da internet, certificados gerados pelo usuário, senhas de rede e chaves públicas/privadas geradas pelo usuário.
O Keychain do Sistema (/Library/Keychains/System.keychain
), que armazena credenciais de sistema como senhas de WiFi, certificados raiz do sistema, chaves privadas do sistema e senhas de aplicativos do sistema.
É possível encontrar outros componentes como certificados em /System/Library/Keychains/*
No iOS há apenas um Keychain localizado em /private/var/Keychains/
. Esta pasta também contém bancos de dados para o TrustStore
, autoridades de certificados (caissuercache
) e entradas OSCP (ocspache
).
Os aplicativos serão restritos no keychain apenas à sua área privada com base em seu identificador de aplicativo.
Esses arquivos, embora não tenham proteção inerente e possam ser baixados, são criptografados e requerem a senha em texto simples do usuário para serem descriptografados. Uma ferramenta como Chainbreaker pode ser usada para descriptografia.
Cada entrada no keychain é regida por Listas de Controle de Acesso (ACLs) que ditam quem pode realizar várias ações na entrada do keychain, incluindo:
ACLAuhtorizationExportClear: Permite que o portador obtenha o texto claro do segredo.
ACLAuhtorizationExportWrapped: Permite que o portador obtenha o texto claro criptografado com outra senha fornecida.
ACLAuhtorizationAny: Permite que o portador execute qualquer ação.
As ACLs são acompanhadas por uma lista de aplicativos confiáveis que podem realizar essas ações sem solicitação. Isso pode ser:
Nil
(nenhuma autorização necessária, todos são confiáveis)
Uma lista vazia (ninguém é confiável)
Lista de aplicativos específicos.
Além disso, a entrada pode conter a chave ACLAuthorizationPartitionID
, que é usada para identificar o teamid, apple, e cdhash.
Se o teamid for especificado, então, para acessar o valor da entrada sem um prompt, o aplicativo usado deve ter o mesmo teamid.
Se o apple for especificado, então o aplicativo precisa ser assinado pela Apple.
Se o cdhash for indicado, então o aplicativo deve ter o cdhash específico.
Quando uma nova entrada é criada usando Keychain Access.app
, as seguintes regras se aplicam:
Todos os aplicativos podem criptografar.
Nenhum aplicativo pode exportar/descriptografar (sem solicitar ao usuário).
Todos os aplicativos podem ver a verificação de integridade.
Nenhum aplicativo pode alterar as ACLs.
O partitionID é definido como apple
.
Quando um aplicativo cria uma entrada no keychain, as regras são um pouco diferentes:
Todos os aplicativos podem criptografar.
Somente o aplicativo criador (ou qualquer outro aplicativo explicitamente adicionado) pode exportar/descriptografar (sem solicitar ao usuário).
Todos os aplicativos podem ver a verificação de integridade.
Nenhum aplicativo pode alterar as ACLs.
O partitionID é definido como teamid:[teamID aqui]
.
security
A enumeração e extração do keychain de segredos que não gerarão um prompt pode ser feita com a ferramenta LockSmith
Outros endpoints da API podem ser encontrados no código-fonte de SecKeyChain.h.
Liste e obtenha informações sobre cada entrada do keychain usando o Security Framework ou você também pode verificar a ferramenta cli de código aberto da Apple security. Alguns exemplos de API:
A API SecItemCopyMatching
fornece informações sobre cada entrada e há alguns atributos que você pode definir ao usá-la:
kSecReturnData
: Se verdadeiro, tentará descriptografar os dados (defina como falso para evitar possíveis pop-ups)
kSecReturnRef
: Obtenha também referência ao item do keychain (defina como verdadeiro caso mais tarde você veja que pode descriptografar sem pop-up)
kSecReturnAttributes
: Obtenha metadados sobre as entradas
kSecMatchLimit
: Quantos resultados retornar
kSecClass
: Que tipo de entrada do keychain
Obtenha ACLs de cada entrada:
Com a API SecAccessCopyACLList
você pode obter a ACL para o item do keychain, e ela retornará uma lista de ACLs (como ACLAuhtorizationExportClear
e as outras mencionadas anteriormente) onde cada lista tem:
Descrição
Lista de Aplicativos Confiáveis. Isso pode ser:
Um app: /Applications/Slack.app
Um binário: /usr/libexec/airportd
Um grupo: group://AirPort
Exporte os dados:
A API SecKeychainItemCopyContent
obtém o texto em claro
A API SecItemExport
exporta as chaves e certificados, mas pode ser necessário definir senhas para exportar o conteúdo criptografado
E estes são os requisitos para poder exportar um segredo sem um prompt:
Se 1+ aplicativos confiáveis listados:
Necessita das autorizações apropriadas (Nil
, ou ser parte da lista permitida de aplicativos na autorização para acessar as informações secretas)
Necessita que a assinatura de código corresponda ao PartitionID
Necessita que a assinatura de código corresponda à de um aplicativo confiável (ou ser membro do grupo correto KeychainAccessGroup)
Se todos os aplicativos confiáveis:
Necessita das autorizações apropriadas
Necessita que a assinatura de código corresponda ao PartitionID
Se sem PartitionID, então isso não é necessário
Portanto, se houver 1 aplicativo listado, você precisa injetar código nesse aplicativo.
Se apple estiver indicado no partitionID, você poderia acessá-lo com osascript
então qualquer coisa que esteja confiando em todos os aplicativos com apple no partitionID. Python
também poderia ser usado para isso.
Invisible: É um sinalizador booleano para ocultar a entrada do aplicativo UI Keychain
General: É para armazenar metadados (então NÃO está CRIPTOGRAFADO)
A Microsoft estava armazenando em texto claro todos os tokens de atualização para acessar endpoints sensíveis.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)