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

10 KiB

macOS Keychain

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

WhiteIntel

WhiteIntel é um motor de busca alimentado pela dark-web que oferece funcionalidades gratuitas para verificar se uma empresa ou seus clientes foram comprometidos por malwares de roubo.

O principal objetivo do WhiteIntel é combater a tomada de contas e ataques de ransomware resultantes de malware que rouba informações.

Você pode verificar o site deles e experimentar o motor gratuitamente em:

{% embed url="https://whiteintel.io" %}


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 da 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 de sistema como senhas de WiFi, certificados raiz do sistema, chaves privadas do sistema e senhas de aplicativos do sistema.

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 a 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 {% endhint %}

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

  • 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 de aplicativos permitidos 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 KeychainAccessGroup correto)
  • 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 do Keychain
  • General: É para armazenar metadados (portanto, NÃO É CRIPTOGRAFADO)
  • A Microsoft estava armazenando em texto claro todos os tokens de atualização para acessar endpoints sensíveis.

Referências

WhiteIntel

WhiteIntel é um mecanismo de busca alimentado pela dark-web que oferece funcionalidades gratuitas para verificar se uma empresa ou seus clientes foram comprometidos por malwares de roubo.

O objetivo principal do WhiteIntel é combater a tomada de contas e ataques de ransomware resultantes de malware que rouba informações.

Você pode verificar o site deles e experimentar o mecanismo gratuitamente em:

{% embed url="https://whiteintel.io" %}

{% 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 %}