8.9 KiB
Llavero de macOS
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud en GitHub.
Llaveros Principales
- El Llavero 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. - El Llavero 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 Contraseñas del Llavero
Estos archivos, aunque no tienen protección inherente y pueden ser descargados, están encriptados y requieren la contraseña en texto plano del usuario para ser descifrados. Una herramienta como Chainbreaker podría ser utilizada para el descifrado.
Protecciones de las Entradas del Llavero
Listas de Control de Acceso (ACLs)
Cada entrada en el llavero está gobernada por Listas de Control de Acceso (ACLs) que dictan quién puede realizar varias acciones en la entrada del llavero, incluyendo:
- ACLAuhtorizationExportClear: Permite al titular obtener el texto claro del secreto.
- ACLAuhtorizationExportWrapped: Permite al titular obtener el texto claro encriptado con otra contraseña proporcionada.
- ACLAuhtorizationAny: Permite al titular realizar cualquier acción.
Las ACLs 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 podría 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 en el Llavero
Cuando se crea una nueva entrada utilizando Keychain Access.app
, se aplican las siguientes reglas:
- Todas las aplicaciones pueden encriptar.
- Ninguna aplicación puede exportar/descifrar (sin solicitar permiso al usuario).
- Todas las aplicaciones pueden ver la comprobación de integridad.
- Ninguna aplicación puede cambiar las ACLs.
- El partitionID se establece en
apple
.
Cuando una aplicación crea una entrada en el llavero, las reglas son ligeramente diferentes:
- Todas las aplicaciones pueden encriptar.
- Solo la aplicación creadora (o cualquier otra aplicación añadida explícitamente) puede exportar/descifrar (sin solicitar permiso al usuario).
- Todas las aplicaciones pueden ver la comprobación de integridad.
- Ninguna aplicación puede cambiar las ACLs.
- El partitionID se establece en
teamid:[teamID aquí]
.
Accediendo al Llavero
security
# 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 generará un aviso se puede hacer con la herramienta LockSmith {% endhint %}
Listar y obtener información sobre cada entrada del llavero:
- La API
SecItemCopyMatching
proporciona información sobre cada entrada y hay algunos atributos que se pueden configurar 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 veas que puedes descifrar sin ventana emergente)kSecReturnAttributes
: Obtener metadatos sobre las entradaskSecMatchLimit
: Cuántos resultados devolverkSecClass
: Qué tipo de entrada del llavero
Obtener ACLs de cada entrada:
- Con la API
SecAccessCopyACLList
puedes obtener el ACL del elemento del llavero, y devolverá una lista de ACLs (comoACLAuhtorizationExportClear
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
Exportar los datos:
- La API
SecKeychainItemCopyContent
obtiene el texto plano - La API
SecItemExport
exporta las claves y certificados pero podría ser necesario establecer contraseñas para exportar el contenido cifrado
Y estos son los requisitos para poder exportar un secreto sin un aviso:
- Si hay 1 o más aplicaciones de confianza listadas:
- Necesitas las autorizaciones apropiadas (
Nil
, o ser parte de la lista permitida de aplicaciones en la autorización para acceder a la información secreta) - Necesitas que la firma de código coincida con PartitionID
- Necesitas que la firma de 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:
- Necesitas las autorizaciones apropiadas
- Necesitas que la firma de 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 se indica apple en el PartitionID, podrías acceder con osascript
a cualquier cosa que confíe en todas las aplicaciones con apple en el PartitionID. Python
también podría ser utilizado para esto.
{% endhint %}
Dos atributos adicionales
- Invisible: Es un indicador booleano para ocultar la entrada de la aplicación del llavero UI
- General: Es para almacenar metadatos (por lo que NO ESTÁ CIFRADO)
- Microsoft estaba almacenando en texto plano todos los tokens de actualización para acceder a puntos finales sensibles.
Referencias
Aprende a hackear AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.