
Azure RedOps est une boîte à outils de sécurité offensive pour évaluer la posture de sécurité de Microsoft Entra ID.
Un couteau suisse pour le red teaming Azure / Entra ID.
Auteur: Mr.Un1k0d3r (TrueCyber Inc) Version: 0.1 Langage: Python 3.12+
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
.azure_creds). N'importe quel flux peut enregistrer automatiquement ses jetons avec -s/--save + -n/--name.auth) — authentification directe par nom d'utilisateur / mot de passe.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.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.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.refresh) — échangez un jeton d'actualisation contre de nouveaux jetons d'accès.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).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.gather-all.spray) et pulvérisation inter-applications de jetons d'actualisation (spray-refresh).magic-app trouve les applications redirigeables publiquement avec le consentement AllPrincipals ; listes intégrées d'ID d'applications Microsoft connues/intéressantes.requirements.txt) :
PyJWTrequestsplaywrightcryptography (uniquement nécessaire pour browser-sso -aprt, le flux PRT automatique)auth-interactive, browser-sso).
Firefox est le moteur par défaut (-br/--browser) ; installez-le avec
python -m playwright install firefox.includes/web/cert.pem et includes/web/key.pem
(uniquement nécessaires pour le flux PKCE auth-app — voir Notes).```bashgit clone AzureRedOps cd AzureRedOps
python3 -m venv AzureRedOps source AzureRedOps/bin/activate # Linux / macOS
pip install -r requirements.txt
python -m playwright install firefox
Exécutez l'outil :```bash
python3 AzureRedOps.py -a <activity> [options]
Le modèle d'invocation générale est :```bash python3 AzureRedOps.py -a [authentication] [activity options] [global options]
### 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.auth-interactive effectue toujours une sauvegarde automatique et vous demandera un nom
de manière interactive si -n n'est pas fourni.-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
python3 AzureRedOps.py -a list-users -l victim1 -j users.json
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