Cognito User Pools

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

Kullanıcı havuzu, Amazon Cognito'da bir kullanıcı dizinidir. Bir kullanıcı havuzu ile kullanıcılarınız, Amazon Cognito üzerinden web veya mobil uygulamanıza giriş yapabilir veya üçüncü taraf bir kimlik sağlayıcı (IdP) aracılığıyla federasyon yapabilir. Kullanıcılarınız doğrudan veya üçüncü taraf aracılığıyla giriş yapmış olsun, kullanıcı havuzunun tüm üyeleri, bir SDK aracılığıyla erişebileceğiniz bir dizin profiline sahiptir.

Kullanıcı havuzları, aşağıdakileri sağlar:

  • Kayıt olma ve giriş yapma hizmetleri.

  • Kullanıcıların giriş yapması için yerleşik, özelleştirilebilir bir web arayüzü.

  • Facebook, Google, Amazon ile Giriş Yap ve Apple ile Giriş Yap, SAML ve OIDC kimlik sağlayıcıları aracılığıyla sosyal giriş yapma ve kullanıcı havuzunuzdan.

  • Kullanıcı dizini yönetimi ve kullanıcı profilleri.

  • Çok faktörlü kimlik doğrulama (MFA), tehlikede olan kimlik bilgileri için kontrol, hesap ele geçirmeye karşı koruma ve telefon ve e-posta doğrulama gibi güvenlik özellikleri.

  • Özelleştirilebilir iş akışları ve AWS Lambda tetikleyicileri aracılığıyla kullanıcı göçü.

Uygulamaların kaynak kodu genellikle ayrıca bir Cognito Kullanıcı Havuzuna giriş yapmak için gereken kullanıcı havuzu kimliği ve istemci uygulama kimliğini (ve bazen uygulama gizli anahtarını?) içerir.

Potansiyel saldırılar

  • Kayıt: Varsayılan olarak bir kullanıcı kendini kaydedebilir, bu nedenle kendisi için bir kullanıcı oluşturabilir.

  • Kullanıcı numaralandırma: Kayıt işlevselliği, zaten var olan kullanıcı adlarını bulmak için kullanılabilir. Bu bilgi, brute-force saldırısı için faydalı olabilir.

  • Giriş brute-force: Kimlik doğrulama bölümünde, bir kullanıcının giriş yapması gereken yöntemlerin tümüne sahipsiniz, bunları brute-force deneyebilir ve geçerli kimlik bilgilerini bulabilirsiniz.

Pentest için araçlar

  • Pacu, AWS istismar ç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çerir ve zayıf yapılandırmaları, erişim kontrolü için kullanılan kullanıcı özniteliklerini vb. işaretler, ayrıca değiştirilebilir özel öznitelikler, kullanılabilir kimlik havuzu kimlik bilgileri, id belgelerindeki rol assumable roller vb. temelinde kullanıcı oluşturmayı (MFA desteği de dahil olmak üzere) ve ayrıcalık yükseltmeyi 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 hesap oracle gibi farklı saldırıları uygulayan bir Python tabanlı bir CLI aracıdır.

Kurulum

$ pip install cognito-scanner

Kullanım

python3 cognito-user-pools.py -u <userpool-id> -r <region> -t <token>

Açıklama

Bu araç, belirli bir AWS Cognito kullanıcı havuzunda kullanıcıları listelemek için kullanılır. Aracın çalışması için, kullanıcı havuzu kimliği (-u), bölge (-r) ve geçerli bir erişim belirteci (-t) sağlanmalıdır.

Örnekler

python3 cognito-user-pools.py -u us-west-2_abcd1234 -r us-west-2 -t eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Bu örnekte, us-west-2 bölgesindeki us-west-2_abcd1234 kimlikli kullanıcı havuzundaki kullanıcıları listeleyecektir. Erişim belirteci olarak eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c kullanılacaktır.

$ cognito-scanner --help

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

Kayıt

Kullanıcı Havuzları, varsayılan olarak yeni kullanıcıları kaydetmeye izin verir.

aws cognito-idp sign-up --client-id <client-id> \
--username <username> --password <password> \
--region <region> --no-sign-request

Eğer herhangi biri kayıt olabilirse

Kullanıcı hakkında daha fazla ayrıntı sağlamanız gerektiğini belirten bir hata ile karşılaşabilirsiniz:

