diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md index f4f82315d..8235f0b8d 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md @@ -1,4 +1,4 @@ -# GCP - KMS Post Explotación +# GCP - KMS Post Exploitation {{#include ../../../banners/hacktricks-training.md}} @@ -65,24 +65,38 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version) ### KMS Ransomware -En AWS es posible **robar completamente una KMS key** modificando la política de recursos de KMS y permitiendo únicamente que la cuenta del atacante use la key. Como estas políticas de recursos no existen en GCP, esto no es posible. +En AWS es posible **robar completamente una KMS key** modificando la KMS resource policy y permitiendo que solo la cuenta del atacante use la key. Como estas resource policies no existen en GCP, esto no es posible. -Sin embargo, hay otra forma de realizar un KMS Ransomware global, que implicaría los siguientes pasos: +Sin embargo, hay otra forma de ejecutar un KMS Ransomware a nivel global, que implicaría los siguientes pasos: - Crear una nueva **versión de la key con un key material** importado por el atacante ```bash gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY] ``` -- Establecerla como **versión predeterminada** (para los datos futuros que se cifren) -- **Re-encriptar los datos antiguos** cifrados con la versión anterior usando la nueva. -- **Eliminar la KMS key** +- Establécelo como **versión predeterminada** (para futuros datos que sean cifrados) +- **Volver a cifrar los datos antiguos** cifrados con la versión anterior usando la nueva. +- **Eliminar la clave KMS** - Ahora solo el atacante, que posee el material de clave original, podría ser capaz de descifrar los datos cifrados -#### Aquí están los pasos para importar una nueva versión y deshabilitar/eliminar los datos antiguos: +#### Cloud Storage + CMEK modelo de permisos + +Cuando los objetos en Cloud Storage están cifrados con CMEK, las llamadas de decrypt/encrypt a KMS son realizadas por el **Cloud Storage service agent del proyecto cuyo email es service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)**, no directamente por el usuario final que lee el objeto. + +Esto significa que para leer algo cifrado por un CMEK: + +- El agente de servicio de Cloud Storage del proyecto debe tener permisos de KMS sobre la clave KMS usada (típicamente `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- El usuario solo necesita permisos de lectura de objetos (por ejemplo `storage.objects.get`). No necesita permisos sobre la clave KMS. + +Esto significa que para controlar el acceso a datos cifrados con la clave KMS es necesario añadir/eliminar permisos de KMS al agente de servicio de Cloud Storage del proyecto. + +Ten en cuenta que una vinculación a nivel de proyecto como `roles/cloudkms.cryptoKeyEncrypterDecrypter` para el Storage service agent seguirá permitiendo decrypt con las claves en el mismo proyecto. + + +#### Here are the steps to import a new version and disable/delete the older data:
-Importar nueva versión de la clave y eliminar la versión antigua +Import new key version and delete old version ```bash # Encrypt something with the original key echo "This is a sample text to encrypt" > /tmp/my-plaintext-file.txt @@ -271,7 +285,7 @@ verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key print('Verified:', verified) ``` ### `cloudkms.cryptoKeyVersions.restore` -El permiso `cloudkms.cryptoKeyVersions.restore` permite a una identidad restaurar una versión de clave que previamente fue programada para destrucción o deshabilitada en Cloud KMS, devolviéndola a un estado activo y utilizable. +El permiso `cloudkms.cryptoKeyVersions.restore` permite a una identidad restaurar una versión de clave que previamente se programó para su destrucción o fue deshabilitada en Cloud KMS, devolviéndola a un estado activo y utilizable. ```bash gcloud kms keys versions restore \ --key= \ @@ -280,7 +294,7 @@ gcloud kms keys versions restore \ --project= ``` ### `cloudkms.cryptoKeyVersions.update` -El permiso `cloudkms.cryptoKeyVersions.update` permite a una identidad modificar los atributos o el estado de una versión específica de clave en Cloud KMS, por ejemplo habilitándola o deshabilitándola. +El permiso `cloudkms.cryptoKeyVersions.update` permite a una identidad modificar los atributos o el estado de una versión específica de clave en Cloud KMS, por ejemplo, habilitándola o deshabilitándola. ```bash # Disable key gcloud kms keys versions disable \ diff --git a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md index 8005edb36..851a5e371 100644 --- a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md +++ b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md @@ -4,36 +4,49 @@ ## KMS -El [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) sirve como un almacenamiento seguro para **claves criptográficas**, que son esenciales para operaciones como **encriptar y desencriptar datos sensibles**. Estas claves están organizadas dentro de anillos de claves, lo que permite una gestión estructurada. Además, el control de acceso puede configurarse meticulosamente, ya sea a nivel de clave individual o para todo el anillo de claves, asegurando que los permisos estén alineados con los requisitos de seguridad. +The [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) sirve como un almacenamiento seguro para **cryptographic keys**, que son esenciales para operaciones como **encrypting and decrypting sensitive data**. Estas claves están organizadas dentro de key rings, lo que permite una gestión estructurada. Además, el control de acceso puede configurarse meticulosamente, ya sea a nivel de clave individual o para todo el key ring, asegurando que los permisos estén alineados con los requisitos de seguridad. -Los anillos de claves de KMS se crean por **defecto como globales**, lo que significa que las claves dentro de ese anillo son accesibles desde cualquier región. Sin embargo, es posible crear anillos de claves específicos en **regiones específicas**. +KMS key rings son por **defecto creados como globales**, lo que significa que las claves dentro de ese key ring son accesibles desde cualquier región. Sin embargo, es posible crear key rings específicos en **regiones concretas**. -### Nivel de Protección de Claves +### Key Protection Level -- **Claves de software**: Las claves de software son **creadas y gestionadas por KMS completamente en software**. Estas claves **no están protegidas por ningún módulo de seguridad de hardware (HSM)** y pueden ser utilizadas para **pruebas y desarrollo**. Las claves de software **no se recomiendan para uso en producción** porque proporcionan baja seguridad y son susceptibles a ataques. -- **Claves alojadas en la nube**: Las claves alojadas en la nube son **creadas y gestionadas por KMS** en la nube utilizando una infraestructura altamente disponible y confiable. Estas claves están **protegidas por HSMs**, pero los HSMs **no están dedicados a un cliente específico**. Las claves alojadas en la nube son adecuadas para la mayoría de los casos de uso en producción. -- **Claves externas**: Las claves externas son **creadas y gestionadas fuera de KMS**, y se importan a KMS para su uso en operaciones criptográficas. Las claves externas **pueden ser almacenadas en un módulo de seguridad de hardware (HSM) o en una biblioteca de software, dependiendo de la preferencia del cliente**. +- **Claves de software**: Las claves de software son **creadas y gestionadas por KMS completamente en software**. Estas claves **no están protegidas por ningún hardware security module (HSM)** y pueden usarse para **pruebas y desarrollo**. No se recomiendan para uso en producción porque ofrecen baja seguridad y son susceptibles a ataques. +- **Cloud-hosted keys**: Las cloud-hosted keys son **creadas y gestionadas por KMS** en la nube usando una infraestructura altamente disponible y fiable. Estas claves **están protegidas por HSMs**, pero los HSMs **no están dedicados a un cliente específico**. Las cloud-hosted keys son adecuadas para la mayoría de casos de uso en producción. +- **External keys**: Las external keys son **creadas y gestionadas fuera de KMS**, e importadas a KMS para su uso en operaciones criptográficas. Las external keys **pueden almacenarse en un hardware security module (HSM) o en una librería de software, según la preferencia del cliente**. -### Propósitos de las Claves +### Key Purposes -- **Encriptación/desencriptación simétrica**: Se utiliza para **encriptar y desencriptar datos utilizando una única clave para ambas operaciones**. Las claves simétricas son rápidas y eficientes para encriptar y desencriptar grandes volúmenes de datos. -- **Soportado**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) -- **Firma asimétrica**: Se utiliza para la comunicación segura entre dos partes sin compartir la clave. Las claves asimétricas vienen en un par, consistiendo en una **clave pública y una clave privada**. La clave pública se comparte con otros, mientras que la clave privada se mantiene en secreto. -- **Soportado:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **Desencriptación asimétrica**: Se utiliza para verificar la autenticidad de un mensaje o dato. Se crea una firma digital utilizando una clave privada y se puede verificar utilizando la clave pública correspondiente. -- **Soportado:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **Firma MAC**: Se utiliza para asegurar **la integridad y autenticidad de los datos creando un código de autenticación de mensaje (MAC) utilizando una clave secreta**. HMAC se utiliza comúnmente para la autenticación de mensajes en protocolos de red y aplicaciones de software. -- **Soportado:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) +- **Symmetric encryption/decryption**: Usadas para **encrypt and decrypt data using a single key for both operations**. Las symmetric keys son rápidas y eficientes para cifrar y descifrar grandes volúmenes de datos. +- **Supported**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) +- **Asymmetric Signing**: Usada para comunicación segura entre dos partes sin compartir la clave. Las asymmetric keys vienen en pares, consistiendo en una **public key y una private key**. La public key se comparte con otros, mientras que la private key se mantiene secreta. +- **Supported:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **Asymmetric Decryption**: Usada para verificar la autenticidad de un mensaje o dato. Una firma digital se crea usando una private key y puede verificarse usando la public key correspondiente. +- **Supported:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **MAC Signing**: Usada para asegurar la **integridad y autenticidad de los datos creando un message authentication code (MAC) usando una secret key**. HMAC se usa comúnmente para la autenticación de mensajes en protocolos de red y aplicaciones de software. +- **Supported:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) -### Período de Rotación y Período Programado para Destrucción +### Rotation Period & Programmed for destruction period -Por **defecto**, cada **90 días**, pero puede ser **fácilmente** y **completamente personalizado.** +Por **defecto**, cada **90 días**, pero puede ser **fácil** y **completamente personalizado**. -El período "Programado para destrucción" es el **tiempo desde que el usuario solicita eliminar la clave** hasta que la clave es **eliminada**. No se puede cambiar después de que la clave es creada (por defecto 1 día). +El periodo "Programmed for destruction" es el **tiempo desde que el usuario solicita eliminar la clave** hasta que la clave es **eliminada**. No puede cambiarse después de crear la clave (por defecto 1 día). -### Versión Primaria +### Primary Version -Cada clave de KMS puede tener varias versiones, una de ellas debe ser la **predeterminada**, esta será la que se utilice cuando **no se especifique una versión al interactuar con la clave de KMS**. +Cada clave de KMS puede tener varias versiones; una de ellas debe ser la **de defecto**, que será la que se use cuando **no se especifique una versión al interactuar con la clave KMS**. + +### CMEK permission model + +Cuando los objetos en Cloud Storage están cifrados con CMEK, las llamadas de decrypt/encrypt a KMS las realiza el Cloud Storage service agent del proyecto cuyo correo es service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com, no directamente el usuario final que lee el objeto. + +Esto significa que para leer algo cifrado con un CMEK: + +- El cloud storage service agent del proyecto debe tener permisos de KMS sobre la clave KMS usada (típicamente `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- El usuario solo necesita permisos de lectura del objeto (por ejemplo `storage.objects.get`). No necesita permisos sobre la clave KMS. + +Esto quiere decir que para controlar el acceso a datos cifrados con la clave KMS es necesario añadir/eliminar permisos de KMS al cloud storage service agent del proyecto. + +Ten en cuenta que un binding a nivel de proyecto como `roles/cloudkms.cryptoKeyEncrypterDecrypter` para el Storage service agent seguirá permitiendo el decrypt con las claves en el mismo proyecto. ### Enumeración @@ -61,13 +74,13 @@ gcloud kms decrypt --ciphertext-file=[INFILE] \ --keyring [KEYRING] \ --location global ``` -### Escalación de Privilegios +### Privilege Escalation {{#ref}} ../gcp-privilege-escalation/gcp-kms-privesc.md {{#endref}} -### Post Explotación +### Post Exploitation {{#ref}} ../gcp-post-exploitation/gcp-kms-post-exploitation.md