Translated ['', 'src/pentesting-cloud/gcp-security/gcp-post-exploitation

This commit is contained in:
Translator
2026-03-04 11:27:46 +00:00
parent 0627884479
commit b246689520
2 changed files with 59 additions and 32 deletions

View File

@@ -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:
<details>
<summary>Importar nueva versión de la clave y eliminar la versión antigua</summary>
<summary>Import new key version and delete old version</summary>
```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 <VERSION_ID> \
--key=<KEY_NAME> \
@@ -280,7 +294,7 @@ gcloud kms keys versions restore <VERSION_ID> \
--project=<PROJECT_ID>
```
### `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 <VERSION_ID> \

View File

@@ -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