hacktricks/macos-hardening/macos-red-teaming/macos-keychain.md

9.6 KiB

macOS Keychain

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Principais Keychains

  • O User Keychain (~/Library/Keychains/login.keycahin-db), que é usado para armazenar credenciais específicas do usuário como senhas de aplicativos, senhas de internet, certificados gerados pelo usuário, senhas de rede e chaves públicas/privadas geradas pelo usuário.
  • O System Keychain (/Library/Keychains/System.keychain), que armazena credenciais em todo o sistema como senhas WiFi, certificados raiz do sistema, chaves privadas do sistema e senhas de aplicativos do sistema.

Acesso à Senha do Keychain

Esses arquivos, embora não tenham proteção inerente e possam ser baixados, são criptografados e exigem a senha em texto simples do usuário para serem descriptografados. Uma ferramenta como Chainbreaker pode ser usada para descriptografar.

Proteções de Entradas do Keychain

ACLs

Cada entrada no keychain é governada por Listas de Controle de Acesso (ACLs) que ditam quem pode executar várias ações na entrada do keychain, incluindo:

  • ACLAuhtorizationExportClear: Permite que o detentor obtenha o texto claro do segredo.
  • ACLAuhtorizationExportWrapped: Permite que o detentor obtenha o texto claro criptografado com outra senha fornecida.
  • ACLAuhtorizationAny: Permite que o detentor execute qualquer ação.

As ACLs são acompanhadas por uma lista de aplicativos confiáveis que podem executar 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 uma solicitação, o aplicativo usado deve ter o mesmo teamid.
  • Se a apple for especificada, o aplicativo precisa ser assinado pela Apple.
  • Se o cdhash for indicado, o aplicativo deve ter o cdhash específico.

Criando uma Entrada do Keychain

Quando uma nova entrada é criada usando o 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 adicionado explicitamente) 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

# 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

APIs

{% hint style="success" %} A enumeração e o dumping do keychain de segredos que não geram um prompt podem ser feitos com a ferramenta LockSmith {% endhint %}

Liste e obtenha informações sobre cada entrada do keychain:

  • A API SecItemCopyMatching fornece informações sobre cada entrada e existem 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 a referência ao item do keychain (defina como verdadeiro no caso de você ver que pode descriptografar sem pop-up)
    • kSecReturnAttributes: Obtenha metadados sobre as entradas
    • kSecMatchLimit: Quantos resultados retornar
    • kSecClass: Que tipo de entrada do keychain

Obtenha as 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 aplicativo: /Applications/Slack.app
      • Um binário: /usr/libexec/airportd
      • Um grupo: group://AirPort

Exporte os dados:

  • A API SecKeychainItemCopyContent obtém o texto simples
  • 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 ou mais aplicativos confiáveis estiverem listados:
    • Precisa das autorizações apropriadas (Nil, ou ser parte da lista permitida de aplicativos na autorização para acessar as informações secretas)
    • Precisa que a assinatura do código corresponda ao PartitionID
    • Precisa que a assinatura do código corresponda à de um aplicativo confiável (ou ser um membro do grupo KeychainAccessGroup correto)
  • Se todos os aplicativos são confiáveis:
    • Precisa das autorizações apropriadas
    • Precisa que a assinatura do código corresponda ao PartitionID
      • Se não houver PartitionID, isso não é necessário

{% hint style="danger" %} Portanto, se houver 1 aplicativo listado, você precisará injetar código nesse aplicativo.

Se a apple for indicada no partitionID, você pode acessá-la com osascript para qualquer coisa que esteja confiando em todos os aplicativos com apple no partitionID. Python também pode ser usado para isso. {% endhint %}

Dois atributos adicionais

  • Invisível: É uma sinalização booleana para ocultar a entrada do aplicativo UI Keychain
  • Geral: É para armazenar metadados (portanto, NÃO É CRIPTOGRAFADO)
    • A Microsoft estava armazenando em texto simples todos os tokens de atualização para acessar pontos de extremidade sensíveis.

Referências

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