# AWS - IAM & STS Unauthenticated Enum

{{#include ../../../../banners/hacktricks-training.md}}

## Lys rolle en gebruikersname in 'n rekening

### ~~Assume Role Brute-Force~~

> [!CAUTION]
> **Hierdie tegniek werk nie meer nie** aangesien jy, ongeag of die rol bestaan of nie, altyd hierdie fout kry:
>
> `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`
>
> Jy kan dit **toets deur dit te laat loop**:
>
> `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** sal 'n AWS-foutboodskap veroorsaak. Byvoorbeeld, as jy nie gemagtig is nie, kan AWS die volgende teruggee:
```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
```
Hierdie boodskap bevestig die bestaan van die rol, maar dui aan dat die assume role policy nie toelaat dat jy die rol aanneem nie. In teenstelling hiermee, **om 'n nie-bestaande rol aan te neem lei tot 'n ander fout**:
```less
An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole
```
Interessant genoeg is hierdie metode om **te onderskei tussen bestaande en nie-bestaande roles** selfs toepaslik oor verskillende AWS-accounts. Met 'n geldige AWS account ID en 'n geteikende woordlys kan 'n mens die roles in die account enumereer sonder enige inherente beperkings.

Jy kan hierdie [script to enumerate potential principals](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) misbruik om hierdie kwessie uit te buit.

### Trust Policies: Brute-Force Cross Account roles and users

Om 'n **IAM role se trust policy te konfigureer of op te dateer behels die definisie watter AWS resources of services toegelaat word om daardie role aan te neem** en tydelike credentials te verkry. As die gespesifiseerde resource in die policy **bestaan**, stoor die trust policy **suksesvol**. Indien die resource **nie bestaan nie**, word 'n **fout gegenereer** wat aandui dat 'n ongeldige principal verskaf is.

> [!WARNING]
> Neem kennis dat jy in daardie resource 'n cross account role of user kan spesifiseer:
>
> - `arn:aws:iam::acc_id:role/role_name`
> - `arn:aws:iam::acc_id:user/user_name`

Hier is 'n policy voorbeeld:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::216825089941:role/Test"
},
"Action": "sts:AssumeRole"
}
]
}
```
#### GUI

Dit is die **fout** wat jy sal vind as jy 'n **role that doesn't exist** gebruik. As die role **exist**, sal die policy **saved** word sonder enige foute. (Die fout is vir update, maar dit werk ook wanneer creating)

![](<../../../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"
```
Jy kan hierdie proses outomatiseer met [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`

Of met behulp van [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`
- Die `admin` role wat in die voorbeeld gebruik word, is 'n **role in jou rekening wat deur pacu geïmpersonifieer word** om die policies te skep wat dit benodig vir die enumerasie

### Privesc

In die geval die role sleg gekonfigureer is en enigeen toelaat om dit te assume:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}
```
Die aanvaller kan dit net assume.

## Derdepartye OIDC-federasie

Stel jou voor dat jy dit regkry om 'n **Github Actions workflow** te lees wat toegang tot 'n **role** binne **AWS** het.\
Hierdie vertrouensverhouding kan toegang gee tot 'n **role** met die volgende **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"
}
}
}
]
}
```
Hierdie trust policy mag korrek wees, maar die **gebrek aan meer voorwaardes** behoort jou agterdogtig te maak.\  
Dit is omdat die vorige rol aangeneem kan word deur **ENIGEEN van Github Actions**! Jy moet in die conditions ook ander dinge spesifiseer soos org-naam, repo-naam, env, tak...

Nog 'n potensiële misconfiguratie is om 'n **voorwaarde by te voeg** soos die volgende:
```json
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:org_name*:*"
}
```
Let op dat **wildcard** (\*) voor die **dubbele punt** (:) staan. Jy kan 'n org skep soos **org_name1** en **assume the role** vanaf 'n Github Action uitvoer.

## Verwysings

- [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}}
