Cognito User Pools

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

'n Gebruikerspoel is 'n gebruikersgids in Amazon Cognito. Met 'n gebruikerspoel kan jou gebruikers aanmeld by jou web- of mobiele program deur Amazon Cognito, of federasie deur 'n derde party-identiteitsverskaffer (IdP). Of jou gebruikers direk aanmeld of deur 'n derde party, het alle lede van die gebruikerspoel 'n gidsprofiel wat jy kan bereik deur 'n SDK.

Gebruikerspoele bied:

  • Aanmeld- en inligtingsdiens.

  • 'n Ingeboude, aanpasbare web-gebruikerskoppelvlak om gebruikers aan te meld.

  • Sosiale aanmelding met Facebook, Google, Aanmelding met Amazon, en Aanmelding met Apple, en deur SAML en OIDC-identiteitsverskaffers van jou gebruikerspoel.

  • Gebruikersgidsbestuur en gebruikersprofiels.

  • Sekuriteitskenmerke soos multi-faktor-outentifikasie (MFA), kontrole vir gekompromitteerde geloofsbriewe, rekeningoornamesbeskerming, en telefoon- en e-posverifikasie.

  • Aangepaste werksvloeie en gebruikersmigrasie deur AWS Lambda-triggers.

Bronkode van programme sal gewoonlik ook die gebruikerspoel-ID en die kliënttoepassings-ID bevat, (en soms die toepassingsgeheim?) wat nodig is vir 'n gebruiker om aan te meld by 'n Cognito-gebruikerspoel.

Potensiële aanvalle

  • Registrasie: Standaard kan 'n gebruiker homself registreer, sodat hy 'n gebruiker vir homself kan skep.

  • Gebruikeropsomming: Die registrasiefunksionaliteit kan gebruik word om gebruikersname wat reeds bestaan, te vind. Hierdie inligting kan nuttig wees vir die brutale krag-aanval.

  • Inligtingsoorlogvoering: In die Outentifikasie afdeling het jy al die metodes wat 'n gebruiker moet gebruik om aan te meld, jy kan probeer om hulle met brutale krag aan te val om geldige geloofsbriewe te vind.

Gereedskap vir pentesting

  • Pacu, die AWS-uitbuitingsraamwerk, sluit nou die "cognito__enum" en "cognito__attack" modules in wat outomatiese opsomming van alle Cognito-bates in 'n rekening en swak konfigurasies, gebruikerskenmerke wat vir toegangsbeheer gebruik word, ens., en ook outomatiese gebruikerskepping (insluitend MFA-ondersteuning) en voorregverhoging gebaseer op aanpasbare gebruikerskenmerke, bruikbare identiteitspoelgeldeenhede, aanneembare rolle in id-tokens, ens., outomatiseer.

Vir 'n beskrywing van die funksies van die modules, sien deel 2 van die blogpos. Vir installasie-instruksies, sien die hoof Pacu bladsy.

Gebruik

Voorbeeld van cognito__aanval-gebruik om gebruikerskepping te probeer en alle voorregverhogingsvektore teen 'n gegewe identiteitspoel en gebruikerspoelklient:

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

Voorbeeld van cognito__enum gebruik om alle gebruikerspoelen, gebruikerspoelkliënte, identiteitspoelen, gebruikers, ens. te versamel wat sigbaar is in die huidige AWS-rekening:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner is 'n CLI-werktuig in Python wat verskillende aanvalle op Cognito implementeer, insluitend ongewenste rekening skepping en rekening orakel.

Installasie

$ pip install cognito-scanner

Gebruik

$ cognito-scanner --help

Vir meer inligting, besoek https://github.com/padok-team/cognito-scanner

Registrasie

Gebruikerpoele laat standaard toe om nuwe gebruikers te registreer.

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

As iemand kan registreer

Jy mag 'n fout vind wat aandui dat jy meer besonderhede van die gebruiker moet verskaf:

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

Jy kan die benodigde besonderhede verskaf met 'n JSON soos:

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