An error occurred (InvalidParameterException) when calling the SignUp operation: Attributes did not conform to the schema: address: The attribute is required

Aşağıdaki gibi gerekli bilgileri bir JSON ile sağlayabilirsiniz:

--user-attributes '[{"Name": "email", "Value": "carlospolop@gmail.com"}, {"Name":"gender", "Value": "M"}, {"Name": "address", "Value": "street"}, {"Name": "custom:custom_name", "Value":"supername&\"*$"}]'

Bu işlevselliği aynı zamanda mevcut kullanıcıları sıralamak için de kullanabilirsiniz. Bu, kullanıcı adıyla zaten mevcut olan bir kullanıcı olduğunda alınan hata mesajıdır:

An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists

Önceki komutta özel özniteliklerin "custom:" ile başladığına dikkat edin. Ayrıca, kayıt olurken kullanıcı için yeni özel öznitelikler oluşturamazsınız. Yalnızca varsayılan özniteliklere (zorunlu olmasalar bile) ve belirtilen özel özniteliklere değer verebilirsiniz.

Veya sadece bir istemci kimliğinin var olup olmadığını test etmek için. İstemci kimliği mevcut değilse bu hata mesajı alınır:

An error occurred (ResourceNotFoundException) when calling the SignUp operation: User pool client 3ig612gjm56p1ljls1prq2miut does not exist.

Sadece yönetici kullanıcıları kaydedebilirse

Bu hatayı bulacaksınız ve kullanıcıları kaydetme veya sıralama yapamayacaksınız:

An error occurred (NotAuthorizedException) when calling the SignUp operation: SignUp is not permitted for this user pool

Kayıt Doğrulama

Cognito, yeni bir kullanıcıyı e-posta veya telefon numarasını doğrulayarak doğrulamanıza izin verir. Bu nedenle, genellikle bir kullanıcı oluştururken en azından kullanıcı adı ve şifre ile birlikte e-posta ve/veya telefon numarası gereklidir. Sadece kontrol ettiğiniz birini belirleyin, böylece yeni oluşturulan kullanıcı hesabınızı doğrulamak için kodu alırsınız:

aws cognito-idp confirm-sign-up --client-id <cliet_id> \
--username aasdasd2 --confirmation-code <conf_code> \
--no-sign-request --region us-east-1

Görünüşe göre aynı e-posta ve telefon numarasını kullanabilirsiniz, ancak oluşturulan kullanıcıyı doğrulamak için Cognito aynı bilgiyi kullanmanızı engelleyecek ve hesabı doğrulamanıza izin vermeyecektir.

Yetki Yükseltme / Öznitelikleri Güncelleme

Varsayılan olarak, bir kullanıcı öznitelik değerini değiştirebilir. Bunun için şu şekilde bir şey yapabilir:

aws cognito-idp update-user-attributes \
--region us-east-1 --no-sign-request \
--user-attributes Name=address,Value=street \
--access-token <access token>

Özel öznitelik ayrıcalığı yükseltme

Varsayılan olarak kendi öznitelik değerlerinizi değiştirebileceğiniz için, isAdmin gibi özel öznitelikler bulabilirsiniz. Bu durumda, değeri kendiniz değiştirerek ayrıcalıkları yükseltebilirsiniz!

E-posta/kullanıcı adı değiştirme ayrıcalığı yükseltme

Bu yöntemi kullanarak bir kullanıcının e-posta ve telefon numarasını değiştirebilirsiniz, ancak hesap doğrulanmış kalsa bile bu öznitelikler doğrulanmamış durumda olacaktır (yeniden doğrulamanız gerekmektedir).

E-posta veya telefon numarasıyla giriş yapamayacaksınız, ancak kullanıcı adıyla giriş yapabileceksiniz. E-posta değiştirildiyse ve doğrulanmadıysa, ID Token içinde email alanında görünecektir ve email_verified alanı false olacaktır, ancak uygulama bunu kontrol etmiyorsa başka kullanıcıları taklit edebilirsiniz.

Ayrıca, name alanına herhangi bir şey yazabilirsiniz, sadece ad özniteliğini değiştirerek. Bir uygulama, email (veya başka bir öznitelik) yerine bu alanı kontrol ediyorsa, başka kullanıcıları taklit etme olasılığınız olabilir.

