Cognito User Pools

Jifunze kuhusu udukuzi wa AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Pools ya mtumiaji ni saraka ya mtumiaji katika Amazon Cognito. Kwa pool ya mtumiaji, watumiaji wako wanaweza kuingia kwenye programu yako ya wavuti au simu kupitia Amazon Cognito, au kufederate kupitia mtoa huduma wa kitambulisho cha tatu (IdP). Iwe watumiaji wako wanajiunga moja kwa moja au kupitia mtu wa tatu, wanachama wote wa pool ya mtumiaji wana wasifu wa saraka ambao unaweza kufikia kupitia SDK.

Pools za mtumiaji hutoa:

  • Huduma za usajili na kuingia.

  • UI ya wavuti iliyojengwa, inayoweza kubadilishwa kuingiza watumiaji.

  • Kuingia kijamii na Facebook, Google, Ingia na Amazon, na Ingia na Apple, na kupitia watoa huduma wa kitambulisho wa SAML na OIDC kutoka kwa pool ya mtumiaji.

  • Usimamizi wa saraka ya mtumiaji na maelezo ya mtumiaji.

  • Vipengele vya usalama kama uthibitishaji wa hatua nyingi (MFA), ukaguzi wa vitambulisho vilivyoharibiwa, ulinzi dhidi ya kuchukua akaunti, na uthibitisho wa simu na barua pepe.

  • Mifumo iliyobinafsishwa na uhamiaji wa mtumiaji kupitia AWS Lambda triggers.

Msimbo wa chanzo wa programu mara nyingi utaambatisha kitambulisho cha pool ya mtumiaji na kitambulisho cha programu ya mteja, (na mara nyingine siri ya programu?) ambayo inahitajika kwa mtumiaji kuingia kwenye Pool ya Mtumiaji ya Cognito.

Mashambulizi Yanayowezekana

  • Usajili: Kwa chaguo-msingi mtumiaji anaweza kujisajili mwenyewe, hivyo anaweza kuunda mtumiaji kwa ajili yake mwenyewe.

  • Uchambuzi wa Mtumiaji: Kazi ya usajili inaweza kutumika kufunua majina ya watumiaji ambayo tayari yapo. Taarifa hii inaweza kuwa muhimu kwa shambulio la nguvu ya kutisha.

  • Shambulio la Nguvu ya Kuingia: Katika sehemu ya Uthibitishaji una njia zote ambazo mtumiaji anapaswa kuingia, unaweza kujaribu kuzitisha kwa kutafuta vitambulisho halali.

Zana za Pentesting

  • Pacu, mfumo wa udukuzi wa AWS, sasa una moduli za "cognito__enum" na "cognito__attack" ambazo zinautomatisha uchambuzi wa mali zote za Cognito kwenye akaunti na kuashiria miundo dhaifu, sifa za mtumiaji zinazotumiwa kwa udhibiti wa ufikiaji, n.k., na pia kiotomatiki uundaji wa mtumiaji (ikiwa ni pamoja na msaada wa MFA) na upandishaji wa mamlaka kulingana na sifa za kubadilika za desturi, vitambulisho vya kitambulisho vinavyoweza kutumika, majukumu yanayoweza kufikiwa katika alama za kitambulisho, n.k.

Kwa maelezo ya kazi za moduli angalia sehemu ya 2 ya chapisho la blogi. Kwa maelekezo ya usakinishaji angalia ukurasa wa kuu wa Pacu.

Matumizi

Matumizi ya mashambulizi ya cognito__attack kujaribu uundaji wa mtumiaji na vekta zote za upandishaji wa mamlaka dhidi ya kitambulisho kilichotolewa na mteja wa pool ya mtumiaji:

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

Mfano wa matumizi ya cognito__enum kukusanya mabwawa yote ya watumiaji, wateja wa bwawa la watumiaji, mabwawa ya utambulisho, watumiaji, n.k. yanayoonekana kwenye akaunti ya AWS ya sasa:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner ni chombo cha CLI kilichoandikwa kwa lugha ya python ambacho kinatekeleza mashambulizi tofauti kwenye Cognito ikiwa ni pamoja na uundaji usiohitajika wa akaunti na akaunti ya oracle.

Usanidi

$ pip install cognito-scanner

Matumizi

$ cognito-scanner --help

Kwa maelezo zaidi tembelea https://github.com/padok-team/cognito-scanner

Usajili

User Pools inaruhusu kwa chaguo-msingi ku sajili watumiaji wapya.

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

Ikiwa yeyote anaweza kusajili

Unaweza kukutana na kosa linalokuonyesha kwamba 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 kutumia JSON kama:

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

Unaweza kutumia hii kazi pia kwa kutambua watumiaji waliopo. Hii ni ujumbe wa kosa unapobaini kuwa mtumiaji tayari yupo na jina hilo:

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

Tafadhali kumbuka katika amri iliyotangulia jinsi vipengele vya desturi vinavyoanza na "desturi:". Pia tambua kwamba unapojiandikisha huwezi kuunda vipengele vipya vya desturi kwa mtumiaji. Unaweza tu kutoa thamani kwa vipengele vya msingi (hata kama sio lazima) na vipengele vya desturi vilivyotajwa.

Au jaribu tu kuona kama kitambulisho cha mteja kipo. Hii ni makosa ikiwa kitambulisho cha mteja hakipo:

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

Ikiwa ni admin pekee anaweza kujiandikisha watumiaji

Utakutana na kosa hili na hutaweza kujiandikisha au kuhesabu watumiaji:

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

Kudhibitisha Usajili

Cognito inaruhusu kudhibitisha mtumiaji mpya kwa kudhibitisha barua pepe au namba ya simu. Kwa hivyo, unapounda mtumiaji kawaida utahitajika angalau jina la mtumiaji na nywila na barua pepe na/au namba ya simu. Weka moja unayoidhibiti ili upokee nambari ya kudhibitisha mtumiaji wako mzuri uliounda akaunti kama hii:

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

Hata kama inaonekana unaweza kutumia barua pepe na nambari ya simu ile ile, unapohitaji kuthibitisha mtumiaji aliyeumbwa, Cognito italalamika kuhusu kutumia habari ile ile na haitakuruhusu kuthibitisha akaunti.

Kupandisha Mamlaka / Kubadilisha Sifa

Kwa chaguo-msingi mtumiaji anaweza kurekebisha thamani ya sifa zake kwa kitu kama:

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

Kupandisha hadhi ya siri ya sifa ya desturi

Unaweza kukuta sifa za desturi zikitumiwa (kama vile isAdmin), kwa chaguo-msingi unaweza kubadilisha thamani za sifa zako mwenyewe na huenda ukaweza kupandisha hadhi kwa kubadilisha thamani mwenyewe!

Kupandisha hadhi ya mabadiliko ya barua pepe/jina la mtumiaji

Unaweza kutumia hii kwa kubadilisha barua pepe na nambari ya simu ya mtumiaji, lakini, hata kama akaunti inabaki kama imehakikiwa, sifa hizo zitakuwa zimewekwa katika hali isiyo hakikiwa (utahitaji kuzihakiki tena).

Hutaweza kuingia kwa kutumia barua pepe au nambari ya simu hadi uzihakiki, lakini utaweza kuingia kwa kutumia jina la mtumiaji. Tambua kwamba hata kama barua pepe ilibadilishwa na haijahakikiwa, itaonekana katika Kitambulisho cha ID ndani ya barua pepe na sifa ya barua pepe_imethibitishwa itakuwa uwongo, lakini kama programu haikagua hilo unaweza kujifanya kuwa mtumiaji mwingine.

Zaidi ya hayo, tambua kwamba unaweza kuweka chochote ndani ya uga wa jina kwa kubadilisha sifa ya jina. Ikiwa programu ina inakagua uga huo kwa sababu fulani badala ya barua pepe (au sifa nyingine yoyote) unaweza kujifanya kuwa mtumiaji mwingine.

Kwa vyovyote vile, ikiwa kwa sababu fulani ulibadilisha barua pepe yako kwa mfano kuwa mpya unaweza kuthibitisha barua pepe kwa nambari uliyopokea kwenye anwani hiyo ya barua pepe:

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/kuthibitisha namba mpya ya simu.

Msimamizi pia anaweza kuwezesha chaguo la kuingia kwa kutumia jina la mtumiaji linalopendelewa. Tafadhali kumbuka huwezi kubadilisha thamani hii kuwa jina lolote au preferred_username tayari linalotumiwa kujifanya kuwa mtumiaji tofauti.

Kurejesha/Kubadilisha Nenosiri

Inawezekana kurejesha nenosiri kwa kujua tu jina la mtumiaji (au barua pepe au simu inakubalika) na kuwa na ufikiaji wake kwani nambari itatumwa hapo:

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

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

Kwa nambari unaweza kubadilisha nenosiri na:

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:

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

Uthibitisho

Kidole cha watumiaji kinaweza kusaidia njia tofauti za uthibitisho. Ikiwa una jina la mtumiaji na nywila kuna pia njia tofauti zinazoungwa mkono za kuingia. Zaidi ya hayo, wakati mtumiaji anathibitishwa kwenye Kidole aina 3 za vitufe hupewa: Kitufe cha ID, kitufe cha Upatikanaji na kitufe cha Kufufua.

  • Kitufe cha ID: Ina madai kuhusu utambulisho wa mtumiaji aliyethibitishwa, kama vile jina, barua pepe, na namba ya simu. Kitufe cha ID pia kinaweza kutumika ku kuhakiki watumiaji kwenye seva zako za rasilimali au programu za seva. Lazima uhakiki sahihi wa kitufe cha ID kabla ya kuamini madai yoyote ndani ya kitufe cha ID ikiwa unakitumia kwenye programu za nje.

  • Kitufe cha ID ndicho kitufe kinach kujumuisha thamani za sifa za mtumiaji, hata zile za desturi.

  • Kitufe cha Upatikanaji: Kina madai kuhusu mtumiaji aliye thibitishwa, orodha ya makundi ya mtumiaji, na orodha ya mizizi. Lengo la kitufe cha upatikanaji ni kuhalalisha shughuli za API katika muktadha wa mtumiaji kwenye kidole cha mtumiaji. Kwa mfano, unaweza kutumia kitufe cha upatikanaji ku kuidhinisha shughuli za API za kuongeza, kubadilisha, au kufuta sifa za mtumiaji.

  • Kitufe cha Kufufua: Kwa vitufe vya kufufua unaweza kupata vitufe vipya vya ID na Upatikanaji kwa mtumiaji hadi kitufe cha kufufua kikawa batili. Kwa chaguo-msingi, kitufe cha kufufua hufikia ukomo baada ya siku 30 tangu mtumiaji wa programu yako ajiandikishe kwenye kidole cha mtumiaji. Unapounda programu kwa kidole chako cha mtumiaji, unaweza kuweka ukomo wa kufutwa kwa kitufe cha kufufua cha programu yako hadi thamani yoyote kati ya dakika 60 na miaka 10.

ADMIN_NO_SRP_UTHIBITISHO & ADMIN_USER_PASSWORD_UTHIBITISHO

Hii ni mchakato wa uthibitisho wa upande wa seva:

  • Programu ya upande wa seva inaita AdminInitiateAuth API operation (badala ya InitiateAuth). Operesheni hii inahitaji sifa 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 kupata vigezo vya uthibitisho, inaita AdminRespondToAuthChallenge API operation. Operesheni ya API ya AdminRespondToAuthChallenge inafanikiwa tu unapotoa sifa za AWS.

Hii njia HAIJAWEZESHWA kwa chaguo-msingi.

Ili kuingia unahitaji kujua:

  • kitambulisho cha kidole cha mtumiaji

  • kitambulisho cha mteja

  • jina la mtumiaji

  • nywila

  • siri ya mteja (ikiwa programu imeboreshwa kutumia siri)

Ili kuweza kuingia kwa njia hii programu hiyo inapaswa kuruhusu kuingia na RUHUSU_ADMIN_USER_PASSWORD_AUTH. Zaidi ya hayo, kutekeleza hatua hii unahitaji sifa zenye ruhusa za**cognito-idp:AdminInitiateAuth**na cognito-idp:AdminRespondToAuthChallenge

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
Msimbo wa Kuingia

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

Hii njia ni nyingine rahisi na **ya jadi ya uthibitishaji wa mtumiaji na nywila**. Inapendekezwa **kuhamisha njia ya jadi** ya uthibitishaji **kwenda Cognito** na **kupendekezwa** kisha **kuidisable** na **kutumia** njia ya **ALLOW\_USER\_SRP\_AUTH** badala yake (kwani haitumi nywila kupitia mtandao).\
Hii **njia HAIAKTIVI** kwa chaguo-msingi.

To **kuingia** unahitaji kujua:

* kitambulisho cha mteja
* jina la mtumiaji
* nywila
* siri ya mteja (ikiwa programu imeundwa kutumia siri)

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

Ili **kuweza kuingia kwa njia hii**, programu lazima iruhusu kuingia na ALLOW\_USER\_PASSWORD\_AUTH.

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

KITHIBITISHO_LA_KUHAKIKISHA_TENAI_& KITHIBITISHO_CHA_KUHAKIKISHA_TENAI

Mbinu hii itakuwa halali daima (haiwezi kulemazwa) lakini unahitaji kuwa na kithibitisho cha kuhakikisha tena kilicho halali.

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

Last updated