hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md
2024-12-12 13:56:11 +01:00

16 KiB

macOS Sensitive Locations & Interesting Daemons

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

Senhas

Senhas Shadow

A senha shadow é armazenada com a configuração do usuário em plists localizadas em /var/db/dslocal/nodes/Default/users/.
A seguinte linha de comando pode ser usada para despejar todas as informações sobre os usuários (incluindo informações de hash):

{% code overflow="wrap" %}

for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done

{% endcode %}

Scripts como este ou este podem ser usados para transformar o hash para formato hashcat.

Uma alternativa de uma linha que irá despejar credenciais de todas as contas não de serviço no formato hashcat -m 7100 (macOS PBKDF2-SHA512):

{% code overflow="wrap" %}

sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'

{% endcode %}

Outra maneira de obter o ShadowHashData de um usuário é usando dscl: sudo dscl . -read /Users/`whoami` ShadowHashData

/etc/master.passwd

Este arquivo é usado apenas quando o sistema está rodando em modo de usuário único (então não muito frequentemente).

Keychain Dump

Observe que ao usar o binário de segurança para extrair as senhas descriptografadas, vários prompts pedirão ao usuário para permitir essa operação.

#security
security dump-trust-settings [-s] [-d] #List certificates
security list-keychains #List keychain dbs
security list-smartcards #List smartcards
security dump-keychain | grep -A 5 "keychain" | grep -v "version" #List keychains entries
security dump-keychain -d #Dump all the info, included secrets (the user will be asked for his password, even if root)

Keychaindump

{% hint style="danger" %} Com base neste comentário juuso/keychaindump#10 (comentário), parece que essas ferramentas não estão mais funcionando no Big Sur. {% endhint %}

Visão Geral do Keychaindump

Uma ferramenta chamada keychaindump foi desenvolvida para extrair senhas dos keychains do macOS, mas enfrenta limitações em versões mais recentes do macOS, como o Big Sur, conforme indicado em uma discussão. O uso do keychaindump requer que o atacante ganhe acesso e eleve privilégios para root. A ferramenta explora o fato de que o keychain é desbloqueado por padrão ao fazer login do usuário por conveniência, permitindo que aplicativos acessem sem exigir repetidamente a senha do usuário. No entanto, se um usuário optar por bloquear seu keychain após cada uso, o keychaindump se torna ineficaz.

Keychaindump opera direcionando um processo específico chamado securityd, descrito pela Apple como um daemon para operações de autorização e criptografia, crucial para acessar o keychain. O processo de extração envolve identificar uma Chave Mestra derivada da senha de login do usuário. Esta chave é essencial para ler o arquivo do keychain. Para localizar a Chave Mestra, o keychaindump escaneia o heap de memória do securityd usando o comando vmmap, procurando por chaves potenciais em áreas sinalizadas como MALLOC_TINY. O seguinte comando é usado para inspecionar essas localizações de memória:

sudo vmmap <securityd PID> | grep MALLOC_TINY

Após identificar chaves mestres potenciais, keychaindump procura nos heaps por um padrão específico (0x0000000000000018) que indica um candidato para a chave mestre. Passos adicionais, incluindo desofuscação, são necessários para utilizar esta chave, conforme descrito no código-fonte do keychaindump. Analistas que se concentram nesta área devem notar que os dados cruciais para descriptografar o chaveiro estão armazenados na memória do processo securityd. Um exemplo de comando para executar o keychaindump é:

sudo ./keychaindump

chainbreaker

Chainbreaker pode ser usado para extrair os seguintes tipos de informações de um keychain do OSX de maneira forense:

  • Senha do keychain hashada, adequada para quebra com hashcat ou John the Ripper
  • Senhas da Internet
  • Senhas genéricas
  • Chaves privadas
  • Chaves públicas
  • Certificados X509
  • Notas seguras
  • Senhas do Appleshare

Dada a senha de desbloqueio do keychain, uma chave mestra obtida usando volafox ou volatility, ou um arquivo de desbloqueio como SystemKey, o Chainbreaker também fornecerá senhas em texto claro.

Sem um desses métodos de desbloqueio do Keychain, o Chainbreaker exibirá todas as outras informações disponíveis.

Dump keychain keys

#Dump all keys of the keychain (without the passwords)
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain

Extrair chaves do keychain (com senhas) usando SystemKey

# First, get the keychain decryption key
# To get this decryption key you need to be root and SIP must be disabled
hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
## Use the previous key to decrypt the passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain

Extrair chaves do chaveiro (com senhas) quebrando o hash

# Get the keychain hash
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
# Crack it with hashcat
hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
# Use the key to decrypt the passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain

Extrair chaves do chaveiro (com senhas) com despejo de memória

Siga estas etapas para realizar um despejo de memória

#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
# Unformtunately volafox isn't working with the latest versions of MacOS
python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump

#Try to extract the passwords using the extracted keychain passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain

Extrair chaves do keychain (com senhas) usando a senha do usuário

Se você souber a senha do usuário, pode usá-la para extrair e descriptografar keychains que pertencem ao usuário.

#Prompt to ask for the password
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db

kcpassword

O arquivo kcpassword é um arquivo que contém a senha de login do usuário, mas apenas se o proprietário do sistema tiver ativado o login automático. Portanto, o usuário será automaticamente conectado sem ser solicitado a fornecer uma senha (o que não é muito seguro).

A senha é armazenada no arquivo /etc/kcpassword xored com a chave 0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F. Se a senha do usuário for mais longa que a chave, a chave será reutilizada.
Isso torna a senha bastante fácil de recuperar, por exemplo, usando scripts como este aqui.

Informações Interessantes em Bancos de Dados

Mensagens

sqlite3 $HOME/Library/Messages/chat.db .tables
sqlite3 $HOME/Library/Messages/chat.db 'select * from message'
sqlite3 $HOME/Library/Messages/chat.db 'select * from attachment'
sqlite3 $HOME/Library/Messages/chat.db 'select * from deleted_messages'
sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'

Notificações

Você pode encontrar os dados de Notificações em $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/

A maior parte das informações interessantes estará em blob. Portanto, você precisará extrair esse conteúdo e transformá-lo em legível para humanos ou usar strings. Para acessá-lo, você pode fazer:

{% code overflow="wrap" %}

cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack

{% endcode %}

Notas

As notas dos usuários podem ser encontradas em ~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite

{% code overflow="wrap" %}

sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite .tables

#To dump it in a readable format:
for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select Z_PK from ZICNOTEDATA;"); do sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select writefile('body1.gz.z', ZDATA) from ZICNOTEDATA where Z_PK = '$i';"; zcat body1.gz.Z ; done

{% endcode %}

Preferências

Em aplicativos macOS, as preferências estão localizadas em $HOME/Library/Preferences e em iOS estão em /var/mobile/Containers/Data/Application/<UUID>/Library/Preferences.

No macOS, a ferramenta de linha de comando defaults pode ser usada para modificar o arquivo de Preferências.

/usr/sbin/cfprefsd reivindica os serviços XPC com.apple.cfprefsd.daemon e com.apple.cfprefsd.agent e pode ser chamado para realizar ações como modificar preferências.

OpenDirectory permissions.plist

O arquivo /System/Library/OpenDirectory/permissions.plist contém permissões aplicadas em atributos de nó e é protegido pelo SIP.
Este arquivo concede permissões a usuários específicos por UUID (e não uid) para que possam acessar informações sensíveis específicas, como ShadowHashData, HeimdalSRPKey e KerberosKeys, entre outros:

[...]
<key>dsRecTypeStandard:Computers</key>
<dict>
<key>dsAttrTypeNative:ShadowHashData</key>
<array>
<dict>
<!-- allow wheel even though it's implicit -->
<key>uuid</key>
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
<key>permissions</key>
<array>
<string>readattr</string>
<string>writeattr</string>
</array>
</dict>
</array>
<key>dsAttrTypeNative:KerberosKeys</key>
<array>
<dict>
<!-- allow wheel even though it's implicit -->
<key>uuid</key>
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
<key>permissions</key>
<array>
<string>readattr</string>
<string>writeattr</string>
</array>
</dict>
</array>
[...]

Notificações do Sistema

Notificações Darwin

O daemon principal para notificações é /usr/sbin/notifyd. Para receber notificações, os clientes devem se registrar através da porta Mach com.apple.system.notification_center (verifique-os com sudo lsmp -p <pid notifyd>). O daemon é configurável com o arquivo /etc/notify.conf.

Os nomes usados para notificações são notações DNS reversas únicas e, quando uma notificação é enviada para um deles, o(s) cliente(s) que indicaram que podem lidar com isso a receberão.

É possível despejar o status atual (e ver todos os nomes) enviando o sinal SIGUSR2 para o processo notifyd e lendo o arquivo gerado: /var/run/notifyd_<pid>.status:

ps -ef | grep -i notifyd
0   376     1   0 15Mar24 ??        27:40.97 /usr/sbin/notifyd

sudo kill -USR2 376

cat /var/run/notifyd_376.status
[...]
pid: 94379   memory 5   plain 0   port 0   file 0   signal 0   event 0   common 10
memory: com.apple.system.timezone
common: com.apple.analyticsd.running
common: com.apple.CFPreferences._domainsChangedExternally
common: com.apple.security.octagon.joined-with-bottle
[...]

Distributed Notification Center

O Distributed Notification Center cujo binário principal é /usr/sbin/distnoted, é outra maneira de enviar notificações. Ele expõe alguns serviços XPC e realiza algumas verificações para tentar verificar os clientes.

Apple Push Notifications (APN)

Neste caso, os aplicativos podem se registrar para tópicos. O cliente gerará um token contatando os servidores da Apple através do apsd.
Então, os provedores também terão gerado um token e poderão se conectar aos servidores da Apple para enviar mensagens aos clientes. Essas mensagens serão recebidas localmente pelo apsd que retransmitirá a notificação para o aplicativo que a aguarda.

As preferências estão localizadas em /Library/Preferences/com.apple.apsd.plist.

Há um banco de dados local de mensagens localizado no macOS em /Library/Application\ Support/ApplePushService/aps.db e no iOS em /var/mobile/Library/ApplePushService. Ele possui 3 tabelas: incoming_messages, outgoing_messages e channel.

sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db

Também é possível obter informações sobre o daemon e as conexões usando:

/System/Library/PrivateFrameworks/ApplePushService.framework/apsctl status

User Notifications

Estas são notificações que o usuário deve ver na tela:

  • CFUserNotification: Esta API fornece uma maneira de mostrar na tela um pop-up com uma mensagem.
  • O Quadro de Avisos: Isso mostra no iOS um banner que desaparece e será armazenado no Centro de Notificações.
  • NSUserNotificationCenter: Este é o quadro de avisos do iOS no MacOS. O banco de dados com as notificações está localizado em /var/folders/<user temp>/0/com.apple.notificationcenter/db2/db

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