diff --git a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md index 0e80124e0..d516d5cc1 100644 --- a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md +++ b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md @@ -1,96 +1,96 @@ -# Az - Tokens & Public Applications +# Az - Jetons & Applications Publiques {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Informations de base -Entra ID est la plateforme de gestion des identités et des accès (IAM) basée sur le cloud de Microsoft, servant de système d'authentification et d'autorisation fondamental pour des services comme Microsoft 365 et Azure Resource Manager. Azure AD implémente le cadre d'autorisation OAuth 2.0 et le protocole d'authentification OpenID Connect (OIDC) pour gérer l'accès aux ressources. +Entra ID est la plateforme cloud d'identity and access management (IAM) de Microsoft, servant de système fondamental d'authentification et d'autorisation pour des services comme Microsoft 365 et Azure Resource Manager. Azure AD implémente le framework OAuth 2.0 et le protocole d'authentification OpenID Connect (OIDC) pour gérer l'accès aux ressources. ### OAuth -**Participants clés dans OAuth 2.0 :** +**Acteurs clés dans OAuth 2.0 :** -1. **Serveur de ressources (RS) :** Protège les ressources appartenant au propriétaire des ressources. -2. **Propriétaire des ressources (RO) :** Typiquement un utilisateur final qui possède les ressources protégées. -3. **Application cliente (CA) :** Une application cherchant à accéder aux ressources au nom du propriétaire des ressources. -4. **Serveur d'autorisation (AS) :** Délivre des jetons d'accès aux applications clientes après les avoir authentifiées et autorisées. +1. **Resource Server (RS) :** Protège les ressources appartenant au resource owner. +2. **Resource Owner (RO) :** Généralement un utilisateur final qui possède les ressources protégées. +3. **Client Application (CA) :** Une application cherchant à accéder aux ressources au nom du resource owner. +4. **Authorization Server (AS) :** Délivre des access tokens aux client applications après les avoir authentifiés et autorisés. -**Scopes et consentement :** +**Scopes et Consentement :** -- **Scopes :** Permissions granulaires définies sur le serveur de ressources qui spécifient les niveaux d'accès. -- **Consentement :** Le processus par lequel un propriétaire de ressources accorde à une application cliente la permission d'accéder aux ressources avec des scopes spécifiques. +- **Scopes :** Permissions granulaires définies sur le resource server spécifiant les niveaux d'accès. +- **Consentement :** Le processus par lequel un resource owner accorde à une client application la permission d'accéder aux ressources avec des scopes spécifiques. **Intégration Microsoft 365 :** -- Microsoft 365 utilise Azure AD pour l'IAM et est composé de plusieurs applications OAuth "de première partie". +- Microsoft 365 utilise Azure AD pour l'IAM et est composé de multiples applications OAuth "first-party". - Ces applications sont profondément intégrées et ont souvent des relations de service interdépendantes. -- Pour simplifier l'expérience utilisateur et maintenir la fonctionnalité, Microsoft accorde un "consentement implicite" ou un "pré-consentement" à ces applications de première partie. +- Pour simplifier l'expérience utilisateur et maintenir la fonctionnalité, Microsoft accorde un "implied consent" ou un "pre-consent" à ces applications first-party. - **Consentement implicite :** Certaines applications se voient automatiquement **accorder l'accès à des scopes spécifiques sans approbation explicite de l'utilisateur ou de l'administrateur**. -- Ces scopes pré-consentis sont généralement cachés à la fois des utilisateurs et des administrateurs, les rendant moins visibles dans les interfaces de gestion standard. +- Ces scopes pré-consentis sont typiquement cachés aux utilisateurs et aux administrateurs, les rendant moins visibles dans les interfaces de gestion standard. -**Types d'applications clientes :** +**Types de Client Application :** -1. **Clients confidentiels :** -- Possèdent leurs propres identifiants (par exemple, mots de passe ou certificats). -- Peuvent **s'authentifier de manière sécurisée** auprès du serveur d'autorisation. -2. **Clients publics :** +1. **Confidential Clients :** +- Possèdent leurs propres identifiants (par ex. mots de passe ou certificats). +- Peuvent **s'authentifier de manière sécurisée** auprès de l'authorization server. +2. **Public Clients :** - N'ont pas d'identifiants uniques. -- Ne peuvent pas s'authentifier de manière sécurisée auprès du serveur d'autorisation. -- **Implication de sécurité :** Un attaquant peut usurper une application cliente publique lors de la demande de jetons, car il n'existe aucun mécanisme pour que le serveur d'autorisation vérifie la légitimité de l'application. +- Ne peuvent pas s'authentifier de façon sécurisée auprès de l'authorization server. +- **Implication de sécurité :** Un attaquant peut usurper une public client application lors de la demande de tokens, puisqu'il n'existe pas de mécanisme permettant à l'authorization server de vérifier la légitimité de l'application. ## Authentication Tokens -Il existe **trois types de jetons** utilisés dans OIDC : +Il existe **trois types de tokens** utilisés en OIDC : -- [**Jetons d'accès**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Le client présente ce jeton au serveur de ressources pour **accéder aux ressources**. Il ne peut être utilisé que pour une combinaison spécifique d'utilisateur, de client et de ressource et **ne peut pas être révoqué** jusqu'à son expiration - c'est-à-dire 1 heure par défaut. -- **Jetons d'identité** : Le client reçoit ce **jeton du serveur d'autorisation**. Il contient des informations de base sur l'utilisateur. Il est **lié à une combinaison spécifique d'utilisateur et de client**. -- **Jetons de rafraîchissement** : Fournis au client avec le jeton d'accès. Utilisés pour **obtenir de nouveaux jetons d'accès et d'identité**. Il est lié à une combinaison spécifique d'utilisateur et de client et peut être révoqué. L'expiration par défaut est de **90 jours** pour les jetons de rafraîchissement inactifs et **pas d'expiration pour les jetons actifs** (il est possible d'obtenir de nouveaux jetons de rafraîchissement à partir d'un jeton de rafraîchissement). -- Un jeton de rafraîchissement doit être lié à un **`aud`**, à certains **scopes**, et à un **tenant** et il ne devrait pouvoir générer des jetons d'accès que pour cet aud, ces scopes (et pas plus) et ce tenant. Cependant, ce n'est pas le cas avec les **jetons d'applications FOCI**. -- Un jeton de rafraîchissement est chiffré et seul Microsoft peut le déchiffrer. -- Obtenir un nouveau jeton de rafraîchissement ne révoque pas le jeton de rafraîchissement précédent. +- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Le client présente ce token au resource server pour **accéder aux ressources**. Il ne peut être utilisé que pour une combinaison spécifique d'utilisateur, de client et de ressource et **ne peut pas être révoqué** avant son expiration — soit 1 heure par défaut. +- **ID Tokens** : Le client reçoit ce **token de l'authorization server**. Il contient des informations de base sur l'utilisateur. Il est **lié à une combinaison spécifique d'utilisateur et de client**. +- **Refresh Tokens** : Fourni au client avec l'access token. Utilisé pour **obtenir de nouveaux access et ID tokens**. Il est lié à une combinaison spécifique d'utilisateur et de client et peut être révoqué. L'expiration par défaut est de **90 jours** pour les refresh tokens inactifs et **pas d'expiration pour les tokens actifs** (il est possible d'obtenir de nouveaux refresh tokens à partir d'un refresh token). +- Un refresh token devrait être lié à un **`aud`**, à certains **scopes**, et à un **tenant** et il ne devrait être capable de générer que des access tokens pour cet aud, ces scopes (et pas plus) et ce tenant. Cependant, ce n'est pas le cas avec les **FOCI applications tokens**. +- Un refresh token est chiffré et seul Microsoft peut le déchiffrer. +- Obtenir un nouveau refresh token ne révoque pas le refresh token précédent. > [!WARNING] -> Les informations pour **l'accès conditionnel** sont **stockées** à l'intérieur du **JWT**. Donc, si vous demandez le **jeton depuis une adresse IP autorisée**, cette **IP** sera **stockée** dans le jeton et vous pourrez ensuite utiliser ce jeton depuis une **adresse IP non autorisée pour accéder aux ressources**. +> Les informations pour le **conditional access** sont **stockées** à l'intérieur du **JWT**. Donc, si vous demandez le **token depuis une adresse IP autorisée**, cette **IP** sera **enregistrée** dans le token et ensuite vous pourrez utiliser ce token depuis une **IP non autorisée pour accéder aux ressources**. ### Access Tokens "aud" -Le champ indiqué dans le champ "aud" est le **serveur de ressources** (l'application) utilisé pour effectuer la connexion. +Le champ indiqué dans la propriété "aud" est le **resource server** (l'application) utilisé pour effectuer la connexion. -La commande `az account get-access-token --resource-type [...]` prend en charge les types suivants et chacun d'eux ajoutera un "aud" spécifique dans le jeton d'accès résultant : +La commande `az account get-access-token --resource-type [...]` prend en charge les types suivants et chacun d'eux ajoutera un "aud" spécifique dans l'access token résultant : > [!CAUTION] -> Notez que les éléments suivants ne sont que les API prises en charge par `az account get-access-token`, mais il y en a d'autres. +> Notez que ce qui suit représente seulement les API supportées par `az account get-access-token` mais il en existe d'autres.
-exemples d'aud +Exemples d'aud -- **aad-graph (Azure Active Directory Graph API)** : Utilisé pour accéder à l'API Azure AD Graph héritée (dépréciée), qui permet aux applications de lire et d'écrire des données d'annuaire dans Azure Active Directory (Azure AD). +- **aad-graph (Azure Active Directory Graph API)** : Utilisé pour accéder à l'Azure AD Graph API legacy (dépréciée), qui permet aux applications de lire et écrire des données d'annuaire dans Azure Active Directory (Azure AD). - `https://graph.windows.net/` -* **arm (Azure Resource Manager)** : Utilisé pour gérer les ressources Azure via l'API Azure Resource Manager. Cela inclut des opérations telles que la création, la mise à jour et la suppression de ressources telles que des machines virtuelles, des comptes de stockage, et plus encore. -- `https://management.core.windows.net/ ou https://management.azure.com/` +* **arm (Azure Resource Manager)** : Utilisé pour gérer les ressources Azure via l'API Azure Resource Manager. Cela inclut des opérations comme la création, la mise à jour et la suppression de ressources telles que des machines virtuelles, des comptes de stockage, et plus. +- `https://management.core.windows.net/ or https://management.azure.com/` -- **batch (Azure Batch Services)** : Utilisé pour accéder à Azure Batch, un service qui permet d'exécuter efficacement des applications de calcul parallèle à grande échelle et de haute performance dans le cloud. +- **batch (Azure Batch Services)** : Utilisé pour accéder à Azure Batch, un service qui permet d'exécuter efficacement des applications de calcul parallèle à grande échelle et à haute performance dans le cloud. - `https://batch.core.windows.net/` -* **data-lake (Azure Data Lake Storage)** : Utilisé pour interagir avec Azure Data Lake Storage Gen1, qui est un service de stockage et d'analyse de données évolutif. +* **data-lake (Azure Data Lake Storage)** : Utilisé pour interagir avec Azure Data Lake Storage Gen1, qui est un service évolutif de stockage de données et d'analytique. - `https://datalake.azure.net/` -- **media (Azure Media Services)** : Utilisé pour accéder à Azure Media Services, qui fournissent des services de traitement et de livraison de médias basés sur le cloud pour le contenu vidéo et audio. +- **media (Azure Media Services)** : Utilisé pour accéder à Azure Media Services, qui fournit des services cloud de traitement et de distribution média pour le contenu vidéo et audio. - `https://rest.media.azure.net` -* **ms-graph (Microsoft Graph API)** : Utilisé pour accéder à l'API Microsoft Graph, le point de terminaison unifié pour les données des services Microsoft 365. Il vous permet d'accéder aux données et aux informations des services tels qu'Azure AD, Office 365, Enterprise Mobility et les services de sécurité. +* **ms-graph (Microsoft Graph API)** : Utilisé pour accéder à Microsoft Graph API, le point d'entrée unifié pour les données des services Microsoft 365. Il permet d'accéder aux données et insights de services comme Azure AD, Office 365, Enterprise Mobility et les services de sécurité. - `https://graph.microsoft.com` -- **oss-rdbms (Azure Open Source Relational Databases)** : Utilisé pour accéder aux services de base de données Azure pour des moteurs de bases de données relationnelles open-source comme MySQL, PostgreSQL et MariaDB. +- **oss-rdbms (Azure Open Source Relational Databases)** : Utilisé pour accéder aux services de base de données Azure pour des moteurs relationnels open-source comme MySQL, PostgreSQL et MariaDB. - `https://ossrdbms-aad.database.windows.net`
### Access Tokens Scopes "scp" -Le scope d'un jeton d'accès est stocké à l'intérieur de la clé scp dans le JWT du jeton d'accès. Ces scopes définissent à quoi le jeton d'accès a accès. +Le scope d'un access token est stocké dans la clé scp à l'intérieur du JWT de l'access token. Ces scopes définissent ce à quoi l'access token a accès. Si un JWT est autorisé à contacter une API spécifique mais **n'a pas le scope** pour effectuer l'action demandée, il **ne pourra pas effectuer l'action** avec ce JWT. @@ -106,7 +106,7 @@ from typing import Any, Dict, List # LOGIN VIA CODE FLOW AUTHENTICATION azure_cli_client = msal.PublicClientApplication( -"04b07795-8ddb-461a-bbee-02f9e1bf7b46" # ID for Azure CLI client +"00b41c95-dab0-4487-9791-b9d2c32c80f2" # ID for Office 365 Management ) device_flow = azure_cli_client.initiate_device_flow( scopes=["https://graph.microsoft.com/.default"] @@ -144,31 +144,31 @@ scopes=["https://graph.microsoft.com/.default"], ) pprint(new_azure_cli_bearer_tokens_for_graph_api) ``` -### Autres champs de jeton d'accès +### Autres champs d'access token -- **appid** : ID de l'application utilisé pour générer le jeton -- **appidacr** : La référence de classe de contexte d'authentification de l'application indique comment le client a été authentifié, pour un client public la valeur est 0, et si un secret client est utilisé la valeur est 1 -- **acr** : La revendication de référence de classe de contexte d'authentification est "0" lorsque l'authentification de l'utilisateur final ne répond pas aux exigences de l'ISO/IEC 29115. -- **amr** : La méthode d'authentification indique comment le jeton a été authentifié. Une valeur de “pwd” indique qu'un mot de passe a été utilisé. -- **groups** : Indique les groupes dont le principal est membre. -- **iss** : Les problèmes identifient le service de jeton de sécurité (STS) qui a généré le jeton. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (l'uuid est l'ID du locataire) -- **oid** : L'ID de l'objet du principal -- **tid** : ID du locataire -- **iat, nbf, exp** : Émis à (quand il a été émis), Pas avant (ne peut pas être utilisé avant ce moment, généralement la même valeur que iat), Temps d'expiration. +- **appid**: ID de l'application utilisée pour générer le token +- **appidacr**: The Application Authentication Context Class Reference indique comment le client a été authentifié ; pour un public client la valeur est 0, et si un client secret est utilisé la valeur est 1 +- **acr**: The Authentication Context Class Reference claim est "0" lorsque l'authentification de l'utilisateur final n'a pas satisfait aux exigences de ISO/IEC 29115. +- **amr**: The Authentication method indique comment le token a été authentifié. Une valeur “pwd” indique qu'un mot de passe a été utilisé. +- **groups**: Indique les groupes dont le principal est membre. +- **iss**: L'iss identifie le security token service (STS) qui a généré le token. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (le uuid est le tenant ID) +- **oid**: L'object ID du principal +- **tid**: Tenant ID +- **iat, nbf, exp**: Issued at (moment où il a été émis), Not before (ne peut pas être utilisé avant ce moment, généralement même valeur que iat), Expiration time. -## Escalade de privilèges des jetons FOCI +## FOCI Tokens Privilege Escalation -Il a été mentionné précédemment que les jetons d'actualisation devraient être liés aux **portées** avec lesquelles ils ont été générés, à l'**application** et au **locataire** auxquels ils ont été générés. Si l'une de ces limites est franchie, il est possible d'escalader les privilèges car il sera possible de générer des jetons d'accès pour d'autres ressources et locataires auxquels l'utilisateur a accès et avec plus de portées que ce qui était initialement prévu. +Précédemment, il a été mentionné que refresh tokens devraient être liés aux **scopes** avec lesquels ils ont été générés, à l'**application** et au **tenant** pour lesquels ils ont été générés. Si l'une de ces frontières est rompue, il est possible d'escalader les privilèges car il sera possible de générer des access tokens pour d'autres ressources et tenants auxquels l'utilisateur a accès et avec plus de scopes que prévu initialement. -De plus, **cela est possible avec tous les jetons d'actualisation** dans la [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (comptes Microsoft Entra, comptes personnels Microsoft et comptes sociaux comme Facebook et Google) car comme le mentionnent les [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) : "Les jetons d'actualisation sont liés à une combinaison d'utilisateur et de client, mais **ne sont pas liés à une ressource ou à un locataire**. Un client peut utiliser un jeton d'actualisation pour acquérir des jetons d'accès **à travers n'importe quelle combinaison de ressource et de locataire** où il a la permission de le faire. Les jetons d'actualisation sont cryptés et seule la Microsoft identity platform peut les lire." +De plus, **this is possible with all refresh tokens** dans la [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) car, comme le mentionnent les [**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." -De plus, notez que les applications FOCI sont des applications publiques, donc **aucun secret n'est nécessaire** pour s'authentifier auprès du serveur. +De plus, notez que les applications FOCI sont des public applications, donc **aucun secret n'est nécessaire** pour s'authentifier auprès du serveur. -Ensuite, les clients FOCI connus rapportés dans la [**recherche originale**](https://github.com/secureworks/family-of-client-ids-research/tree/main) peuvent être [**trouvés ici**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv). +Les clients FOCI connus signalés dans la [**original research**](https://github.com/secureworks/family-of-client-ids-research/tree/main) peuvent être [**found here**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv). -### Obtenir une portée différente +### Obtenir un scope différent -En suivant l'exemple de code précédent, dans ce code, un nouveau jeton est demandé pour une portée différente : +Suite à l'exemple de code précédent, dans ce code il est demandé un nouveau token pour un scope différent : ```python # Code from https://github.com/secureworks/family-of-client-ids-research azure_cli_bearer_tokens_for_outlook_api = ( @@ -185,7 +185,7 @@ scopes=[ ) pprint(azure_cli_bearer_tokens_for_outlook_api) ``` -### Obtenir différents clients et portées +### Obtenir des clients et des scopes différents ```python # Code from https://github.com/secureworks/family-of-client-ids-research microsoft_office_client = msal.PublicClientApplication("d3590ed6-52b3-4102-aeff-aad2292ab01c") @@ -203,25 +203,26 @@ pprint(microsoft_office_bearer_tokens_for_graph_api) ``` ## Où trouver des tokens -Du point de vue d'un attaquant, il est très intéressant de savoir où il est possible de trouver des tokens d'accès et de rafraîchissement lorsque, par exemple, le PC d'une victime est compromis : +Du point de vue d'un attaquant, il est très intéressant de savoir où il est possible de trouver access and refresh tokens, par exemple si le PC d'une victime est compromis : -- À l'intérieur de **`/.Azure`** -- **`azureProfile.json`** contient des informations sur les utilisateurs connectés dans le passé -- **`clouds.config` contient** des informations sur les abonnements -- **`service_principal_entries.json`** contient les identifiants des applications (id de locataire, clients et secret). Seulement sur Linux et macOS -- **`msal_token_cache.json`** contient des tokens d'accès et des tokens de rafraîchissement. Seulement sur Linux et macOS -- **`service_principal_entries.bin`** et **`msal_token_cache.bin`** sont utilisés sur Windows et sont cryptés avec DPAPI +- Inside **`/.Azure`** +- **`azureProfile.json`** contient des informations sur les logged in users du passé +- **`clouds.config contains`** des infos sur les subscriptions +- **`service_principal_entries.json`** contient les credentials des applications (tenant id, clients et secret). Only in Linux & macOS +- **`msal_token_cache.json`** contient des access tokens et refresh tokens. Only in Linux & macOS +- **`service_principal_entries.bin`** et msal_token_cache.bin sont utilisés sous Windows et sont chiffrés avec DPAPI - **`msal_http_cache.bin`** est un cache de requêtes HTTP -- Chargez-le : `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)` -- **`AzureRmContext.json`** contient des informations sur les connexions précédentes utilisant Az PowerShell (mais pas d'identifiants) -- À l'intérieur de **`C:\Users\\AppData\Local\Microsoft\IdentityCache\*`** se trouvent plusieurs fichiers `.bin` avec des **tokens d'accès**, des tokens ID et des informations de compte cryptées avec le DPAPI des utilisateurs. -- Il est possible de trouver plus de **tokens d'accès** dans les fichiers `.tbres` à l'intérieur de **`C:\Users\\AppData\Local\Microsoft\TokenBroken\Cache\`** qui contiennent un base64 crypté avec DPAPI avec des tokens d'accès. -- Sur Linux et macOS, vous pouvez obtenir des **tokens d'accès, tokens de rafraîchissement et tokens ID** depuis Az PowerShell (si utilisé) en exécutant `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"` -- Sur Windows, cela génère uniquement des tokens ID. -- Il est possible de voir si Az PowerShell a été utilisé sur Linux et macOS en vérifiant si `$HOME/.local/share/.IdentityService/` existe (bien que les fichiers contenus soient vides et inutiles) -- Si l'utilisateur est **connecté à Azure avec le navigateur**, selon ce [**post**](https://www.infosecnoodle.com/p/obtaining-microsoft-entra-refresh?r=357m16&utm_campaign=post&utm_medium=web), il est possible de commencer le flux d'authentification avec une **redirection vers localhost**, de faire autoriser automatiquement la connexion par le navigateur, et de recevoir le token de rafraîchissement. Notez qu'il n'y a que quelques applications FOCI qui permettent la redirection vers localhost (comme az cli ou le module PowerShell), donc ces applications doivent être autorisées. +- Load it: `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)` +- **`AzureRmContext.json`** contient des informations sur des previous logins utilisant Az PowerShell (mais sans credentials) +- Inside **`C:\Users\\AppData\Local\Microsoft\IdentityCache\*`** se trouvent plusieurs fichiers `.bin` avec **access tokens**, ID tokens et des informations de compte chiffrées avec le DPAPI de l'utilisateur. +- Il est possible de trouver plus d'**access tokens** dans les fichiers `.tbres` inside **`C:\Users\\AppData\Local\Microsoft\TokenBroken\Cache\`** qui contiennent un base64 chiffré avec DPAPI contenant des access tokens. +- Sur Linux et macOS, vous pouvez obtenir **access tokens, refresh tokens et id tokens** depuis Az PowerShell (si utilisé) en exécutant `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"` +- Sous Windows ceci ne génère que des id tokens. +- Il est possible de voir si Az PowerShell a été utilisé sur Linux et macOS en vérifiant si `$HOME/.local/share/.IdentityService/` existe (même si les fichiers contenus sont vides et inutiles) +- Si l'utilisateur est connecté à Azure via le browser, selon ce [**post**](https://www.infosecnoodle.com/p/obtaining-microsoft-entra-refresh?r=357m16&utm_campaign=post&utm_medium=web) il est possible de démarrer le flux d'authentification avec un redirect to localhost, faire en sorte que le browser autorise automatiquement la connexion, et recevoir le refresh token. Notez qu'il n'y a que quelques applications FOCI qui permettent redirect to localhost (comme az cli ou le powershell module), donc ces applications doivent être autorisées. +- Une autre option expliquée dans le blog est d'utiliser l'outil [**BOF-entra-authcode-flow**](https://github.com/sudonoodle/BOF-entra-authcode-flow) qui peut utiliser n'importe quelle application car il **obtiendra le OAuth code pour ensuite récupérer un refresh token depuis le title of the final auth page** en utilisant le redirect URI `https://login.microsoftonline.com/common/oauth2/nativeclient`. -## Références +## References - [https://github.com/secureworks/family-of-client-ids-research](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](https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md)