Az - Tokeni & Javne aplikacije
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Entra ID je Microsoftova platforma za upravljanje identitetima i pristupom (IAM) zasnovana u oblaku, koja služi kao osnovni sistem autentikacije i autorizacije za servise poput Microsoft 365 i Azure Resource Manager. Azure AD implementira OAuth 2.0 autorizacioni okvir i OpenID Connect (OIDC) protokol autentikacije za upravljanje pristupom resursima.
OAuth
Ključni učesnici u OAuth 2.0:
- Resource Server (RS): Štiti resurse koje poseduje vlasnik resursa.
- Resource Owner (RO): Obično krajnji korisnik koji poseduje zaštićene resurse.
- Client Application (CA): Aplikacija koja traži pristup resursima u ime vlasnika resursa.
- Authorization Server (AS): Izdaje access tokene klijentskim aplikacijama nakon što ih autentifikuje i autorizuje.
Scopes i pristanak:
- Scopes: Granularne dozvole definisane na resource server-u koje specificiraju nivoe pristupa.
- Consent: Proces kojim vlasnik resursa daje klijentskoj aplikaciji dozvolu da pristupi resursima sa specifičnim scope-ovima.
Integracija Microsoft 365:
- Microsoft 365 koristi Azure AD za IAM i sastoji se od više “first-party” OAuth aplikacija.
- Ove aplikacije su duboko integrisane i često imaju međuzavisne odnose usluga.
- Da bi pojednostavio korisničko iskustvo i održao funkcionalnost, Microsoft dodeljuje “implied consent” ili “pre-consent” ovim first-party aplikacijama.
- Implied Consent: Određene aplikacije su automatski dodeljene pristup određenim scope-ovima bez eksplicitnog odobrenja korisnika ili administratora.
- Ovi unapred odobreni scope-ovi su obično skriveni i od korisnika i od administratora, što ih čini manje vidljivim u standardnim upravljačkim interfejsima.
Tipovi klijentskih aplikacija:
- Confidential Clients:
- Imaju sopstvene kredencijale (npr. lozinke ili sertifikate).
- Mogu se bezbedno autentifikovati kod authorization server-a.
- Public Clients:
- Nemaju jedinstvene kredencijale.
- Ne mogu se bezbedno autentifikovati kod authorization server-a.
- Bezbednosna implikacija: Napadač može da se predstavlja kao public client application prilikom zahteva za tokene, jer authorization server nema mehanizam da proveri legitimnost aplikacije.
Autentifikacioni tokeni
Postoje tri tipa tokena koji se koriste u OIDC:
- Access Tokens: Klijent prezentuje ovaj token resource server-u da bi pristupio resursima. Može se koristiti samo za specifičnu kombinaciju korisnika, klijenta i resursa i ne može biti opozvan dok ne istekne — podrazumevano 1 sat.
- ID Tokens: Klijent prima ovaj token od authorization server-a. Sadrži osnovne informacije o korisniku. Vezan je za specifičnu kombinaciju korisnika i klijenta.
- Refresh Tokens: Dodeljuju se klijentu zajedno sa access token-om. Koriste se za dobijanje novih access i ID tokena. Vezani su za specifičnu kombinaciju korisnika i klijenta i mogu se opozvati. Podrazumevano istekuju nakon 90 dana za neaktivne refresh tokene i nemaju isteka za aktivne tokene (jer je iz refresh tokena moguće dobiti nove refresh tokene).
- Refresh token bi trebao biti vezan za
aud, za neke scopes, i za tenant i trebao bi moći da generiše access tokene samo za taj aud, te scope-ove (i ništa više) i tenant. Međutim, to nije slučaj sa FOCI applications tokens. - Refresh token je enkriptovan i samo Microsoft može da ga dekriptuje.
- Dobijanje novog refresh tokena ne opoziva prethodni refresh token.
Warning
Informacije za conditional access su smeštene unutar JWT. Dakle, ako zatražite token sa dozvoljene IP adrese, ta IP će biti smeštena u token i potom možete koristiti taj token sa ne-dozvoljene IP adrese da pristupite resursima.
Access Tokens “aud”
Vrednost navedena u polju “aud” je resource server (aplikacija) koja se koristi za prijavu.
Komanda az account get-access-token --resource-type [...] podržava sledeće tipove i svaki od njih će dodati specifičan “aud” u rezultujući access token:
Caution
Imajte na umu da su sledeći API-ji samo oni podržani od strane
az account get-access-token, ali ih ima još.
aud examples
- aad-graph (Azure Active Directory Graph API): Koristi se za pristup legacy Azure AD Graph API-ju (deprecated), koji omogućava aplikacijama da čitaju i pišu podatke direktorijuma u Azure Active Directory (Azure AD).
https://graph.windows.net/
- arm (Azure Resource Manager): Koristi se za upravljanje Azure resursima preko Azure Resource Manager API-ja. To uključuje operacije poput kreiranja, ažuriranja i brisanja resursa kao što su virtuelne mašine, storage nalozi i slično.
-
https://management.core.windows.net/ or https://management.azure.com/ -
batch (Azure Batch Services): Koristi se za pristup Azure Batch-u, servisu koji omogućava efikasno izvođenje velikih paralelnih i high-performance computing aplikacija u oblaku.
-
https://batch.core.windows.net/
- data-lake (Azure Data Lake Storage): Koristi se za interakciju sa Azure Data Lake Storage Gen1, koji je skalabilan servis za skladištenje podataka i analitiku.
-
https://datalake.azure.net/ -
media (Azure Media Services): Koristi se za pristup Azure Media Services, koji obezbeđuje cloud-based servise za procesiranje i isporuku medija za video i audio sadržaje.
-
https://rest.media.azure.net
- ms-graph (Microsoft Graph API): Koristi se za pristup Microsoft Graph API-ju, jedinstvenom endpointu za podatke Microsoft 365 servisa. Omogućava pristup podacima i uvidima iz servisa kao što su Azure AD, Office 365, Enterprise Mobility i Security servisi.
-
https://graph.microsoft.com -
oss-rdbms (Azure Open Source Relational Databases): Koristi se za pristup Azure Database servisima za open-source relacione baze podataka kao što su MySQL, PostgreSQL i MariaDB.
-
https://ossrdbms-aad.database.windows.net
Access Tokens Scopes “scp”
Opseg (scope) access tokena se čuva u ključu scp unutar JWT access tokena. Ti scope-ovi definišu šta access token ima pravo da radi.
Ako je JWT ovlašćen da kontaktira određeni API ali nema scope za izvršenje tražene akcije, neće moći da izvrši tu akciju sa tim JWT-om.
Primer dobijanja refresh i access tokena
# Code example from https://github.com/secureworks/family-of-client-ids-research
import msal
import requests
import jwt
from pprint import pprint
from typing import Any, Dict, List
# LOGIN VIA CODE FLOW AUTHENTICATION
azure_cli_client = msal.PublicClientApplication(
"00b41c95-dab0-4487-9791-b9d2c32c80f2" # ID for Office 365 Management
)
device_flow = azure_cli_client.initiate_device_flow(
scopes=["https://graph.microsoft.com/.default"]
)
print(device_flow["message"])
# Perform device code flow authentication
azure_cli_bearer_tokens_for_graph_api = azure_cli_client.acquire_token_by_device_flow(
device_flow
)
pprint(azure_cli_bearer_tokens_for_graph_api)
# DECODE JWT
def decode_jwt(base64_blob: str) -> Dict[str, Any]:
"""Decodes base64 encoded JWT blob"""
return jwt.decode(
base64_blob, options={"verify_signature": False, "verify_aud": False}
)
decoded_access_token = decode_jwt(
azure_cli_bearer_tokens_for_graph_api.get("access_token")
)
pprint(decoded_access_token)
# GET NEW ACCESS TOKEN AND REFRESH TOKEN
new_azure_cli_bearer_tokens_for_graph_api = (
# Same client as original authorization
azure_cli_client.acquire_token_by_refresh_token(
azure_cli_bearer_tokens_for_graph_api.get("refresh_token"),
# Same scopes as original authorization
scopes=["https://graph.microsoft.com/.default"],
)
)
pprint(new_azure_cli_bearer_tokens_for_graph_api)
Ostala polja access token-a
- appid: ID aplikacije koji je korišćen za generisanje tokena
- appidacr: Application Authentication Context Class Reference ukazuje kako je klijent autentifikovan; za public client vrednost je 0, a ako se koristi client secret vrednost je 1
- acr: Authentication Context Class Reference claim je “0” kada autentifikacija krajnjeg korisnika nije ispunila zahteve ISO/IEC 29115.
- amr: Authentication method pokazuje kako je token autentifikovan. Vrednost “pwd” označava da je korišćena lozinka.
- groups: Ukazuje na grupe čiji je principal član.
- iss: Identifikuje security token service (STS) koji je generisao token. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (the uuid is the tenant ID)
- oid: Objektni ID principala
- tid: Tenant ID
- iat, nbf, exp: Issued at (kad je izdat), Not before (ne može se koristiti pre tog vremena, obično ista vrednost kao iat), Expiration time.
FOCI Tokens Privilege Escalation
Ranije je pomenuto da refresh tokens treba biti vezan za scopes sa kojima je generisan, za application i tenant kome je generisan. Ako je bilo koja od ovih granica prekršena, moguće je eskalirati privilegije jer će biti moguće generisati access tokens za druge resurse i tenant-e kojima korisnik ima pristup i sa više scopes nego što je prvobitno bilo predviđeno.
Štaviše, ovo je moguće sa svim refresh tokens u Microsoft identity platform (Microsoft Entra accounts, Microsoft personal accounts, and social accounts like Facebook and Google) zato što, kako docs navode: “Refresh tokens are bound to a combination of user and client, but aren’t tied to a resource or tenant. A client can use a refresh token to acquire access tokens across any combination of resource and tenant where it has permission to do so. Refresh tokens are encrypted and only the Microsoft identity platform can read them.”
Takođe, imajte na umu da su FOCI applications public applications, pa no secret is needed da bi se autentifikovalo prema serveru.
Poznati FOCI klijenti prijavljeni u original research mogu se found here.
Zahtev za drugi scope
U nastavku prethodnog primera koda, u ovom kodu se zahteva novi token za drugačiji scope:
# Code from https://github.com/secureworks/family-of-client-ids-research
azure_cli_bearer_tokens_for_outlook_api = (
# Same client as original authorization
azure_cli_client.acquire_token_by_refresh_token(
new_azure_cli_bearer_tokens_for_graph_api.get(
"refresh_token"
),
# But different scopes than original authorization
scopes=[
"https://outlook.office.com/.default"
],
)
)
pprint(azure_cli_bearer_tokens_for_outlook_api)
Dobij drugog klijenta i scope-ove
# Code from https://github.com/secureworks/family-of-client-ids-research
microsoft_office_client = msal.PublicClientApplication("d3590ed6-52b3-4102-aeff-aad2292ab01c")
microsoft_office_bearer_tokens_for_graph_api = (
# This is a different client application than we used in the previous examples
microsoft_office_client.acquire_token_by_refresh_token(
# But we can use the refresh token issued to our original client application
azure_cli_bearer_tokens_for_outlook_api.get("refresh_token"),
# And request different scopes too
scopes=["https://graph.microsoft.com/.default"],
)
)
# How is this possible?
pprint(microsoft_office_bearer_tokens_for_graph_api)
Where to find tokens
Sa stanovišta napadača, korisno je znati gde je moguće pronaći access i refresh tokens, na primer kada je PC žrtve kompromitovan:
- Unutar
<HOME>/.Azure azureProfile.jsonsadrži informacije o korisnicima koji su se ranije prijavljivaliclouds.configsadrži informacije o pretplatamaservice_principal_entries.jsonsadrži kredencijale aplikacija (tenant id, clients i secret). Samo na Linux & macOSmsal_token_cache.jsonsadrži access tokens i refresh tokens. Samo na Linux & macOSservice_principal_entries.binimsal_token_cache.binse koriste na Windows i šifrovani su sa DPAPImsal_http_cache.binje keš HTTP zahteva- Učitaj:
with open("msal_http_cache.bin", 'rb') as f: pickle.load(f) AzureRmContext.jsonsadrži informacije o prethodnim prijavama korišćenjem Az PowerShell (ali bez kredencijala)- Unutar
C:\Users\<username>\AppData\Local\Microsoft\IdentityCache\*nalazi se nekoliko.binfajlova sa access tokens, ID tokens i informacijama o nalogu šifrovanim korisnikovim DPAPI. - Moguće je pronaći još access tokens u
.tbresfajlovima unutarC:\Users\<username>\AppData\Local\Microsoft\TokenBroken\Cache\koji sadrže base64 šifrovan sa DPAPI sa access tokens. - Na Linux i macOS možete dobiti access tokens, refresh tokens and id tokens iz Az PowerShell (ako je korišćen) pokretanjem
pwsh -Command "Save-AzContext -Path /tmp/az-context.json" - Na Windows ovo generiše samo id tokens.
- Moguće je proveriti da li je Az PowerShell korišćen na Linux i macSO proverom da li postoji
$HOME/.local/share/.IdentityService/(iako su fajlovi unutar prazni i beskorisni) - Ako je korisnik ulogovan u Azure preko browsera, prema ovom postu moguće je pokrenuti autentifikacioni flow sa redirect to localhost, naterati browser da automatski odobri prijavu i dobiti refresh token. Imajte na umu da postoji samo nekoliko FOCI aplikacija koje dozvoljavaju redirect to localhost (kao što su az cli ili powershell module), tako da te aplikacije moraju biti dozvoljene.
- Druga opcija objašnjena na blogu je da se koristi alat BOF-entra-authcode-flow koji može koristiti bilo koju aplikaciju jer će get the OAuth code to then get a refresh token from the title of the final auth page koristeći redirect URI
https://login.microsoftonline.com/common/oauth2/nativeclient.
References
- https://github.com/secureworks/family-of-client-ids-research
- https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks Cloud