Jy kan hierdie funksionaliteit ook gebruik om bestaande gebruikers op te som. Dit is die foutboodskap wanneer 'n gebruiker reeds met daardie naam bestaan:

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

Let op in die vorige bevel hoe die aangepaste eienskappe met "custom:" begin. Weet ook dat wanneer jy registreer jy nie nuwe aangepaste eienskappe vir die gebruiker kan skep nie. Jy kan net waarde gee aan verstek eienskappe (selfs al is hulle nie verpligtend nie) en gespesifiseerde aangepaste eienskappe.

Of net om te toets of 'n klient-ID bestaan. Dit is die fout as die klient-ID nie bestaan nie:

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

As slegs administrateurs gebruikers kan registreer

Jy sal hierdie fout vind en jy sal nie in staat wees om gebruikers te registreer of op te som nie:

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

Verifieer Registrasie

Cognito maak dit moontlik om 'n nuwe gebruiker te verifieer deur sy e-pos of telefoonnommer te verifieer. Daarom, wanneer jy 'n gebruiker skep, sal jy gewoonlik ten minste die gebruikersnaam en wagwoord en die e-pos en/of telefoonnommer benodig. Stel net een wat jy beheer sodat jy die kode sal ontvang om jou nuutgeskepte gebruikersrekening te verifieer soos hierdie:

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

Selfs al lyk dit asof jy dieselfde e-posadres en telefoonnommer kan gebruik, wanneer jy die geskepte gebruiker moet verifieer, sal Cognito kla oor die gebruik van dieselfde inligting en sal nie toelaat dat jy die rekening verifieer nie.

Voorreg-escalasie / Opdatering van Eienskappe

Standaard kan 'n gebruiker die waarde van sy eienskappe wysig met iets soos:

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

Aangepaste attribuut privesc

Jy mag dalk aangepaste eienskappe sien wat gebruik word (soos isAdmin), aangesien jy standaard die waardes van jou eie eienskappe kan **verander, kan jy miskien privileges eskaleer deur die waarde self te verander!

E-pos/gebruikersnaam wysiging privesc

Jy kan dit gebruik om die e-pos en telefoonnommer van 'n gebruiker te verander, maar selfs al bly die rekening geverifieer, is daardie eienskappe in 'n ongeverifieerde status ingestel (jy moet hulle weer verifieer).

Jy sal nie kan aanmeld met e-pos of telefoonnommer voordat jy hulle verifieer nie, maar jy sal kan aanmeld met die gebruikersnaam. Let daarop dat selfs as die e-pos gewysig is en nie geverifieer is nie, sal dit verskyn in die ID-token binne die e-pos veld en die veld e-pos_geverifieer sal vals wees, maar as die app **nie daarna kyk nie, kan jy ander gebruikers impersoneer.

Verder, let daarop dat jy enigiets binne die naam veld kan plaas deur net die naam attribuut te wysig. As 'n app daarna kyk vir een of ander rede in plaas van die e-pos (of enige ander eienskap), kan jy ander gebruikers impersoneer.

Hoe dan ook, as jy om een of ander rede jou e-pos byvoorbeeld na 'n nuwe een verander het, kan jy die e-pos bevestig met die kode wat jy in daardie e-posadres ontvang het:

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

Gebruik telefoon_nommer in plaas van e-pos om 'n nuwe telefoonnommer te verander/te bevestig.

Die administrateur kan ook die opsie aktiveer om met 'n gebruikersvoorkeur gebruikersnaam in te teken. Let daarop dat jy hierdie waarde nie kan verander na enige gebruikersnaam of voorkeur_gebruikersnaam wat reeds gebruik word om 'n ander gebruiker voor te gee nie.

Herstel/Verander Wagwoord

Dit is moontlik om 'n wagwoord te herstel deur net die gebruikersnaam te ken (of e-pos of telefoon word aanvaar) en toegang daartoe te hê aangesien 'n kode daarheen gestuur sal word:

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

Die reaksie van die bediener sal altyd positief wees, soosof die gebruikersnaam bestaan. Jy kan nie hierdie metode gebruik om gebruikers op te som nie.

Met die kode kan jy die wagwoord verander met:

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

