Cognito User Pools

Reading time: 16 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Basic Information

Maktaba ya mtumiaji ni directory ya watumiaji katika Amazon Cognito. Kwa maktaba ya mtumiaji, watumiaji wako wanaweza kuingia kwenye programu yako ya wavuti au simu kupitia Amazon Cognito, au kuunganishwa kupitia mtoa huduma wa utambulisho wa third-party (IdP). Iwe watumiaji wako wanaingia moja kwa moja au kupitia upande wa tatu, wanachama wote wa maktaba ya mtumiaji wana wasifu wa directory ambao unaweza kufikia kupitia SDK.

Maktaba za watumiaji zinatoa:

  • Huduma za kujiandikisha na kuingia.
  • UI ya wavuti iliyojengwa ndani, inayoweza kubadilishwa ili kuingia watumiaji.
  • Kuingia kwa kijamii na Facebook, Google, Login with Amazon, na Sign in with Apple, na kupitia mtoa huduma wa utambulisho wa SAML na OIDC kutoka kwa maktaba yako ya watumiaji.
  • Usimamizi wa directory ya watumiaji na wasifu wa watumiaji.
  • Vipengele vya usalama kama uthibitishaji wa hatua nyingi (MFA), ukaguzi wa akidi zilizovunjika, ulinzi wa kuchukua akaunti, na uthibitishaji wa simu na barua pepe.
  • Mifumo ya kazi iliyobadilishwa na uhamaji wa watumiaji kupitia AWS Lambda triggers.

Msimbo wa chanzo wa programu kawaida pia utakuwa na user pool ID na client application ID, (na wakati mwingine application secret?) ambazo zinahitajika kwa mtumiaji kuingia kwenye Maktaba ya Mtumiaji ya Cognito.

Potential attacks

  • Usajili: Kwa default mtumiaji anaweza kujiandikisha mwenyewe, hivyo anaweza kuunda mtumiaji kwa ajili yake mwenyewe.
  • Uainishaji wa watumiaji: Kazi ya usajili inaweza kutumika kupata majina ya watumiaji ambayo tayari yapo. Taarifa hii inaweza kuwa muhimu kwa shambulio la brute-force.
  • Login brute-force: Katika sehemu ya Uthibitishaji una mbinu zote ambazo mtumiaji anapaswa kuingia, unaweza kujaribu kujaribu nguvu kupata akidi halali.

Tools for pentesting

  • Pacu, sasa inajumuisha moduli za cognito__enum na cognito__attack ambazo zinafanya otomatiki uainishaji wa mali zote za Cognito katika akaunti na kuashiria usanidi dhaifu, sifa za mtumiaji zinazotumika kwa udhibiti wa ufikiaji, nk, na pia zinafanya otomatiki uundaji wa watumiaji (ikiwemo msaada wa MFA) na kupandisha hadhi kulingana na sifa za kawaida zinazoweza kubadilishwa, akidi za utambulisho zinazoweza kutumika, majukumu yanayoweza kuchukuliwa katika alama za id, nk.
    Kwa maelezo ya kazi za moduli angalia sehemu ya 2 ya blog post. Kwa maelekezo ya usakinishaji angalia ukurasa mkuu wa Pacu.
bash
# Run cognito__enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account
Pacu (new:test) > run cognito__enum

# cognito__attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client:
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 Scanner ni chombo cha CLI katika python ambacho kinatekeleza mashambulizi tofauti kwenye Cognito ikiwa ni pamoja na uundaji wa akaunti zisizohitajika na oracle ya akaunti. Angalia this link kwa maelezo zaidi.
bash
# Install
pip install cognito-scanner
# Run
cognito-scanner --help
bash
python cognito-attribute-enu.py -client_id 16f1g98bfuj9i0g3f8be36kkrl

Usajili

User Pools inaruhusu kwa kawaida kujiandikisha watumiaji wapya.

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

Ikiwa mtu yeyote anaweza kujiandikisha

Unaweza kupata kosa linaloonyesha kuwa unahitaji kutoa maelezo zaidi kuhusu mtumiaji:

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

Unaweza kutoa maelezo yanayohitajika kwa JSON kama:

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

Unaweza kutumia kazi hii pia kuorodhesha watumiaji waliopo. Hii ndiyo ujumbe wa kosa wakati mtumiaji tayari yupo na jina hilo:

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

note

Kumbuka katika amri ya awali jinsi sifa za kawaida zinaanza na "custom:".
Pia fahamu kwamba unapojisajili huwezi kuunda sifa mpya za kawaida kwa mtumiaji. Unaweza tu kutoa thamani kwa sifa za kawaida (hata kama hazihitajiki) na sifa za kawaida zilizotajwa.

Au tu kujaribu kama kitambulisho cha mteja kinapatikana. Hii ndiyo hitilafu ikiwa kitambulisho cha mteja hakipo:

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

Ikiwa tu admin anaweza kujiandikisha watumiaji

Utapata kosa hili na huwezi kujiandikisha au kuhesabu watumiaji:

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

Kuangalia Usajili

Cognito inaruhusu kuangalia mtumiaji mpya kwa kuangalia barua pepe yake au nambari ya simu. Hivyo, unapounda mtumiaji kwa kawaida utahitajika angalau jina la mtumiaji na nenosiri na barua pepe na/au nambari ya simu. Weka tu moja unayoimiliki ili upokee msimbo wa kuangalia akaunti yako mpya ya mtumiaji iliyoundwa kama hii:

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

warning

Hata kama inaonekana unaweza kutumia barua pepe na nambari ya simu sawa, unapohitaji kuthibitisha mtumiaji aliyeundwa Cognito italamika kuhusu kutumia taarifa sawa na haitakuruhusu kuthibitisha akaunti.

Kuinua Mamlaka / Kusasisha Sifa

Kwa default mtumiaji anaweza kubadilisha thamani ya sifa zake kwa kitu kama:

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

Uhamasishaji wa sifa za kawaida

caution

Unaweza kupata sifa za kawaida zikitumika (kama isAdmin), kwani kwa kawaida unaweza kubadilisha thamani za sifa zako mwenyewe unaweza kuwa na uwezo wa kuongeza mamlaka kwa kubadilisha thamani hiyo mwenyewe!

Uhamasishaji wa mabadiliko ya barua pepe/jina la mtumiaji

Unaweza kutumia hii kubadilisha barua pepe na nambari ya simu ya mtumiaji, lakini kisha, hata kama akaunti inabaki kuwa imethibitishwa, sifa hizo zimewekwa katika hali ya kuthibitishwa (unahitaji kuzithibitisha tena).

warning

Hutaweza kuingia kwa kutumia barua pepe au nambari ya simu hadi uzithibitisha, lakini utaweza kuingia kwa kutumia jina la mtumiaji.
Kumbuka kwamba hata kama barua pepe ilibadilishwa na haijathibitishwa itaonekana katika Token ya ID ndani ya email field na uwanja email_verified utakuwa uongo, lakini ikiwa programu haiangalii hiyo unaweza kujifanya kuwa watumiaji wengine.

Zaidi ya hayo, kumbuka kwamba unaweza kuweka chochote ndani ya name field kwa kubadilisha sifa ya jina. Ikiwa programu inakagua uwanja huo kwa sababu fulani badala ya email (au sifa nyingine yoyote) unaweza kuwa na uwezo wa kujifanya kuwa watumiaji wengine.

Hata hivyo, ikiwa kwa sababu fulani umebadilisha barua pepe yako kwa mfano kuwa mpya unayoweza kufikia unaweza kuthibitisha barua pepe hiyo kwa kutumia nambari uliyopokea katika anwani hiyo ya barua pepe:

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

Tumia phone_number badala ya email kubadilisha/thibitisha nambari mpya ya simu.

note

Msimamizi anaweza pia kuwezesha chaguo la kuingia kwa kutumia jina la mtumiaji linalopendekezwa na mtumiaji. Kumbuka kwamba huwezi kubadilisha thamani hii kuwa jina lolote la mtumiaji au preferred_username ambalo tayari linatumika kuiga mtumiaji mwingine.

Rejesha/Badilisha Nenosiri

Inawezekana kurejesha nenosiri kwa kujua tu jina la mtumiaji (au email au simu inakubaliwa) na kuwa na ufikiaji kwake kwani msimbo utatumwa huko:

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

note

Jibu la seva daima litakuwa chanya, kama vile jina la mtumiaji lilipo. Huwezi kutumia njia hii kuhesabu watumiaji

Kwa msimbo unaweza kubadilisha nenosiri kwa:

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

Ili kubadilisha nenosiri unahitaji kujua nenosiri la awali:

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

Uthibitisho