Neyse ki, e-postanızı örneğin yeni bir e-posta adresine değiştirdiyseniz, o e-posta adresinde aldığınız kodu kullanarak e-postayı onaylayabilirsiniz:

aws cognito-idp verify-user-attribute \
--access-token <access_token> \
--attribute-name email --code <code> \
--region <region> --no-sign-request

email yerine phone_number kullanarak yeni bir telefon numarası değiştirmek/doğrulamak için kullanılır.

Yönetici, kullanıcının tercih ettiği bir kullanıcı adıyla giriş yapma seçeneğini etkinleştirebilir. Bu değeri başka bir kullanıcıyı taklit etmek için kullanılan herhangi bir kullanıcı adı veya tercih edilen kullanıcı adı olarak değiştiremezsiniz.

Şifre Kurtarma/Değiştirme

Şifreyi sadece kullanıcı adını (veya e-postayı veya telefonu) bilerek kurtarmak mümkündür ve bir kod oraya gönderilecektir:

aws cognito-idp forgot-password \
--client-id <client_id> \
--username <username/email/phone> --region <region>

Sunucunun yanıtı her zaman olumlu olacak, sanki kullanıcı adı mevcutmuş gibi. Bu yöntemi kullanarak kullanıcıları sıralayamazsınız.

Kod ile şifreyi değiştirebilirsiniz:

aws cognito-idp confirm-forgot-password \
--client-id <client_id> \
--username <username> \
--confirmation-code <conf_code> \
--password <pwd> --region <region>

Şifreyi değiştirmek için önceki şifreyi bilmek gerekmektedir:

aws cognito-idp change-password \
--previous-password <value> \
--proposed-password <value> \
--access-token <value>

Kimlik Doğrulama

Bir kullanıcı havuzu, farklı kimlik doğrulama yöntemlerini destekler. Eğer bir kullanıcı adı ve şifre varsa, giriş yapmak için farklı yöntemler de desteklenir. Ayrıca, bir kullanıcı Havuzunda kimlik doğrulandığında 3 tür belirteç verilir: Kimlik Belirteci (ID Token), Erişim belirteci (Access Token) ve Yenileme belirteci (Refresh Token).

  • Kimlik Belirteci (ID Token): Kimlik doğrulanmış kullanıcının ad, e-posta ve telefon numarası gibi bilgileri içeren talepleri içerir. Kimlik belirteci ayrıca, kullanıcıları kaynak sunucularınıza veya sunucu uygulamalarınıza kimlik doğrulamak için de kullanılabilir. Kimlik belirtecinin içindeki herhangi bir talebe güvenebilmeniz için, dış uygulamalarda kullanıyorsanız kimlik belirtecinin imzasını doğrulamanız gerekmektedir.

  • Kimlik Belirteci, kullanıcının özellik değerlerini içeren belirteçtir, hatta özel olanları bile.

  • Erişim Belirteci (Access Token): Kimlik doğrulanmış kullanıcı hakkında talepleri, kullanıcının gruplarının bir listesini ve kapsamların bir listesini içerir. Erişim belirtecinin amacı, kullanıcı havuzundaki kullanıcının bağlamında API işlemlerini yetkilendirmektir. Örneğin, erişim belirteci kullanarak kullanıcının, kullanıcı özelliklerini eklemesine, değiştirmesine veya silmesine izin verebilirsiniz.

  • Yenileme Belirteci (Refresh Token): Yenileme belirteçleriyle kullanıcı için yeni Kimlik Belirteci ve Erişim Belirteci alabilirsiniz, yenileme belirteci geçersiz olana kadar. Varsayılan olarak, yenileme belirteci, uygulama kullanıcınızın kullanıcı havuzuna giriş yaptıktan 30 gün sonra süresi dolmaktadır. Kullanıcı havuzunuz için bir uygulama oluşturduğunuzda, uygulamanın yenileme belirteci süresini 60 dakika ile 10 yıl arasında herhangi bir değere ayarlayabilirsiniz.

ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH

Bu, sunucu tarafı kimlik doğrulama akışıdır:

  • Sunucu tarafındaki uygulama, AdminInitiateAuth API işlemini çağırır (InitiateAuth yerine). Bu işlem, cognito-idp:AdminInitiateAuth ve cognito-idp:AdminRespondToAuthChallenge izinlerini içeren AWS kimlik bilgilerini gerektirir. İşlem, gerekli kimlik doğrulama parametrelerini döndürür.

  • Sunucu tarafındaki uygulama, kimlik doğrulama parametrelerine sahip olduktan sonra AdminRespondToAuthChallenge API işlemini çağırır. AdminRespondToAuthChallenge API işlemi, yalnızca AWS kimlik bilgilerini sağladığınızda başarılı olur.

Bu yöntem, varsayılan olarak etkin değildir.

Giriş yapmak için aşağıdakileri bilmelisiniz:

  • kullanıcı havuzu kimlik bilgisi

  • istemci kimliği

  • kullanıcı adı

  • şifre

  • istemci sırrı (uygulama bir sır kullanacak şekilde yapılandırılmışsa)

Bu yöntemle giriş yapabilmek için, uygulamanın ALLOW_ADMIN_USER_PASSWORD_AUTH ile giriş yapmaya izin vermesi gerekmektedir. Ayrıca, bu işlemi gerçekleştirmek için cognito-idp:AdminInitiateAuth ve cognito-idp:AdminRespondToAuthChallenge izinlerine sahip kimlik bilgilerine ihtiyacınız vardır.

aws cognito-idp admin-initiate-auth \
--client-id <client-id> \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'
--user-pool-id "<pool-id>"

# Check the python code to learn how to generate the hsecret_hash
Giriş için Kod

```python import boto3 import botocore import hmac import hashlib import base64

client_id = "" user_pool_id = "" client_secret = "" username = "" password = ""

boto_client = boto3.client('cognito-idp', region_name='us-east-1')

def get_secret_hash(username, client_id, client_secret): key = bytes(client_secret, 'utf-8') message = bytes(f'{username}{client_id}', 'utf-8') return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

If the Client App isn't configured to use a secret

just delete the line setting the SECRET_HASH

def login_user(username_or_alias, password, client_id, client_secret, user_pool_id): try: return boto_client.admin_initiate_auth( UserPoolId=user_pool_id, ClientId=client_id, AuthFlow='ADMIN_USER_PASSWORD_AUTH', AuthParameters={ 'USERNAME': username_or_alias, 'PASSWORD': password, 'SECRET_HASH': get_secret_hash(username_or_alias, client_id, client_secret) } ) except botocore.exceptions.ClientError as e: return e.response

print(login_user(username, password, client_id, client_secret, user_pool_id))

</details>

### USER\_PASSWORD\_AUTH

Bu yöntem, başka bir basit ve geleneksel kullanıcı ve şifre doğrulama akışıdır. Geleneksel bir kimlik doğrulama yöntemini Cognito'ya taşımanız ve ardından bunu devre dışı bırakmanız ve yerine ALLOW\_USER\_SRP\_AUTH yöntemini kullanmanız önerilir (çünkü bu yöntem şifreyi ağ üzerinden göndermez). Bu yöntem varsayılan olarak **etkin değildir**.

Kod içindeki önceki kimlik doğrulama yöntemiyle ana fark, kullanıcı havuzu kimlik bilgisini bilmemeniz ve Cognito Kullanıcı Havuzu için ek izinlere ihtiyaç duymamanızdır.

Giriş yapmak için bilmeniz gerekenler:

- istemci kimliği
- kullanıcı adı
- şifre
- istemci sırrı (uygulama bir sır kullanacak şekilde yapılandırılmışsa)

<div data-gb-custom-block data-tag="hint" data-style='info'>

Bu yöntemle giriş yapabilmek için uygulamanın ALLOW\_USER\_PASSWORD\_AUTH ile giriş yapmaya izin vermesi gerekmektedir.

</div>

```python
aws cognito-idp initiate-auth  --client-id <client-id> \
--auth-flow USER_PASSWORD_AUTH --region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'

# Check the python code to learn how to generate the secret_hash

REFRESH_TOKEN_AUTH & REFRESH_TOKEN

Bu yöntem her zaman geçerli olacak (devre dışı bırakılamaz), ancak geçerli bir yenileme belirteci (refresh token) olması gerekmektedir.

aws cognito-idp initiate-auth \
--client-id 3ig6h5gjm56p1ljls1prq2miut \
--auth-flow REFRESH_TOKEN_AUTH \
--region us-east-1 \
--auth-parameters 'REFRESH_TOKEN=<token>'

Last updated