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:
@@ -12,11 +12,11 @@ Encontre informações básicas sobre KMS em:
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.destroy`
|
||||
|
||||
Um atacante com essa permissão poderia destruir uma versão de chave do KMS. Para fazer isso, primeiro você precisa desabilitar a chave e então destruí-la:
|
||||
Um atacante com essa permissão poderia destruir uma versão do KMS. Para fazer isso, primeiro você precisa desabilitar a chave e então destruí-la:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Desabilitar e destruir a versão da chave (Python)</summary>
|
||||
<summary>Desabilitar e destruir versão da chave (Python)</summary>
|
||||
```python
|
||||
# pip install google-cloud-kms
|
||||
|
||||
@@ -65,24 +65,38 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
|
||||
|
||||
### KMS Ransomware
|
||||
|
||||
No AWS é possível roubar completamente uma KMS key modificando a KMS resource policy e permitindo que apenas a conta do atacante use a chave. Como essas resource policies não existem no GCP, isso não é possível.
|
||||
Na AWS é possível completamente **steal a KMS key** ao modificar a KMS resource policy e permitir que apenas a conta do atacante use a chave. Como essas políticas de recurso não existem no GCP, isso não é possível.
|
||||
|
||||
No entanto, existe outra forma de realizar um KMS Ransomware global, que envolveria os seguintes passos:
|
||||
|
||||
- Criar uma nova **versão da chave com um key material** importado pelo atacante
|
||||
- Criar uma nova **versão da chave com material da chave** importado pelo 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]
|
||||
```
|
||||
- Defina-a como **versão padrão** (para dados futuros que serão encriptados)
|
||||
- **Reencriptar dados antigos** encriptados com a versão anterior usando a nova.
|
||||
- **Excluir a KMS key**
|
||||
- Agora apenas o atacante, que possui o key material original, poderá descriptografar os dados encriptados
|
||||
- Defina-a como **versão padrão** (para dados futuros que serão criptografados)
|
||||
- **Re-criptografar dados antigos** criptografados com a versão anterior usando a nova.
|
||||
- **Excluir a chave KMS**
|
||||
- Agora somente o atacante, que possui o material da chave original, poderá descriptografar os dados criptografados
|
||||
|
||||
#### Aqui estão os passos para importar uma nova versão e desativar/excluir os dados antigos:
|
||||
#### Cloud Storage + CMEK modelo de permissões
|
||||
|
||||
Quando objetos no Cloud Storage são criptografados com CMEK, as chamadas de decrypt/encrypt para o KMS são feitas pelo agente de serviço do Cloud Storage do projeto cujo e-mail é service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)**, não diretamente pelo usuário final que lê o objeto.
|
||||
|
||||
Isso significa que, para ler algo criptografado por um CMEK:
|
||||
|
||||
- O agente de serviço do Cloud Storage do projeto deve ter permissões KMS sobre a chave KMS usada (tipicamente `roles/cloudkms.cryptoKeyEncrypterDecrypter`).
|
||||
- O usuário só precisa de permissões de leitura do objeto (por exemplo `storage.objects.get`). Ele não precisa de permissões sobre a chave KMS.
|
||||
|
||||
Isso significa que, para controlar o acesso aos dados criptografados com a chave KMS, é necessário adicionar/remover permissões KMS ao agente de serviço do Cloud Storage do projeto.
|
||||
|
||||
Note que um binding a nível de projeto como `roles/cloudkms.cryptoKeyEncrypterDecrypter` para o agente de serviço do Storage ainda permitirá descriptografar com as chaves no mesmo projeto.
|
||||
|
||||
|
||||
#### Aqui estão os passos para importar uma nova versão e desabilitar/excluir os dados antigos:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Importar nova versão da key e excluir versão antiga</summary>
|
||||
<summary>Importar nova versão da chave e excluir a versão antiga</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`
|
||||
A permissão `cloudkms.cryptoKeyVersions.restore` permite que uma identidade restaure uma versão de chave que foi anteriormente agendada para destruição ou desativada no Cloud KMS, tornando-a ativa e utilizável.
|
||||
A permissão `cloudkms.cryptoKeyVersions.restore` permite que uma identidade restaure uma versão de chave que foi previamente agendada para destruição ou desabilitada no Cloud KMS, retornando-a a um estado ativo e utilizável.
|
||||
```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`
|
||||
A permissão `cloudkms.cryptoKeyVersions.update` permite que uma identidade modifique os atributos ou o estado de uma versão específica de chave no Cloud KMS, por exemplo, habilitando-a ou desabilitando-a.
|
||||
A permissão `cloudkms.cryptoKeyVersions.update` permite que uma identidade modifique os atributos ou o estado de uma versão de chave específica no Cloud KMS, por exemplo, habilitando-a ou desabilitando-a.
|
||||
```bash
|
||||
# Disable key
|
||||
gcloud kms keys versions disable <VERSION_ID> \
|
||||
|
||||
@@ -4,38 +4,51 @@
|
||||
|
||||
## KMS
|
||||
|
||||
O [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) serve como um armazenamento seguro para **chaves criptográficas**, que são essenciais para operações como **criptografar e descriptografar dados sensíveis**. Essas chaves são organizadas dentro de anéis de chaves, permitindo uma gestão estruturada. Além disso, o controle de acesso pode ser meticulosamente configurado, seja no nível de chave individual ou para todo o anel de chaves, garantindo que as permissões estejam precisamente alinhadas com os requisitos de segurança.
|
||||
The [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) serve como um armazenamento seguro para **chaves criptográficas**, que são essenciais para operações como **encriptar e descriptografar dados sensíveis**. Essas chaves são organizadas dentro de key rings, permitindo um gerenciamento estruturado. Além disso, o controle de acesso pode ser configurado minuciosamente, seja no nível da chave individual ou de todo o key ring, garantindo que as permissões estejam precisamente alinhadas com os requisitos de segurança.
|
||||
|
||||
Os anéis de chaves KMS são **criados por padrão como globais**, o que significa que as chaves dentro desse anel de chaves são acessíveis de qualquer região. No entanto, é possível criar anéis de chaves específicos em **regiões específicas**.
|
||||
KMS key rings são, por **padrão, criados como global**, o que significa que as chaves dentro desse key ring são acessíveis de qualquer região. No entanto, é possível criar key rings em **regiões específicas**.
|
||||
|
||||
### Nível de Proteção da Chave
|
||||
### Key Protection Level
|
||||
|
||||
- **Chaves de software**: Chaves de software são **criadas e gerenciadas pelo KMS inteiramente em software**. Essas chaves **não são protegidas por nenhum módulo de segurança de hardware (HSM)** e podem ser usadas para **testes e desenvolvimento**. Chaves de software **não são recomendadas para uso em produção** porque oferecem baixa segurança e são suscetíveis a ataques.
|
||||
- **Chaves hospedadas na nuvem**: Chaves hospedadas na nuvem são **criadas e gerenciadas pelo KMS** na nuvem usando uma infraestrutura altamente disponível e confiável. Essas chaves são **protegidas por HSMs**, mas os HSMs **não são dedicados a um cliente específico**. Chaves hospedadas na nuvem são adequadas para a maioria dos casos de uso em produção.
|
||||
- **Chaves externas**: Chaves externas são **criadas e gerenciadas fora do KMS**, e são importadas para o KMS para uso em operações criptográficas. Chaves externas **podem ser armazenadas em um módulo de segurança de hardware (HSM) ou em uma biblioteca de software, dependendo da preferência do cliente**.
|
||||
- **Software keys**: Software keys são **criadas e gerenciadas pelo KMS inteiramente em software**. Essas chaves **não são protegidas por nenhum módulo de segurança de hardware (HSM)** e podem ser usadas para **testes e desenvolvimento**. Software keys **não são recomendadas para produção** porque oferecem baixa segurança e são suscetíveis a ataques.
|
||||
- **Cloud-hosted keys**: Cloud-hosted keys são **criadas e gerenciadas pelo KMS** na nuvem usando uma infraestrutura altamente disponível e confiável. Essas chaves são **protegidas por HSMs**, mas os HSMs **não são dedicados a um cliente específico**. Cloud-hosted keys são adequadas para a maioria dos casos de uso em produção.
|
||||
- **External keys**: External keys são **criadas e gerenciadas fora do KMS**, e são importadas para o KMS para uso em operações criptográficas. External keys **podem ser armazenadas em um módulo de segurança de hardware (HSM) ou em uma biblioteca de software, dependendo da preferência do cliente**.
|
||||
|
||||
### Propósitos da Chave
|
||||
### Key Purposes
|
||||
|
||||
- **Criptografia/Descriptografia simétrica**: Usada para **criptografar e descriptografar dados usando uma única chave para ambas as operações**. Chaves simétricas são rápidas e eficientes para criptografar e descriptografar grandes volumes de dados.
|
||||
- **Suportado**: [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)
|
||||
- **Assinatura assimétrica**: Usada para comunicação segura entre duas partes sem compartilhar a chave. Chaves assimétricas vêm em um par, consistindo de uma **chave pública e uma chave privada**. A chave pública é compartilhada com outros, enquanto a chave privada é mantida em segredo.
|
||||
- **Suportado:** [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)
|
||||
- **Descriptografia assimétrica**: Usada para verificar a autenticidade de uma mensagem ou dado. Uma assinatura digital é criada usando uma chave privada e pode ser verificada usando a chave pública correspondente.
|
||||
- **Suportado:** [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)
|
||||
- **Assinatura MAC**: Usada para garantir **integridade e autenticidade dos dados criando um código de autenticação de mensagem (MAC) usando uma chave secreta**. HMAC é comumente usado para autenticação de mensagens em protocolos de rede e aplicações de software.
|
||||
- **Suportado:** [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**: Usado para **encriptar e descriptografar dados usando uma única chave para ambas as operações**. Chaves simétricas são rápidas e eficientes para encriptar e descriptografar grandes volumes de dados.
|
||||
- **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**: Usado para comunicação segura entre duas partes sem compartilhar a chave. Chaves assimétricas vêm em par, consistindo de uma **chave pública e uma chave privada**. A chave pública é compartilhada com outros, enquanto a chave privada é mantida em segredo.
|
||||
- **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**: Usado para verificar a autenticidade de uma mensagem ou dado. Uma assinatura digital é criada usando uma chave privada e pode ser verificada usando a chave pública correspondente.
|
||||
- **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**: Usado para garantir **integridade e autenticidade dos dados criando um message authentication code (MAC) usando uma chave secreta**. HMAC é comumente usado para autenticação de mensagens em protocolos de rede e aplicações 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 Rotação & Período Programado para Destruição
|
||||
### Rotation Period & Programmed for destruction period
|
||||
|
||||
Por **padrão**, a cada **90 dias**, mas pode ser **facilmente** e **completamente personalizado.**
|
||||
Por **padrão**, cada **90 dias**, mas pode ser **facilmente** e **completamente personalizado**.
|
||||
|
||||
O período "Programado para destruição" é o **tempo desde que o usuário solicita a exclusão da chave** até que a chave seja **excluída**. Não pode ser alterado após a criação da chave (padrão de 1 dia).
|
||||
O período "Programmed for destruction" é o **tempo desde que o usuário solicita a exclusão da chave** até que a chave seja **excluída**. Não pode ser alterado após a criação da chave (padrão 1 dia).
|
||||
|
||||
### Versão Primária
|
||||
### Primary Version
|
||||
|
||||
Cada chave KMS pode ter várias versões, uma delas deve ser a **padrão**, que será a usada quando uma **versão não for especificada ao interagir com a chave KMS**.
|
||||
Cada chave KMS pode ter várias versões; uma delas deve ser a **padrão**, que será a utilizada quando **uma versão não for especificada ao interagir com a chave KMS**.
|
||||
|
||||
### Enumeração
|
||||
### CMEK permission model
|
||||
|
||||
When objects in Cloud Storage are encrypted with CMEK, the decrypt/encrypt calls to KMS are done by the project's **Cloud Storage service agent whose email is service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)**, not directly by the end user reading the object.
|
||||
|
||||
Isso significa que, para ler algo criptografado por um CMEK:
|
||||
|
||||
- O agente de serviço do Cloud Storage do projeto deve ter permissões KMS sobre a chave KMS usada (tipicamente `roles/cloudkms.cryptoKeyEncrypterDecrypter`).
|
||||
- O usuário precisa apenas de permissões de leitura do objeto (por exemplo `storage.objects.get`). Ele não precisa de permissões sobre a chave KMS.
|
||||
|
||||
Isso significa que, para controlar o acesso aos dados criptografados com a chave KMS, é necessário adicionar/remover permissões KMS ao agente de serviço do Cloud Storage do projeto.
|
||||
|
||||
Observe que uma vinculação em nível de projeto como `roles/cloudkms.cryptoKeyEncrypterDecrypter` para o agente do serviço do Cloud Storage ainda permitirá descriptografar com as chaves no mesmo projeto.
|
||||
|
||||
### Enumeration
|
||||
|
||||
Tendo **permissões para listar as chaves**, é assim que você pode acessá-las:
|
||||
```bash
|
||||
@@ -61,13 +74,13 @@ gcloud kms decrypt --ciphertext-file=[INFILE] \
|
||||
--keyring [KEYRING] \
|
||||
--location global
|
||||
```
|
||||
### Escalação de Privilégios
|
||||
### Escalada de Privilégios
|
||||
|
||||
{{#ref}}
|
||||
../gcp-privilege-escalation/gcp-kms-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### Pós Exploração
|
||||
### Pós-Exploração
|
||||
|
||||
{{#ref}}
|
||||
../gcp-post-exploitation/gcp-kms-post-exploitation.md
|
||||
|
||||
Reference in New Issue
Block a user