hacktricks/macos-hardening/macos-red-teaming/macos-keychain.md
2024-12-12 13:56:11 +01:00

9.7 KiB

macOS Keychain

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Principais Keychains

  • 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.

Acesso ao Keychain de Senhas

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.

Proteções de Entradas do Keychain

ACLs

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.

Criando uma Entrada no Keychain

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].

Acessando o Keychain

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

{% hint style="success" %} 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. {% endhint %}

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

{% hint style="danger" %} 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. {% endhint %}

Dois atributos adicionais

  • 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.

Referências

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}