# AWS - IAM & STS Enumeración No Autenticada {{#include ../../../banners/hacktricks-training.md}} ## Enumerar Roles y Nombres de Usuario en una cuenta ### ~~Fuerza Bruta para Asumir Rol~~ > [!CAUTION] > **Esta técnica ya no funciona** ya que si el rol existe o no, siempre obtienes este error: > > `An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas` > > Puedes **probar esto ejecutando**: > > `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example` Intentar **asumir un rol sin los permisos necesarios** desencadena un mensaje de error de AWS. Por ejemplo, si no estás autorizado, AWS podría devolver: ```ruby An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS ``` Este mensaje confirma la existencia del rol, pero indica que su política de asunción de rol no permite su asunción. En contraste, intentar **asumir un rol que no existe conduce a un error diferente**: ```less An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole ``` Interesantemente, este método de **distinguir entre roles existentes y no existentes** es aplicable incluso entre diferentes cuentas de AWS. Con un ID de cuenta de AWS válido y una lista de palabras objetivo, se pueden enumerar los roles presentes en la cuenta sin enfrentar limitaciones inherentes. Puedes usar este [script para enumerar posibles principales](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) abusando de este problema. ### Políticas de Confianza: Fuerza Bruta de roles y usuarios entre cuentas Configurar o actualizar la **política de confianza de un rol IAM implica definir qué recursos o servicios de AWS están permitidos para asumir ese rol** y obtener credenciales temporales. Si el recurso especificado en la política **existe**, la política de confianza se guarda **correctamente**. Sin embargo, si el recurso **no existe**, se **genera un error**, indicando que se proporcionó un principal no válido. > [!WARNING] > Ten en cuenta que en ese recurso podrías especificar un rol o usuario entre cuentas: > > - `arn:aws:iam::acc_id:role/role_name` > - `arn:aws:iam::acc_id:user/user_name` Este es un ejemplo de política: ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::216825089941:role/Test" }, "Action": "sts:AssumeRole" } ] } ``` #### GUI Ese es el **error** que encontrarás si usas un **rol que no existe**. Si el rol **existe**, la política será **guardada** sin errores. (El error es para actualizar, pero también funciona al crear) ![](<../../../images/image (153).png>) #### CLI ```bash ### You could also use: aws iam update-assume-role-policy # When it works aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json { "Role": { "Path": "/", "RoleName": "Test-Role", "RoleId": "AROA5ZDCUJS3DVEIYOB73", "Arn": "arn:aws:iam::947247140022:role/Test-Role", "CreateDate": "2022-05-03T20:50:04Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::316584767888:role/account-balance" }, "Action": [ "sts:AssumeRole" ] } ] } } } # When it doesn't work aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2" ``` Puedes automatizar este proceso con [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) - `bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt` Usando [Pacu](https://github.com/RhinoSecurityLabs/pacu): - `run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` - `run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` - El rol `admin` utilizado en el ejemplo es un **rol en tu cuenta que será suplantado** por pacu para crear las políticas que necesita para la enumeración ### Privesc En el caso de que el rol esté mal configurado y permita que cualquiera lo asuma: ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sts:AssumeRole" } ] } ``` El atacante podría simplemente asumirlo. ## Federación OIDC de Terceros Imagina que logras leer un **Github Actions workflow** que está accediendo a un **role** dentro de **AWS**.\ Esta confianza podría dar acceso a un role con la siguiente **trust policy**: ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" } } } ] } ``` Esta política de confianza puede ser correcta, pero la **falta de más condiciones** debería hacerte desconfiar de ella.\ Esto se debe a que el rol anterior puede ser asumido por **CUALQUIERA de Github Actions**. Deberías especificar en las condiciones también otras cosas como el nombre de la organización, el nombre del repositorio, el entorno, la rama... Otra posible mala configuración es **agregar una condición** como la siguiente: ```json "StringLike": { "token.actions.githubusercontent.com:sub": "repo:org_name*:*" } ``` Tenga en cuenta el **comodín** (\*) antes de los **dos puntos** (:). Puede crear una organización como **org_name1** y **asumir el rol** desde una acción de Github. ## Referencias - [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) - [https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/](https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/) {{#include ../../../banners/hacktricks-training.md}}