6.3 KiB
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-balanceasdasPuedes 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:
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:
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 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_namearn:aws:iam::acc_id:user/user_name
Este es un ejemplo de política:
{
"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)
CLI
### 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
bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt
Usando Pacu:
run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txtrun iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt- El rol
adminutilizado 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:
{
"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:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<acc_id>: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:
"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://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/
{{#include ../../../banners/hacktricks-training.md}}
.png)