Om die wagwoord te verander, moet jy die vorige wagwoord ken:

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

Verifikasie

'n Gebruikerspoel ondersteun verskillende maniere van verifikasie. As jy 'n gebruikersnaam en wagwoord het, is daar ook verskillende metodes wat ondersteun word vir aanmelding. Verder, wanneer 'n gebruiker geauthentiseer word in die Poel, word 3 tipes tokens gegee: Die ID-token, die Toegangstoken en die Vernuwings-token.

  • ID-token: Dit bevat bewerings oor die identiteit van die geauthentiseerde gebruiker, soos naam, e-pos, en telefoonnommer. Die ID-token kan ook gebruik word om gebruikers te verifieer na jou hulpbrondieners of bedienertoepassings. Jy moet die handtekening van die ID-token verifieer voordat jy enige bewerings binne die ID-token kan vertrou as jy dit in eksterne toepassings gebruik.

  • Die ID-token is die token wat die attribuutwaardes van die gebruiker bevat, selfs die aangepaste een.

  • Toegangstoken: Dit bevat bewerings oor die geauthentiseerde gebruiker, 'n lys van die gebruiker se groepe, en 'n lys van reikwydtes. Die doel van die toegangstoken is om API-operasies te magtig in die konteks van die gebruiker in die gebruikerspoel. Byvoorbeeld, jy kan die toegangstoken gebruik om jou gebruiker toegang te gee om gebruikerattribuute by te voeg, te verander, of te verwyder.

  • Vernuwings-token: Met vernuwings-tokens kan jy nuwe ID-tokens en Toegangstokens vir die gebruiker kry totdat die vernuwingstoken ongeldig is. Standaard verval die vernuwings-token 30 dae na jou aansoekgebruiker in jou gebruikerspoel aanmeld. Wanneer jy 'n aansoek vir jou gebruikerspoel skep, kan jy die vervaldatum van die aansoek se vernuwings-token instel op enige waarde tussen 60 minute en 10 jaar.

ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH

Dit is die bedienerkant-verifikasievloei:

  • Die bedienerkant-toep roep die AdminInitiateAuth API-operasie aan (in plaas van InitiateAuth). Hierdie operasie vereis AWS-legitimasie met toestemmings wat cognito-idp:AdminInitiateAuth en cognito-idp:AdminRespondToAuthChallenge insluit. Die operasie gee die vereiste verifikasieparameters terug.

  • Nadat die bedienerkant-toep die verifikasieparameters het, roep dit die AdminRespondToAuthChallenge API-operasie aan. Die AdminRespondToAuthChallenge API-operasie slaag net as jy AWS-legitimasie voorsien.

Hierdie metode is NIE standaard geaktiveer nie.

