AWS - IAM & STS Unauthenticated Enum

Reading time: 5 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Перерахувати ролі та імена користувачів в обліковому записі

Assume Role Brute-Force

caution

Ця техніка більше не працює, оскільки незалежно від того, чи існує роль, ви завжди отримаєте цю помилку:

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

Ви можете перевірити це, запустивши:

aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example

Attempting to assume a role without the necessary permissions triggers an AWS error message. For instance, if unauthorized, AWS might return:

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

Це повідомлення підтверджує існування role, але вказує, що assume role policy цього role не дозволяє вам його assume. Натомість спроба assume a non-existent role leads to a different error:

less
An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole

Цікавим є те, що цей метод визначення існуючих та неіснуючих ролей застосовний навіть у різних облікових записах AWS. Маючи дійсний AWS account ID та цільовий wordlist, можна перерахувати ролі в обліковому записі без жодних вбудованих обмежень.

Ви можете використати цей script to enumerate potential principals для зловживання цією вразливістю.

Політики довіри: Brute-Force Cross Account ролі та користувачі

Налаштування або оновлення політики довіри ролі IAM передбачає визначення, які ресурси або сервіси AWS мають право assume цю роль та отримати тимчасові облікові дані. Якщо зазначений ресурс у політиці існує, політика довіри зберігається успішно. Однак, якщо ресурс не існує, генерується помилка, що вказує на те, що надано недійсний principal.

warning

Зауважте, що в цьому ресурсі можна вказати міжакаунтову роль або користувача:

  • arn:aws:iam::acc_id:role/role_name
  • arn:aws:iam::acc_id:user/user_name

Ось приклад політики:

json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::216825089941:role/Test"
},
"Action": "sts:AssumeRole"
}
]
}

Графічний інтерфейс (GUI)

Ось помилка, яку ви знайдете, якщо використовуєте роль, яка не існує. Якщо роль існує, політика буде збережена без будь-яких помилок. (Це повідомлення про помилку для оновлення, але воно також проявляється під час створення)

Інтерфейс командного рядка (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"

Ви можете автоматизувати цей процес за допомогою https://github.com/carlospolop/aws_tools

  • bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt

Або використовуючи 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
  • Роль admin, використана в прикладі, — це роль у вашому акаунті, яку pacu буде імітувати, щоб створити політики, необхідні для виконання enumeration

Privesc

У випадку, якщо роль була неправильно налаштована і дозволяє будь-кому приймати її:

json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}

Атакувальник може просто взяти її на себе.

Федерація OIDC третьої сторони

Уявіть, що вам вдалося прочитати Github Actions workflow, який отримує доступ до role всередині AWS.
Ця довіра може надати доступ до ролі з наступною trust policy:

json
{
"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"
}
}
}
]
}

Ця trust policy може бути правильною, але відсутність додаткових умов має викликати у вас недовіру.
Це тому, що попередню роль може взяти на себе будь-хто з Github Actions! Ви повинні вказати в умовах також інші речі такі як org name, repo name, env, brach...

Інша потенційна misconfiguration — це додати умову на кшталт наступної:

json
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:org_name*:*"
}

Зауважте, що wildcard (*) стоїть перед двоеточчям (:). Ви можете створити org, наприклад org_name1, і assume the role через Github Action.

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks