mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/gcp-security/gcp-post-exploitation
This commit is contained in:
@@ -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> \
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user