Mkusanyiko wa watumiaji unasaidia njia tofauti za kuthibitisha. Ikiwa una jina la mtumiaji na nenosiri, pia kuna mbinu tofauti zinazosaidiwa kuingia.
Zaidi ya hayo, wakati mtumiaji anathibitishwa katika Mkusanyiko aina 3 za tokeni hutolewa: ID Token, Access token na Refresh token.

  • ID Token: Inajumuisha madai kuhusu utambulisho wa mtumiaji aliyethibitishwa, kama vile name, email, na phone_number. ID token inaweza pia kutumika kuhifadhi watumiaji kwenye seva zako za rasilimali au programu za seva. Lazima uthibitishe saini ya ID token kabla ya kuweza kuamini madai yoyote ndani ya ID token ikiwa unaitumia katika programu za nje.
  • ID Token ndiyo token ambayo ina thamani za sifa za mtumiaji, hata zile za kawaida.
  • Access Token: Inajumuisha madai kuhusu mtumiaji aliyethibitishwa, orodha ya makundi ya mtumiaji, na orodha ya mipaka. Lengo la access token ni kuidhinisha operesheni za API katika muktadha wa mtumiaji katika mkusanyiko wa watumiaji. Kwa mfano, unaweza kutumia access token kumpatia mtumiaji wako ufikiaji wa kuongeza, kubadilisha, au kufuta sifa za mtumiaji.
  • Refresh Token: Kwa kutumia refresh tokens unaweza kupata ID Tokens na Access Tokens mpya kwa mtumiaji hadi refresh token ipoteze nguvu. Kwa kawaida, refresh token inaisha siku 30 baada ya mtumiaji wa programu yako kuingia kwenye mkusanyiko wa watumiaji. Unapounda programu kwa ajili ya mkusanyiko wako wa watumiaji, unaweza kuweka muda wa kumalizika wa refresh token wa programu kuwa thamani yoyote kati ya dakika 60 na miaka 10.

ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH

Hii ni mchakato wa uthibitisho upande wa seva:

  • Programu ya upande wa seva inaita AdminInitiateAuth API operation (badala ya InitiateAuth). Operesheni hii inahitaji ithibati za AWS zenye ruhusa zinazojumuisha cognito-idp:AdminInitiateAuth na cognito-idp:AdminRespondToAuthChallenge. Operesheni inarudisha vigezo vya uthibitisho vinavyohitajika.
  • Baada ya programu ya upande wa seva kuwa na vigezo vya uthibitisho, inaita AdminRespondToAuthChallenge API operation. Operesheni ya AdminRespondToAuthChallenge inafanikiwa tu unapotoa ithibati za AWS.

Njia hii HAIRUHUSIWI kwa kawaida.

Ili kuingia unahitaji kujua:

  • kitambulisho cha mkusanyiko wa watumiaji
  • kitambulisho cha mteja
  • jina la mtumiaji
  • nenosiri
  • siri ya mteja (tu ikiwa programu imewekwa ili kutumia siri)

note

Ili uweze kuingia kwa njia hii programu hiyo lazima iruhusu kuingia kwa ALLOW_ADMIN_USER_PASSWORD_AUTH.
Zaidi ya hayo, ili kutekeleza hatua hii unahitaji ithibati zenye ruhusa cognito-idp:AdminInitiateAuth na cognito-idp:AdminRespondToAuthChallenge

python
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
Kanuni za Kuingia
python
import boto3
import botocore
import hmac
import hashlib
import base64


client_id = "<client-id>"
user_pool_id = "<user-pool-id>"
client_secret = "<client-secret>"
username = "<username>"
password = "<pwd>"

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

USER_PASSWORD_AUTH

Njia hii ni mchakato mwingine rahisi na wa jadi wa uthibitishaji wa mtumiaji na nenosiri. Inapendekezwa kuhamasisha njia ya jadi ya uthibitishaji kwenda Cognito na inapendekezwa kisha kuzimwa na kutumia njia ya ALLOW_USER_SRP_AUTH badala yake (kwa sababu hiyo haitumii nenosiri kwenye mtandao).
Njia hii HAIJAWEKWA kuwa hai kwa chaguo-msingi.

Tofauti kuu na njia ya uthibitishaji ya awali ndani ya msimbo ni kwamba huhitaji kujua kitambulisho cha kundi la watumiaji na kwamba huhitaji ruhusa za ziada katika Kundi la Watumiaji la Cognito.

Ili kuingia unahitaji kujua:

  • kitambulisho cha mteja
  • jina la mtumiaji
  • nenosiri
  • siri ya mteja (tu ikiwa programu imewekwa ili kutumia siri)

note

Ili uweze kuingia kwa njia hii programu hiyo lazima iruhusu kuingia kwa ALLOW_USER_PASSWORD_AUTH.

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
Python code ya Kuingia
python
import boto3
import botocore
import hmac
import hashlib
import base64


client_id = "<client-id>"
user_pool_id = "<user-pool-id>"
client_secret = "<client-secret>"
username = "<username>"
password = "<pwd>"

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

USER_SRP_AUTH

Hii ni hali inayofanana na ile ya awali lakini badala ya kutuma nenosiri kupitia mtandao kuingia, uthibitishaji wa changamoto unafanywa (hivyo hakuna nenosiri linalopita hata kama limeandikwa kwa usalama kupitia mtandao).
Hii mbinu imewezeshwa kwa default.

Ili kuingia unahitaji kujua:

  • user pool id
  • client id
  • username
  • password
  • client secret (tu ikiwa programu imewekwa kutumia siri)
Code to login
python
from warrant.aws_srp import AWSSRP
import os

USERNAME='xxx'
PASSWORD='yyy'
POOL_ID='us-east-1_zzzzz'
CLIENT_ID = '12xxxxxxxxxxxxxxxxxxxxxxx'
CLIENT_SECRET = 'secreeeeet'
os.environ["AWS_DEFAULT_REGION"] = "<region>"

aws = AWSSRP(username=USERNAME, password=PASSWORD, pool_id=POOL_ID,
client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
tokens = aws.authenticate_user()
id_token = tokens['AuthenticationResult']['IdToken']
refresh_token = tokens['AuthenticationResult']['RefreshToken']
access_token = tokens['AuthenticationResult']['AccessToken']
token_type = tokens['AuthenticationResult']['TokenType']

REFRESH_TOKEN_AUTH & REFRESH_TOKEN

Hii mbinu daima itakuwa halali (haiwezi kuzuiliwa) lakini unahitaji kuwa na tokeni ya kusasisha halali.

bash
aws cognito-idp initiate-auth \
--client-id 3ig6h5gjm56p1ljls1prq2miut \
--auth-flow REFRESH_TOKEN_AUTH \
--region us-east-1 \
--auth-parameters 'REFRESH_TOKEN=<token>'
Kanuni ya kuhuisha
python
import boto3
import botocore
import hmac
import hashlib
import base64

client_id = "<client-id>"
token = '<token>'

boto_client = boto3.client('cognito-idp', region_name='<region>')

def refresh(client_id, refresh_token):
try:
return boto_client.initiate_auth(
ClientId=client_id,
AuthFlow='REFRESH_TOKEN_AUTH',
AuthParameters={
'REFRESH_TOKEN': refresh_token
}
)
except botocore.exceptions.ClientError as e:
return e.response


print(refresh(client_id, token))

CUSTOM_AUTH

Katika kesi hii, uthibitishaji utafanywa kupitia utendaji wa kazi ya lambda.

Usalama wa Ziada

Usalama wa Juu

Kwa kawaida umezimwa, lakini ikiwa umewezeshwa, Cognito inaweza kuwa na uwezo wa kupata uhamasishaji wa akaunti. Ili kupunguza uwezekano, unapaswa kuingia kutoka kwa mtandao ndani ya jiji moja, ukitumia wakala yule yule wa mtumiaji (na IP ikiwa inawezekana).

MFA Kumbuka kifaa

Ikiwa mtumiaji anaingia kutoka kwa kifaa kile kile, MFA inaweza kupuuziliwa mbali, hivyo jaribu kuingia kutoka kwa kivinjari kile kile na metadata ile ile (IP?) ili kujaribu kupuuzilia mbali ulinzi wa MFA.

Vikundi vya User Pool IAM Roles

Inawezekana kuongeza watumiaji kwenye vikundi vya User Pool vinavyohusiana na IAM roles moja.
Zaidi ya hayo, watumiaji wanaweza kupewa vikundi zaidi ya 1 vyenye IAM roles tofauti vinavyounganishwa.

Kumbuka kwamba hata kama kundi liko ndani ya kundi lenye IAM role iliyounganishwa, ili kuweza kufikia akidi za IAM za kundi hilo inahitajika kwamba User Pool itumike na Identity Pool (na kujua maelezo ya Identity Pool hiyo).

Sharti lingine ili kupata IAM role iliyoonyeshwa katika IdToken wakati mtumiaji anathibitishwa katika User Pool (aws cognito-idp initiate-auth...) ni kwamba Mtoa Huduma wa Uthibitishaji wa Kitambulisho anahitaji kuonyesha kwamba role inapaswa kuchaguliwa kutoka kwa token.

Roles ambazo mtumiaji anaweza kufikia ziko ndani ya IdToken, na mtumiaji anaweza kuchagua ni role ipi anataka akidi zake kwa kutumia --custom-role-arn kutoka aws cognito-identity get-credentials-for-identity.
Hata hivyo, ikiwa chaguo la kawaida ndilo limewekwa (tumia role ya kawaida), na unajaribu kufikia role kutoka kwa IdToken, utapata kosa (ndiyo maana usanidi wa awali unahitajika):

An error occurred (InvalidParameterException) when calling the GetCredentialsForIdentity operation: Only SAML providers and providers with RoleMappings support custom role ARN.

warning

Kumbuka kwamba jukumu lililotolewa kwa User Pool Group linahitaji kuwa linapatikana na Mtoa Kitambulisho ambaye anatumaini User Pool (kama akili za kikao cha IAM zitapatikana kutoka kwake).

json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1:2361092e-9db6-a876-1027-10387c9de439"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}js

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks