Translated ['', 'src/pentesting-cloud/azure-security/az-basic-informatio

This commit is contained in:
Translator
2026-03-31 16:59:00 +00:00
parent 2acc7d6489
commit 2232b56f4d

View File

@@ -2,97 +2,170 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Βασικές Πληροφορίες
Entra ID είναι η cloud-based πλατφόρμα διαχείρισης ταυτότητας και πρόσβασης (IAM) της Microsoft, λειτουργώντας ως το θεμελιώδες σύστημα πιστοποίησης και εξουσιοδότησης για υπηρεσίες όπως το Microsoft 365 και το Azure Resource Manager. Το Azure AD υλοποιεί το πλαίσιο εξουσιοδότησης OAuth 2.0 και το πρωτόκολλο αυθεντικοποίησης OpenID Connect (OIDC) για τη διαχείριση πρόσβασης σε πόρους.
Entra ID είναι η cloud-based πλατφόρμα identity and access management (IAM) της Microsoft, που λειτουργεί ως το θεμελιώδες σύστημα authentication και authorization για υπηρεσίες όπως Microsoft 365 και Azure Resource Manager. Το Azure AD υλοποιεί το OAuth 2.0 authorization framework και το OpenID Connect (OIDC) authentication protocol για τη διαχείριση της πρόσβασης σε πόρους.
### OAuth
**Κύριοι συμμετέχοντες στο OAuth 2.0:**
**Βασικοί συμμετέχοντες στο OAuth 2.0:**
1. **Resource Server (RS):** Προστατεύει πόρους που ανήκουν στον resource owner.
2. **Resource Owner (RO):** Συνήθως ένας τελικός χρήστης που κατέχει τους προστατευμένους πόρους.
3. **Client Application (CA):** Μια εφαρμογή που ζητά πρόσβαση σε πόρους εξ ονόματος του resource owner.
4. **Authorization Server (AS):** Εκδίδει access tokens στις client εφαρμογές μετά την πιστοποίηση και εξουσιοδότησή τους.
1. Resource Server (RS): Προστατεύει πόρους που ανήκουν στον κάτοχο των πόρων.
2. Resource Owner (RO): Συνήθως ένας τελικός χρήστης που κατέχει τους προστατευμένους πόρους.
3. Client Application (CA): Μια εφαρμογή που ζητά πρόσβαση σε πόρους εκ μέρους του κατόχου των πόρων.
4. Authorization Server (AS): Εκδίδει access tokens σε client applications μετά την authentication και authorization τους.
**Scopes και Συναίνεση:**
**Scopes και Consent:**
- **Scopes:** Λεπτομερείς άδειες που ορίζονται στον resource server και καθορίζουν επίπεδα πρόσβασης.
- **Consent:** Η διαδικασία με την οποία ο resource owner χορηγεί στην client εφαρμογή άδεια να προσπελάσει πόρους με συγκεκριμένα scopes.
- Scopes: Λεπτομερείς άδειες που ορίζονται στον resource server και καθορίζουν τα επίπεδα πρόσβασης.
- Consent: Η διαδικασία με την οποία ο κάτοχος πόρων χορηγεί σε μια client application την άδεια να προσπελάσει πόρους με συγκεκριμένα scopes.
**Ενσωμάτωση Microsoft 365:**
- Το Microsoft 365 χρησιμοποιεί το Azure AD για IAM και αποτελείται από πολλαπλές "first-party" OAuth εφαρμογές.
- Αυτές οι εφαρμογές είναι βαθιά ενσωματωμένες και συχνά έχουν αλληλεξαρτώμενες σχέσεις υπηρεσιών.
- Για να απλοποιηθεί η εμπειρία χρήστη και να διατηρηθεί η λειτουργικότητα, η Microsoft χορηγεί "implied consent" ή "pre-consent" σε αυτές τις first-party εφαρμογές.
- **Implied Consent:** Ορισμένες εφαρμογές λαμβάνουν αυτόματα **πρόσβαση σε συγκεκριμένα scopes χωρίς ρητή έγκριση από χρήστη ή διαχειριστή**.
- Αυτά τα προ-συνελλημένα scopes συνήθως κρύβονται τόσο από χρήστες όσο και από διαχειριστές, καθιστώντας τα λιγότερο ορατά στις τυπικές διεπαφές διαχείρισης.
- Αυτές οι εφαρμογές είναι στενά ενσωματωμένες και συχνά έχουν διαλειτουργικές σχέσεις μεταξύ υπηρεσιών.
- Για να απλοποιήσει την εμπειρία χρήστη και να διατηρήσει τη λειτουργικότητα, η Microsoft παρέχει "implied consent" ή "pre-consent" σε αυτές τις first-party εφαρμογές.
- **Implied Consent:** Ορισμένες εφαρμογές λαμβάνουν αυτόματα **πρόσβαση σε συγκεκριμένα scopes χωρίς ρητή έγκριση από τον χρήστη ή τον διαχειριστή approva**l.
- Αυτά τα pre-consented scopes συνήθως κρύβονται τόσο από τους χρήστες όσο και από τους διαχειριστές, κάνοντάς τα λιγότερο ορατά στις τυπικές διεπαφές διαχείρισης.
**Τύποι Client Εφαρμογών:**
**Τύποι Client Application:**
1. **Confidential Clients:**
- Διαθέτουν δικά τους credentials (π.χ. passwords ή πιστοποιητικά).
- Μπορούν **να αυθεντικοποιηθούν με ασφάλεια** στον authorization server.
- Διαθέτουν δικά τους credentials (π.χ. passwords ή certificates).
- Μπορούν να αυθεντικοποιηθούν με ασφάλεια προς τον authorization server.
2. **Public Clients:**
- Δεν έχουν μοναδικά credentials.
- Δεν μπορούν να αυθεντικοποιηθούν με ασφάλεια στον authorization server.
- **Επίπτωση Ασφαλείας:** Ένας επιτιθέμενος μπορεί να μιμηθεί μια public client εφαρμογή όταν αιτείται tokens, καθώς δεν υπάρχει μηχανισμός για τον authorization server να επαληθεύσει την νομιμότητα της εφαρμογής.
- Δεν διαθέτουν μοναδικά credentials.
- Δεν μπορούν να αυθεντικοποιηθούν με ασφάλεια προς τον authorization server.
- **Security Implication:** Ένας επιτιθέμενος μπορεί να μιμηθεί μια public client application όταν ζητά tokens, καθώς δεν υπάρχει μηχανισμός από τον authorization server για να επαληθεύσει τη νομιμότητα της εφαρμογής.
### ROPC / Password Grant
Η OAuth2 Resource Owner Password Credentials (ROPC) ροή χρησιμοποιεί ένα άμεσο `POST` στο https://login.microsoftonline.com/<tenant>/oauth2/v2.0/token με `grant_type=password`, ένα `username`, `password`, ένα `client_id`, και το ζητούμενο `scope`. Στο Entra ID αυτό είναι κυρίως ενδιαφέρον για public clients επειδή ο επιτιθέμενος μπορεί να επαναχρησιμοποιήσει Microsoft first-party client IDs ή οποιονδήποτε άλλο επιτρεπόμενο public client χωρίς να χρειάζεται secret.
```bash
curl -X POST "https://login.microsoftonline.com/<tenant>/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "client_id=f05ff7c9-f75a-4acd-a3b5-f4b6a870245d" \
--data-urlencode "client_info=1" \
--data-urlencode "grant_type=password" \
--data-urlencode "username=user@corp.com" \
--data-urlencode "password=Password123!" \
--data-urlencode "scope=https://graph.microsoft.com/.default"
```
Εάν τα διαπιστευτήρια είναι έγκυρα και η ροή επιτρέπεται, το Entra μπορεί να επιστρέψει **access tokens** και μερικές φορές **refresh tokens** που είναι άμεσα χρησιμοποιήσιμα απέναντι στο Microsoft Graph ή στον στοχευόμενο πόρο.
### Κλάσεις παράκαμψης καταγραφής σύνδεσης Entra ID
Ορισμένα ιστορικά σφάλματα του Entra ID επέτρεπαν **password validation** ή ακόμα και **full token issuance** χωρίς τη δημιουργία της αναμενόμενης εγγραφής **Entra ID sign-in log**. Αυτές οι περιπτώσεις διορθώθηκαν, αλλά οι τεχνικές παραμένουν χρήσιμες για να κατανοήσουμε πώς οι αλυσίδες ελέγχου ταυτότητας μπορούν να αποτύχουν με τρόπους που αφήνουν το **downstream token use visible** ενώ η **upstream sign-in telemetry is absent**.
#### 1. Foreign-tenant endpoint for stealth password validation
Εάν το αίτημα αποσταλεί στο token endpoint ενός **different tenant GUID**, το Entra μπορεί να εξακολουθήσει να επικυρώνει εάν ο υποβληθείς κωδικός είναι σωστός για το παρεχόμενο username πριν η ροή αποτύχει επειδή ο χρήστης δεν υπάρχει σε εκείνον τον foreign tenant. Ιστορικά αυτό επέτρεπε:
- **Password spraying / credential validation** χωρίς αντίστοιχη καταγραφή σύνδεσης στο tenant θύματος
- Μία διαφορά στην απάντηση που αποκαλύπτει εάν το βήμα του κωδικού πέτυχε
- Καμία έκδοση token, αλλά λιγότερη τηλεμετρία σε σχέση με μία κανονική αποτυχία σύνδεσης
#### 2. Force a post-password failure
Εάν μια παράμετρος που χρησιμοποιείται **after** την επικύρωση των διαπιστευτηρίων είναι άκυρη, όπως ένα άκυρο `client_id`, η συνολική συναλλαγή μπορεί να αποτύχει παρόλο που ο κωδικός ήταν ήδη σωστός. Ιστορικά αυτό παρήγαγε μια **failed** προβολή σύνδεσης κρύβοντας ότι η εικασία του κωδικού είχε επιτύχει.
Το μοτίβο που πρέπει να θυμάστε είναι:
- **Έλεγχος κωδικού επιτυγχάνει**
- Ένα μεταγενέστερο βήμα επικύρωσης αποτυγχάνει
- Το log αντιπροσωπεύει την τελική κατάσταση της συναλλαγής αλλά όχι το επιτυχημένο βήμα επαλήθευσης κωδικού
#### 3. Trigger logging failure with oversized-but-valid values
Η πιο επικίνδυνη κλάση είναι όταν το αίτημα παραμένει συντακτικά έγκυρο, η αυθεντικοποίηση πετυχαίνει, **tokens are returned**, αλλά κάποιο **logged field** είναι αρκετά μεγάλο ώστε να σπάσει το logging pipeline. Αναφερόμενα παραδείγματα περιλάμβαναν:
- Επανάληψη έγκυρων scopes χιλιάδες φορές, όπως `openid openid openid ...`
- Παροχή ενός υπερβολικά μεγάλου αλλά ακόμη αποδεκτού User-Agent header
Αυτό υποδηλώνει μια γενική κλάση προβλημάτων όπου:
1. Το Entra επικυρώνει τα διαπιστευτήρια και τη σύνταξη του αιτήματος
2. Το token εκδίδεται με επιτυχία
3. Η καταγραφή προσπαθεί να αποθηκεύσει ένα ακατέργαστο πεδίο ελεγχόμενο από τον χρήστη
4. Η εγγραφή καταγραφής αποτυγχάνει λόγω μήκους ή υποθέσεων σχήματος
5. Ο χρήστης αποκτά έγκυρο token χωρίς αντίστοιχο αρχείο σύνδεσης
Example of the repeated-scope pattern:
```bash
curl -X POST "https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "client_id=f05ff7c9-f75a-4acd-a3b5-f4b6a870245d" \
--data-urlencode "client_info=1" \
--data-urlencode "grant_type=password" \
--data-urlencode "username=user@corp.com" \
--data-urlencode "password=Password123!" \
--data-urlencode "scope=$(for num in {1..10000}; do echo -n 'openid '; done)"
```
#### Σημείωση για Hunting / άμυνα
Μην υποθέτετε ότι κάθε έγκυρη χρήση token θα έχει αντίστοιχο Entra sign-in event. Κατά την διερεύνηση ύποπτης δραστηριότητας στο Graph, συσχετίστε:
- **Non-interactive sign-in logs**
- **Graph Activity Logs**
- **IP address**, **user/object ID**, **session/correlation identifiers**, και **time windows**
Μία πρακτική μέθοδος επαλήθευσης είναι να περιβάλλετε μια υποψία αόρατης επιτυχίας ανάμεσα σε δύο κανονικές αποτυχημένες συνδέσεις και στη συνέχεια να ελέγξετε εάν η αναμενόμενη ακολουθία `Failed -> Successful -> Failed` λείπει το μεσαίο συμβάν μετά από καθυστέρηση εισαγωγής. Αν υπάρχει downstream Graph activity αλλά το sign-in log λείπει, θεωρήστε το ως πιθανό **sign-in logging gap** ή **token replay**.
## Authentication Tokens
Υπάρχουν **τρεις τύποι tokens** που χρησιμοποιούνται στο OIDC:
Υπάρχουν **τρεις τύποι διακριτικών** που χρησιμοποιούνται στο OIDC:
- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Το client παρουσιάζει αυτό το token στον resource server για να **προσπελάσει πόρους**. Μπορεί να χρησιμοποιηθεί μόνο για έναν συγκεκριμένο συνδυασμό χρήστη, client και πόρου και **δεν μπορεί να ανακληθεί** μέχρι τη λήξη — δηλαδή 1 ώρα από προεπιλογή.
- **ID Tokens**: Το client λαμβάνει αυτό το **token από τον authorization server**. Περιέχει βασικές πληροφορίες για τον χρήστη. Είναι **δεμένα σε συγκεκριμένο συνδυασμό χρήστη και client**.
- **Refresh Tokens**: Παρέχονται στο client μαζί με το access token. Χρησιμοποιούνται για να **λάβετε νέα access και ID tokens**. Είναι δεμένα σε συγκεκριμένο συνδυασμό χρήστη και client και μπορούν να ανακληθούν. Η προεπιλεγμένη λήξη είναι **90 ημέρες** για ανενεργά refresh tokens και **χωρίς λήξη για ενεργά tokens** (από ένα refresh token είναι δυνατό να προκύψουν νέα refresh tokens).
- Ένα refresh token θα πρέπει να συνδέεται με ένα **`aud`**, με κάποια **scopes**, και με έναν **tenant** και θα πρέπει να μπορεί να δημιουργεί access tokens μόνο για εκείνο το aud, τα συγκεκριμένα scopes (και όχι περισσότερα) και τον tenant. Ωστόσο, αυτό δεν ισχύει για τα tokens εφαρμογών FOCI.
- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Ο client παρουσιάζει αυτό το token στον resource server για να έχει **πρόσβαση σε πόρους**. Μπορεί να χρησιμοποιηθεί μόνο για συγκεκριμένο συνδυασμό χρήστη, client και πόρου και **δεν μπορεί να ανακληθεί** μέχρι τη λήξη — δηλαδή 1 ώρα από προεπιλογή.
- **ID Tokens**: Ο client λαμβάνει αυτό το **token από τον authorization server**. Περιέχει βασικές πληροφορίες για τον χρήστη. Είναι **δεσμευμένο σε συγκεκριμένο συνδυασμό χρήστη και client**.
- **Refresh Tokens**: Παρέχονται στον client μαζί με το access token. Χρησιμεύουν για να **παραχθούν νέα access και ID tokens**. Είναι δεσμευμένα σε συγκεκριμένο συνδυασμό χρήστη και client και μπορούν να ανακληθούν. Η προεπιλεγμένη λήξη είναι **90 ημέρες** για ανενεργά refresh tokens και **χωρίς λήξη για ενεργά tokens** (από ένα refresh token είναι δυνατό να προκύψουν νέα refresh tokens).
- Ένα refresh token θα πρέπει να συνδέεται με ένα **`aud`**, με κάποια **scopes**, και με έναν **tenant** και να μπορεί να παράγει access tokens μόνο για εκείνο το aud, εκείνα τα scopes (και όχι περισσότερα) και τον tenant. Ωστόσο, αυτό δεν ισχύει για τα **FOCI applications tokens**.
- Ένα refresh token είναι κρυπτογραφημένο και μόνο η Microsoft μπορεί να το αποκρυπτογραφήσει.
- Η έκδοση ενός νέου refresh token δεν ανακαλεί το προηγούμενο refresh token.
- Η λήψη ενός νέου refresh token δεν αναιρεί το προηγούμενο refresh token.
> [!WARNING]
> Πληροφορίες για **conditional access** **αποθηκεύονται** μέσα στο **JWT**. Έτσι, αν αιτηθείτε το **token από μια επιτρεπτή διεύθυνση IP**, αυτή η **IP** θα **αποθηκευτεί** στο token και μετά μπορείτε να χρησιμοποιήσετε αυτό το token από μια **μη-επιτρεπτή IP για να προσπελάσετε τους πόρους**.
> Οι πληροφορίες για το **conditional access** είναι **αποθηκευμένες** μέσα στο **JWT**. Έτσι, αν ζητήσετε το **token από μια επιτρεπόμενη διεύθυνση IP**, αυτή η **IP** θα **αποθηκευτεί** στο token και στη συνέχεια μπορείτε να χρησιμοποιήσετε αυτό το token από μια **μη-επιτρεπόμενη IP για να έχετε πρόσβαση στους πόρους**.
### Access Tokens "aud"
Το πεδίο που υποδεικνύεται στο πεδίο "aud" είναι ο **resource server** (η εφαρμογή) που χρησιμοποιήθηκε για να γίνει το login.
Το πεδίο που υποδεικνύεται στο πεδίο "aud" είναι ο **resource server** (η εφαρμογή) που χρησιμοποιείται για την εκτέλεση του login.
Η εντολή `az account get-access-token --resource-type [...]` υποστηρίζει τους ακόλουθους τύπους και καθένας από αυτούς θα προσθέσει ένα συγκεκριμένο "aud" στο παραγόμενο access token:
> [!CAUTION]
> Σημειώστε ότι τα ακόλουθα είναι απλώς τα APIs που υποστηρίζονται από `az account get-access-token` αλλά υπάρχουν και άλλα.
> Σημειώστε ότι τα ακόλουθα είναι απλώς τα APIs που υποστηρίζονται από την `az account get-access-token` αλλά υπάρχουν και άλλοι.
<details>
<summary>παραδείγματα aud</summary>
<summary>aud examples</summary>
- **aad-graph (Azure Active Directory Graph API)**: Χρησιμοποιείται για πρόσβαση στο legacy Azure AD Graph API (deprecated), που επιτρέπει στις εφαρμογές να διαβάζουν και να γράφουν δεδομένα καταλόγου στο Azure Active Directory (Azure AD).
- **aad-graph (Azure Active Directory Graph API)**: Χρησιμοποιείται για πρόσβαση στο παλαιότερο Azure AD Graph API (deprecated), το οποίο επιτρέπει στις εφαρμογές να διαβάζουν και να γράφουν δεδομένα καταλόγου στο Azure Active Directory (Azure AD).
- `https://graph.windows.net/`
* **arm (Azure Resource Manager)**: Χρησιμοποιείται για τη διαχείριση πόρων Azure μέσω του Azure Resource Manager API. Αυτό περιλαμβάνει λειτουργίες όπως δημιουργία, ενημέρωση και διαγραφή πόρων όπως virtual machines, storage accounts, κ.λπ.
* **arm (Azure Resource Manager)**: Χρησιμοποιείται για τη διαχείριση πόρων Azure μέσω του Azure Resource Manager API. Αυτό περιλαμβάνει ενέργειες όπως δημιουργία, ενημέρωση και διαγραφή πόρων όπως virtual machines, storage accounts, κ.ά.
- `https://management.core.windows.net/ or https://management.azure.com/`
- **batch (Azure Batch Services)**: Χρησιμοποιείται για πρόσβαση στο Azure Batch, μια υπηρεσία που επιτρέπει μεγάλης κλίμακας παραλληλισμό και υψηλής απόδοσης εφαρμογές υπολογισμού στο cloud.
- **batch (Azure Batch Services)**: Χρησιμοποιείται για πρόσβαση στο Azure Batch, μια υπηρεσία που επιτρέπει εφαρμογές μεγάλου κλίμακας παράλληλης και υψηλής απόδοσης στο cloud.
- `https://batch.core.windows.net/`
* **data-lake (Azure Data Lake Storage)**: Χρησιμοποιείται για αλληλεπίδραση με το Azure Data Lake Storage Gen1, το οποίο είναι μια κλιμακώσιμη υπηρεσία αποθήκευσης δεδομένων και ανάλυσης.
* **data-lake (Azure Data Lake Storage)**: Χρησιμοποιείται για αλληλεπίδραση με το Azure Data Lake Storage Gen1, μια κλιμακούμενη υπηρεσία αποθήκευσης δεδομένων και ανάλυσης.
- `https://datalake.azure.net/`
- **media (Azure Media Services)**: Χρησιμοποιείται για πρόσβαση στο Azure Media Services, που παρέχει cloud-based υπηρεσίες επεξεργασίας και παράδοσης μέσων για βίντεο και ήχο.
- `https://rest.media.azure.net`
* **ms-graph (Microsoft Graph API)**: Χρησιμοποιείται για πρόσβαση στο Microsoft Graph API, το ενιαίο endpoint για δεδομένα υπηρεσιών Microsoft 365. Σας επιτρέπει να προσπελάσετε δεδομένα και πληροφορίες από υπηρεσίες όπως το Azure AD, Office 365, Enterprise Mobility, και Security.
* **ms-graph (Microsoft Graph API)**: Χρησιμοποιείται για πρόσβαση στο Microsoft Graph API, το ενιαίο endpoint για δεδομένα υπηρεσιών Microsoft 365. Σας επιτρέπει να έχετε πρόσβαση σε δεδομένα και πληροφορίες από υπηρεσίες όπως Azure AD, Office 365, Enterprise Mobility και Security services.
- `https://graph.microsoft.com`
- **oss-rdbms (Azure Open Source Relational Databases)**: Χρησιμοποιείται για πρόσβαση στις υπηρεσίες βάσεων δεδομένων Azure για open-source relational database engines όπως MySQL, PostgreSQL, και MariaDB.
- **oss-rdbms (Azure Open Source Relational Databases)**: Χρησιμοποιείται για πρόσβαση σε υπηρεσίες βάσεων δεδομένων Azure για open-source relational database engines όπως MySQL, PostgreSQL, και MariaDB.
- `https://ossrdbms-aad.database.windows.net`
</details>
### Access Tokens Scopes "scp"
Το scope ενός access token αποθηκεύεται μέσα στο κλειδί scp εντός του access token JWT. Αυτά τα scopes ορίζουν σε τι έχει πρόσβαση το access token.
Το scope ενός access token αποθηκεύεται μέσα στο κλειδί scp στο access token JWT. Αυτά τα scopes ορίζουν σε τι έχει πρόσβαση το access token.
Αν ένα JWT επιτρέπεται να επικοινωνήσει με ένα συγκεκριμένο API αλλά **δεν έχει το scope** για να εκτελέσει την αιτούμενη ενέργεια, **δεν θα μπορέσει να εκτελέσει την ενέργεια** με αυτό το JWT.
Εάν ένα JWT έχει δικαίωμα να επικοινωνήσει με ένα συγκεκριμένο API αλλά **δεν διαθέτει το scope** για να εκτελέσει την ζητούμενη ενέργεια, **δεν θα μπορεί να εκτελέσει** την ενέργεια με εκείνο το JWT.
### Get refresh & access token example
```python
@@ -147,29 +220,29 @@ pprint(new_azure_cli_bearer_tokens_for_graph_api)
### Άλλα πεδία του access token
- **appid**: Το Application ID που χρησιμοποιήθηκε για τη δημιουργία του token
- **appidacr**: Το Application Authentication Context Class Reference δείχνει πώς έγινε η authentication του client, για public client η τιμή είναι 0, και αν χρησιμοποιήθηκε client secret η τιμή είναι 1
- **acr**: Το Authentication Context Class Reference claim είναι "0" όταν η authentication του end-user δεν πληροί τις απαιτήσεις του ISO/IEC 29115.
- **amr**: Η μέθοδος Authentication δείχνει πώς πιστοποιήθηκε το token. Η τιμή “pwd” δείχνει ότι χρησιμοποιήθηκε password.
- **groups**: Δείχνει τις ομάδες στις οποίες το principal είναι μέλος.
- **iss**: Το iss προσδιορίζει την security token service (STS) που δημιούργησε το token. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (το uuid είναι το tenant ID)
- **appidacr**: Το Application Authentication Context Class Reference δείχνει πώς αυθεντικοποιήθηκε ο client για public client η τιμή είναι 0, και αν χρησιμοποιείται client secret η τιμή είναι 1
- **acr**: Το Authentication Context Class Reference claim είναι "0" όταν η αυθεντικοποίηση του end-user δεν πληροί τις απαιτήσεις του ISO/IEC 29115.
- **amr**: Η Authentication method υποδεικνύει με ποια μέθοδο αυθεντικοποιήθηκε το token. Η τιμή “pwd” υποδεικνύει ότι χρησιμοποιήθηκε password.
- **groups**: Υποδεικνύει τις ομάδες στις οποίες ο principal είναι μέλος.
- **iss**: Το iss ταυτοποιεί το security token service (STS) που δημιούργησε το token. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (το uuid είναι το tenant ID)
- **oid**: Το object ID του principal
- **tid**: Tenant ID
- **iat, nbf, exp**: Issued at (όταν εκδόθηκε), Not before (δεν μπορεί να χρησιμοποιηθεί πριν από αυτήν την ώρα, συνήθως ίδια τιμή με iat), Expiration time (χρόνος λήξης).
- **iat, nbf, exp**: Issued at (πότε εκδόθηκε), Not before (δεν μπορεί να χρησιμοποιηθεί πριν από αυτή την ώρα, συνήθως ίδια τιμή με το iat), Expiration time (χρόνος λήξης).
## FOCI Tokens Privilege Escalation
## Κλιμάκωση προνομίων FOCI tokens
Προηγουμένως αναφέρθηκε ότι τα refresh tokens πρέπει να είναι δεμένα με τα **scopes** με τα οποία δημιουργήθηκαν, με την **application** και τον **tenant** στους οποίους δημιουργήθηκαν. Αν οποιοδήποτε από αυτά τα όρια παραβιαστεί, είναι δυνατόν να escalate privileges καθώς θα είναι δυνατό να παραχθούν access tokens για άλλους πόρους και tenants στους οποίους ο χρήστης έχει πρόσβαση και με περισσότερα scopes από ό,τι προοριζόταν αρχικά.
Προηγουμένως αναφέρθηκε ότι τα refresh tokens πρέπει να δεσμεύονται στα **scopes** με τα οποία δημιουργήθηκαν, στην **application** και στον **tenant** για τον οποίο δημιουργήθηκαν. Αν οποιοδήποτε από αυτά τα όρια παραβιαστεί, είναι δυνατό να γίνει κλιμάκωση προνομίων, αφού θα είναι δυνατή η δημιουργία access tokens για άλλους resources και tenants στους οποίους ο χρήστης έχει πρόσβαση και με περισσότερα scopes από όσα προορίζονταν αρχικά.
Moreover, **this is possible with all refresh tokens** in the [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (Microsoft Entra accounts, Microsoft personal accounts, and social accounts like Facebook and Google) because as the [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) mention: "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."
Επιπλέον, **αυτό ισχύει για όλα τα refresh tokens** στην [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (Microsoft Entra accounts, Microsoft personal accounts, and social accounts like Facebook and Google) επειδή όπως αναφέρουν τα [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "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."
Επιπλέον, σημειώστε ότι οι FOCI applications είναι public applications, οπότε **δεν απαιτείται secret** για authentication στον server.
Επιπλέον, σημειώστε ότι οι FOCI applications είναι public applications, οπότε **δεν χρειάζεται secret** για να αυθεντικοποιηθεί στον server.
Then known FOCI clients reported in the [**original research**](https://github.com/secureworks/family-of-client-ids-research/tree/main) can be [**found here**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv).
Οι γνωστοί FOCI clients που αναφέρθηκαν στην [**original research**](https://github.com/secureworks/family-of-client-ids-research/tree/main) μπορούν να βρεθούν [**here**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv).
### Λήψη διαφορετικού scope
### Get different scope
Following with the previous example code, in this code it's requested a new token for a different scope:
Συνεχίζοντας με το προηγούμενο παράδειγμα κώδικα, σε αυτόν τον κώδικα ζητείται ένα νέο token για διαφορετικό scope:
```python
# Code from https://github.com/secureworks/family-of-client-ids-research
azure_cli_bearer_tokens_for_outlook_api = (
@@ -204,23 +277,23 @@ pprint(microsoft_office_bearer_tokens_for_graph_api)
```
## NAA / BroCI (Nested App Authentication / Broker Client Injection)
A BroCI refresh tokens είναι ένα μοτίβο brokered token exchange όπου ένα υπάρχον refresh token χρησιμοποιείται με επιπλέον broker παραμέτρους για να ζητήσει tokens ως άλλη αξιόπιστη first-party app.
A BroCI refresh tokens is a brokered token exchange pattern where an existing refresh token is used with extra broker parameters to request tokens as another trusted first-party app.
These refresh tokens must be minted in that broker context (a regular refresh token usually cannot be used as a BroCI refresh token).
### Στόχος και σκοπός
Ο στόχος του BroCI είναι να επαναχρησιμοποιήσει μια έγκυρη συνεδρία χρήστη από μια αλυσίδα εφαρμογών με broker δυνατότητα και να ζητήσει tokens για ένα άλλο trusted app/resource ζευγάρι. Συνεπώς, επιτρέπει την "ανύψωση προνομίων" από το αρχικό token.
Ο στόχος του BroCI είναι να επαναχρησιμοποιήσει μια έγκυρη user session από μια αλυσίδα εφαρμογών με broker και να ζητήσει tokens για ένα άλλο αξιόπιστο app/resource ζεύγος. Επομένως, επιτρέπει την "escalate privileges" από το αρχικό token.
Από επιθετική προοπτική, αυτό έχει σημασία επειδή:
Από επιθετική (offensive) σκοπιά, αυτό έχει σημασία γιατί:
- Μπορεί να ξεκλειδώσει προ-συγκατατεθέντα μονοπάτια first-party εφαρμογών που δεν είναι προσβάσιμα με τις τυπικές ανταλλαγές refresh.
- Μπορεί να επιστρέψει access tokens για APIs υψηλής αξίας (π.χ. Microsoft Graph) υπό ταυτότητες εφαρμογών με ευρείες delegated permissions.
- Επεκτείνει τις δυνατότητες post-authentication token pivoting πέρα από το κλασικό FOCI client switching.
- Μπορεί να ξεκλειδώσει pre-consented first-party app διαδρομές που δεν είναι προσβάσιμες με standard refresh exchanges.
- Μπορεί να επιστρέψει access tokens για high-value APIs (για παράδειγμα, Microsoft Graph) υπό app identities με ευρείες delegated permissions.
- Επεκτείνει τις ευκαιρίες post-authentication token pivoting πέρα από το κλασσικό FOCI client switching.
Αυτό που αλλάζει σε ένα NAA/BroCI refresh token δεν είναι η εμφανής μορφή του token, αλλά το **πλαίσιο έκδοσης** και τα metadata σχετικά με τον broker που η Microsoft επικυρώνει κατά τις brokered refresh operations.
Αυτό που αλλάζει σε ένα NAA/BroCI refresh token δεν είναι η εμφανής μορφή του token, αλλά το **issuance context** και τα broker-related metadata που η Microsoft επικυρώνει κατά τις brokered refresh operations.
NAA/BroCI token exchanges are **not** the same as a regular OAuth refresh exchange.
NAA/BroCI token exchanges είναι **όχι** το ίδιο με μια κανονική OAuth refresh exchange.
- A regular refresh token (for example obtained via device code flow) is usually valid for standard `grant_type=refresh_token` operations.
- A BroCI request includes additional broker context (`brk_client_id`, broker `redirect_uri`, and `origin`).
@@ -234,15 +307,15 @@ Check the web **<https://entrascopes.com/>** to find BroCI configured apps an th
### Νοητικό μοντέλο
Σκεφτείτε το BroCI ως:
Think of BroCI as:
`user session -> brokered refresh token issuance -> brokered refresh call (brk_client_id + redirect_uri + origin) -> access token for target trusted app/resource`
If any part of that broker chain does not match, the exchange fails.
### Πού να βρείτε ένα BroCI-έγκυρο refresh token
### Πού να βρείτε ένα BroCI-valid refresh token
Ένας πρακτικός τρόπος είναι η συλλογή κυκλοφορίας του browser portal:
One practical way is browser portal traffic collection:
1. Sign in to `https://entra.microsoft.com` (or Azure portal).
2. Open DevTools -> Network.
@@ -254,11 +327,11 @@ If any part of that broker chain does not match, the exchange fails.
### Συνηθισμένα σφάλματα
- `AADSTS900054`: Το context του refresh token δεν ταιριάζει με το παρεχόμενο broker tuple (`brk_client_id` / `redirect_uri` / `origin`) ή το token δεν προέρχεται από brokered portal flow.
- `AADSTS7000218`: Το επιλεγμένο client flow αναμένει ένα confidential credential (`client_secret`/assertion), συχνά εμφανιζόμενο όταν προσπαθείτε device code με έναν μη-public client.
- `AADSTS900054`: Το refresh token context δεν ταιριάζει με το παρεχόμενο broker tuple (`brk_client_id` / `redirect_uri` / `origin`) ή το token δεν προέρχεται από brokered portal flow.
- `AADSTS7000218`: Το επιλεγμένο client flow αναμένει confidential credential (`client_secret`/assertion), συχνά εμφανιζόμενο όταν προσπαθείτε device code με non-public client.
<details>
<summary>Python βοηθητικό ανανέωσης BroCI (broci_auth.py)</summary>
<summary>Python BroCI refresh helper (broci_auth.py)</summary>
```python
#!/usr/bin/env python3
"""
@@ -533,23 +606,23 @@ raise SystemExit(main())
## Πού να βρείτε tokens
Από την προοπτική ενός attacker είναι πολύ χρήσιμο να γνωρίζουμε πού είναι δυνατόν να βρούμε access και refresh tokens όταν, για παράδειγμα, ο υπολογιστής ενός θύματος έχει παραβιαστεί:
Από την οπτική ενός attackers είναι πολύ ενδιαφέρον να γνωρίζουμε πού είναι δυνατόν να βρεθούν access and refresh tokens όταν, για παράδειγμα, ο υπολογιστής ενός θύματος έχει συμβιβαστεί:
- Μέσα στο **`<HOME>/.Azure`**
- **`azureProfile.json`** περιέχει πληροφορίες για χρήστες που έχουν συνδεθεί στο παρελθόν
- **`clouds.config contains`** παρέχει πληροφορίες για συνδρομές
- **`service_principal_entries.json`** περιέχει credentials εφαρμογών (tenant id, clients και secret). Μόνο σε Linux & macOS
- **`clouds.config contains`** πληροφορίες για συνδρομές
- **`service_principal_entries.json`** περιέχει εφαρμογικά διαπιστευτήρια (tenant id, clients and secret). Μόνο σε Linux & macOS
- **`msal_token_cache.json`** περιέχει access tokens και refresh tokens. Μόνο σε Linux & macOS
- **`service_principal_entries.bin`** και msal_token_cache.bin χρησιμοποιούνται σε Windows και είναι κρυπτογραφημένα με DPAPI
- **`msal_http_cache.bin`** είναι cache των HTTP request
- Load it: `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)`
- **`AzureRmContext.json`** περιέχει πληροφορίες για προηγούμενες συνδέσεις χρησιμοποιώντας Az PowerShell (αλλά χωρίς credentials)
- Μέσα στο **`C:\Users\<username>\AppData\Local\Microsoft\IdentityCache\*`** υπάρχουν αρκετά `.bin` αρχεία με **access tokens**, ID tokens και πληροφορίες λογαριασμού κρυπτογραφημένα με το DPAPI του χρήστη.
- Είναι δυνατό να βρείτε περισσότερα **access tokens** στα αρχεία `.tbres` μέσα στο **`C:\Users\<username>\AppData\Local\Microsoft\TokenBroken\Cache\`** τα οποία περιέχουν ένα base64 κρυπτογραφημένο με DPAPI με access tokens.
- Σε Linux και macOS μπορείτε να πάρετε **access tokens, refresh tokens και id tokens** από Az PowerShell (εάν χρησιμοποιείται) εκτελώντας `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"`
- Σε Windows αυτό παράγει μόνο id tokens.
- Μπορείτε να δείτε αν χρησιμοποιήθηκε το Az PowerShell σε Linux και macOS ελέγχοντας αν υπάρχει `$HOME/.local/share/.IdentityService/` (αν και τα περιεχόμενα αρχεία είναι κενά και άχρηστα)
- Αν ο χρήστης είναι **logged inside Azure with the browser**, σύμφωνα με αυτό το [**post**](https://www.infosecnoodle.com/p/obtaining-microsoft-entra-refresh?r=357m16&utm_campaign=post&utm_medium=web) είναι δυνατό να ξεκινήσει η authentication flow με **redirect to localhost**, να κάνετε τον browser να εγκρίνει αυτόματα το login και να λάβετε το refresh token. Σημειώστε ότι υπάρχουν μόνο λίγες FOCI εφαρμογές που επιτρέπουν redirect σε localhost (όπως az cli ή το powershell module), οπότε αυτές οι εφαρμογές πρέπει να είναι επιτρεπτές.
- **`service_principal_entries.bin`** και `msal_token_cache.bin` χρησιμοποιούνται στα Windows και είναι κρυπτογραφημένα με DPAPI
- **`msal_http_cache.bin`** είναι cache αιτήσεων HTTP
- Φορτώστε το: `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)`
- **`AzureRmContext.json`** περιέχει πληροφορίες για προηγούμενες logins χρησιμοποιώντας Az PowerShell (αλλά χωρίς διαπιστευτήρια)
- Μέσα στο **`C:\Users\<username>\AppData\Local\Microsoft\IdentityCache\*`** υπάρχουν πολλά αρχεία `.bin` με **access tokens**, ID tokens και πληροφορίες λογαριασμού κρυπτογραφημένες με το DPAPI του χρήστη.
- Είναι πιθανό να βρείτε περισσότερα **access tokens** στα αρχεία `.tbres` μέσα στο **`C:\Users\<username>\AppData\Local\Microsoft\TokenBroken\Cache\`** τα οποία περιέχουν ένα base64 (κρυπτογραφημένο με DPAPI) με access tokens.
- Σε Linux και macOS μπορείτε να πάρετε **access tokens, refresh tokens and id tokens** από Az PowerShell (αν έχει χρησιμοποιηθεί) εκτελώντας `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"`
- Στα Windows αυτό δημιουργεί μόνο id tokens.
- Είναι δυνατό να δείτε αν χρησιμοποιήθηκε το Az PowerShell σε Linux και macOS ελέγχοντας αν υπάρχει `$HOME/.local/share/.IdentityService/` (αν και τα περιεχόμενα αρχεία είναι άδεια και άχρηστα)
- Αν ο χρήστης είναι **συνδεδεμένος στο Azure με τον browser**, σύμφωνα με αυτό το [**post**](https://www.infosecnoodle.com/p/obtaining-microsoft-entra-refresh?r=357m16&utm_campaign=post&utm_medium=web) είναι δυνατόν να ξεκινήσει η ροή authentication με **redirect to localhost**, να κάνετε τον browser να εγκρίνει αυτόματα το login, και να λάβετε το refresh token. Σημειώστε ότι υπάρχουν μόνο λίγες FOCI εφαρμογές που επιτρέπουν redirect to localhost (όπως az cli ή το PowerShell module), οπότε αυτές οι εφαρμογές πρέπει να είναι επιτρεπτές.
- Μια άλλη επιλογή που εξηγείται στο blog είναι να χρησιμοποιήσετε το εργαλείο [**BOF-entra-authcode-flow**](https://github.com/sudonoodle/BOF-entra-authcode-flow) το οποίο μπορεί να χρησιμοποιήσει οποιαδήποτε εφαρμογή επειδή θα **get the OAuth code to then get a refresh token from the title of the final auth** page χρησιμοποιώντας το redirect URI `https://login.microsoftonline.com/common/oauth2/nativeclient`.
## Αναφορές
@@ -558,5 +631,6 @@ raise SystemExit(main())
- [https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md](https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md)
- [https://specterops.io/blog/2025/10/15/naa-or-broci-let-me-explain/](https://specterops.io/blog/2025/10/15/naa-or-broci-let-me-explain/)
- [https://specterops.io/blog/2025/08/13/going-for-brokering-offensive-walkthrough-for-nested-app-authentication/](https://specterops.io/blog/2025/08/13/going-for-brokering-offensive-walkthrough-for-nested-app-authentication/)
- [https://trustedsec.com/blog/full-disclosure-a-third-and-fourth-azure-sign-in-log-bypass-found](https://trustedsec.com/blog/full-disclosure-a-third-and-fourth-azure-sign-in-log-bypass-found)
{{#include ../../../banners/hacktricks-training.md}}