# macOS Keychain
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
## Cadenas de claves principales * La **Cadena de claves de usuario** (`~/Library/Keychains/login.keycahin-db`), que se utiliza para almacenar **credenciales específicas del usuario** como contraseñas de aplicaciones, contraseñas de Internet, certificados generados por el usuario, contraseñas de red y claves públicas / privadas generadas por el usuario. * La **Cadena de claves del sistema** (`/Library/Keychains/System.keychain`), que almacena **credenciales de todo el sistema** como contraseñas de WiFi, certificados raíz del sistema, claves privadas del sistema y contraseñas de aplicaciones del sistema. ### Acceso a la cadena de claves de contraseñas Estos archivos, aunque no tienen protección inherente y se pueden **descargar**, están cifrados y requieren la **contraseña en texto plano del usuario para descifrarlos**. Se puede utilizar una herramienta como [**Chainbreaker**](https://github.com/n0fate/chainbreaker) para descifrarlos. ## Protecciones de entradas de la cadena de claves ### ACLs Cada entrada en la cadena de claves está gobernada por **Listas de control de acceso (ACL)** que dictan quién puede realizar varias acciones en la entrada de la cadena de claves, incluyendo: * **ACLAuhtorizationExportClear**: Permite al titular obtener el texto claro del secreto. * **ACLAuhtorizationExportWrapped**: Permite al titular obtener el texto claro cifrado con otra contraseña proporcionada. * **ACLAuhtorizationAny**: Permite al titular realizar cualquier acción. Las ACL también están acompañadas por una **lista de aplicaciones de confianza** que pueden realizar estas acciones sin solicitar permiso. Esto podría ser: * **N`il`** (no se requiere autorización, **todos son de confianza**) * Una lista **vacía** (nadie es de confianza) * **Lista** de **aplicaciones** específicas. Además, la entrada puede contener la clave **`ACLAuthorizationPartitionID`**, que se utiliza para identificar el **teamid, apple** y **cdhash.** * Si se especifica el **teamid**, entonces para **acceder** al valor de la entrada **sin** una **solicitud**, la aplicación utilizada debe tener el **mismo teamid**. * Si se especifica el **apple**, entonces la aplicación debe estar **firmada** por **Apple**. * Si se indica el **cdhash**, entonces la **aplicación** debe tener el **cdhash** específico. ### Creación de una entrada de cadena de claves Cuando se crea una **nueva entrada** utilizando **`Keychain Access.app`**, se aplican las siguientes reglas: * Todas las aplicaciones pueden cifrar. * **Ninguna aplicación** puede exportar/descifrar (sin solicitar al usuario). * Todas las aplicaciones pueden ver la comprobación de integridad. * Ninguna aplicación puede cambiar las ACL. * El **partitionID** se establece en **`apple`**. Cuando una **aplicación crea una entrada en la cadena de claves**, las reglas son ligeramente diferentes: * Todas las aplicaciones pueden cifrar. * Solo la **aplicación creadora** (o cualquier otra aplicación agregada explícitamente) puede exportar/descifrar (sin solicitar al usuario). * Todas las aplicaciones pueden ver la comprobación de integridad. * Ninguna aplicación puede cambiar las ACL. * El **partitionID** se establece en **`teamid:[teamID aquí]`**. ## Acceso a la cadena de claves ### `security` ```bash # 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" %} La **enumeración y volcado** de secretos del **llavero que no generan una ventana emergente** se puede hacer con la herramienta [**LockSmith**](https://github.com/its-a-feature/LockSmith) {% endhint %} Lista y obtén **información** sobre cada entrada del llavero: * La API **`SecItemCopyMatching`** da información sobre cada entrada y hay algunos atributos que se pueden establecer al usarla: * **`kSecReturnData`**: Si es verdadero, intentará descifrar los datos (establecer en falso para evitar posibles ventanas emergentes) * **`kSecReturnRef`**: Obtener también la referencia al elemento del llavero (establecer en verdadero en caso de que luego vea que puede descifrar sin ventana emergente) * **`kSecReturnAttributes`**: Obtener metadatos sobre las entradas * **`kSecMatchLimit`**: Cuántos resultados devolver * **`kSecClass`**: Qué tipo de entrada del llavero Obtén **ACLs** de cada entrada: * Con la API **`SecAccessCopyACLList`** puedes obtener el **ACL para el elemento del llavero**, y devolverá una lista de ACL (como `ACLAuhtorizationExportClear` y los otros mencionados anteriormente) donde cada lista tiene: * Descripción * **Lista de aplicaciones de confianza**. Esto podría ser: * Una aplicación: /Applications/Slack.app * Un binario: /usr/libexec/airportd * Un grupo: group://AirPort Exporta los datos: * La API **`SecKeychainItemCopyContent`** obtiene el texto sin formato * La API **`SecItemExport`** exporta las claves y certificados, pero es posible que tenga que establecer contraseñas para exportar el contenido cifrado Y estos son los **requisitos** para poder **exportar un secreto sin una ventana emergente**: * Si hay **1 o más aplicaciones de confianza** listadas: * Necesita las **autorizaciones** apropiadas (**`Nil`**, o ser **parte** de la lista permitida de aplicaciones en la autorización para acceder a la información secreta) * Necesita que la firma del código coincida con **PartitionID** * Necesita que la firma del código coincida con la de una **aplicación de confianza** (o ser miembro del grupo KeychainAccessGroup correcto) * Si **todas las aplicaciones son de confianza**: * Necesita las **autorizaciones** apropiadas * Necesita que la firma del código coincida con **PartitionID** * Si **no hay PartitionID**, entonces esto no es necesario {% hint style="danger" %} Por lo tanto, si hay **1 aplicación listada**, necesitas **inyectar código en esa aplicación**. Si **apple** está indicado en el **PartitionID**, se puede acceder con **`osascript`** a cualquier cosa que confíe en todas las aplicaciones con apple en el PartitionID. **`Python`** también se puede usar para esto. {% endhint %} ### Dos atributos adicionales * **Invisible**: Es una bandera booleana para **ocultar** la entrada de la aplicación **UI** del llavero * **General**: Es para almacenar **metadatos** (por lo que NO ESTÁ CIFRADO) * Microsoft estaba almacenando en texto sin formato todos los tokens de actualización para acceder a puntos finales sensibles. ## Referencias * [**#OBTS v5.0: "Lock Picking the macOS Keychain" - Cody Thomas**](https://www.youtube.com/watch?v=jKE1ZW33JpY)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿o quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos. * Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).