Om aan te meld, moet jy weet:

  • gebruikerspoel-ID

  • kliënt-ID

  • gebruikersnaam

  • wagwoord

  • kliëntgeheim (slegs as die toepassing gekonfigureer is om 'n geheim te gebruik)

Om met hierdie metode te kan aanmeld, moet die toepassing toelaat om aan te meld met ALLOW_ADMIN_USER_PASSWORD_AUTH. Verder, om hierdie aksie uit te voer, het jy legitimasie met die toestemmings cognito-idp:AdminInitiateAuth en cognito-idp:AdminRespondToAuthChallenge nodig.

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

Code om in te teken

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

GEBRUIKER_WAGWOORD_VERIFIKASIE

Hierdie metode is 'n ander eenvoudige en tradisionele gebruiker & wagwoord verifikasie vloei. Dit word aanbeveel om 'n tradisionele verifikasiemetode na Cognito te migreer en dit dan af te skakel en in plaas daarvan die ALLOW_USER_SRP_AUTH metode te gebruik (omdat dit nooit die wagwoord oor die netwerk stuur). Hierdie metode is NIE standaard geaktiveer nie.

Die hoof verskil met die vorige verifikasiemetode binne die kode is dat jy nie die gebruikerpoel-ID hoef te weet nie en dat jy nie ekstra toestemmings in die Cognito-gebruikerpoel nodig het nie.

Om aan te meld, moet jy weet:

  • kliënt-ID

  • gebruikersnaam

  • wagwoord

  • kliënt-geheim (slegs as die program ingestel is om 'n geheim te gebruik)

Om met hierdie metode aan te meld, moet die toepassing toelaat om met ALLOW_USER_PASSWORD_AUTH aan te meld.

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-kode om in te teken

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

GEBRUIKER_SRP_AUTH

Hierdie scenario is soortgelyk aan die vorige een, maar in plaas daarvan om die wagwoord deur die netwerk te stuur om in te teken, word 'n uitdagingverifikasie uitgevoer (so geen wagwoord navigeer selfs versleutel deur die net). Hierdie metode is standaard geaktiveer.

Om in te teken, moet jy weet:

  • gebruikerpoel-ID

  • kliënt-ID

  • gebruikersnaam

  • wagwoord

  • kliëntgeheim (slegs as die program geconfigureer is om 'n geheim te gebruik)

Kode om in te teken

```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"] = ""

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']

</details>

### VERNIEWINGSLEUTEL_AUTH & VERNIEWINGSLEUTEL

Hierdie **metode sal altyd geldig wees** (dit kan nie uitgeskakel word nie), maar jy moet 'n geldige verniewingsleutel hê.
```bash
aws cognito-idp initiate-auth \
--client-id 3ig6h5gjm56p1ljls1prq2miut \
--auth-flow REFRESH_TOKEN_AUTH \
--region us-east-1 \
--auth-parameters 'REFRESH_TOKEN=<token>'

Kode om te verfris

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

AANGEPASTE_AUTH

In hierdie geval sal die verifikasie uitgevoer word deur die uitvoering van 'n lambda funksie.

Ekstra Sekuriteit

Gevorderde Sekuriteit

Standaard is dit gedeaktiveer, maar indien geaktiveer, kan Cognito in staat wees om rekening-oorneem-aanvalle te vind. Om die waarskynlikheid te verminder, moet jy vanaf 'n netwerk binne dieselfde stad inlog, met dieselfde gebruikersagent (en IP as dit moontlik is).

MFA Onthou toestel

Indien die gebruiker vanaf dieselfde toestel inlog, kan die MFA moontlik omseil word, probeer dus om vanaf dieselfde webblaaier met dieselfde metadata (IP?) in te log om die MFA-beskerming te omseil.

Gebruikerpoelgroepe IAM-rolle

Dit is moontlik om gebruikers by Gebruikerpoel-groepe toe te voeg wat verband hou met een IAM-rol. Verder kan gebruikers toegewys word aan meer as 1 groep met verskillende IAM-rolle wat daaraan geheg is.

Let daarop dat selfs al is 'n groep binne 'n groep met 'n IAM-rol geheg, ten einde toegang te verkry tot IAM-legitimasie van daardie groep, is dit nodig dat die Gebruikerpoel vertrou word deur 'n Identiteitspoel (en die besonderhede van daardie Identiteitspoel ken).

'n Ander vereiste om die IAM-rol aangedui in die IdToken te kry wanneer 'n gebruiker geoutentiseer word in die Gebruikerpoel (aws cognito-idp initiate-auth...) is dat die Identiteitsverskaffer-verifikasieverskaffer moet aandui dat die rol gekies moet word uit die token.

Die rolle waarop 'n gebruiker toegang het, is binne die IdToken, en 'n gebruiker kan kies watter rol hy graag legitimasie vir wil hê met die --custom-role-arn vanaf aws cognito-identity get-credentials-for-identity. Maar, as die verstek opsie die een is wat gekonfigureer is (gebruik verstek rol), en jy probeer toegang verkry tot 'n rol vanaf die IdToken, sal jy 'n fout kry (daarom is die vorige konfigurasie nodig):

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

Let daarop dat die rol wat aan 'n Gebruikerspoelgroep toegewys is, toeganklik moet wees deur die Identiteitsverskaffer wat die Gebruikerspoel vertrou (aangesien die IAM-rol sessiekredensiale daarvan verkry gaan word).

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

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated