
Azure RedOps ist ein Toolkit für offensive Sicherheit zur Bewertung der Sicherheitslage von Microsoft Entra ID.
Ein Schweizer Taschenmesser für Azure / Entra ID Red Teaming.
Autor: Mr.Un1k0d3r (TrueCyber Inc) Version: 0.1 Sprache: Python 3.12+
AzureRedOps ist ein offensives Security-Toolkit zur Bewertung der Sicherheitslage von Microsoft Entra ID- und Azure-Mandanten. Es fasst die gängigsten Red-Team-Workflows — Authentifizierung, Token-Verwaltung, Verzeichnisenummerierung, Privilegienprüfung, Password Spraying und Post-Exploitation-Aktionen gegen Microsoft Graph — hinter einer konsistenten, durch --activity gesteuerten CLI zusammen.
Jeder Vorgang wird mit -a/--activity ausgewählt. Während der Authentifizierung erhaltene Token können lokal (.azure_creds) zwischengespeichert und mit -l/--load-access-token namentlich wiederverwendet werden, sodass Sie selten rohe JWTs einfügen müssen.
Erfahren Sie mehr über das Tool auf dem CYPFER-Blog.
.azure_creds). Jeder Flow kann seine Token automatisch mit -s/--save + -n/--name persistieren.auth) — direkte Benutzername/Passwort-Authentifizierung.phish-start / phish-capture) — Missbrauch des OAuth-Geräteautorisierungs-Grants, um Token zu erfassen, die ausgegeben werden, wenn ein Ziel Ihren Benutzercode auf microsoft.com/devicelogin eingibt. Standardmäßig automatische Erfassung.auth-app) — vollständiger Authorization-Code + PKCE-Flow gegen eine benutzerdefinierte Anwendungsregistrierung, bereitgestellt durch einen eingebauten lokalen HTTPS-Listener, der die Weiterleitung empfängt.auth-interactive) — Steuerung eines echten Browsers (Playwright; standardmäßig Firefox, mit -br umschaltbar) (bewältigt MFA / Conditional Access / SSO), dann Ernte aller Token aus der aufgezeichneten Session-HAR.requirements.txt):
PyJWTrequestsplaywrightcryptography (nur benötigt für browser-sso -aprt, den Auto-PRT-Flow)auth-interactive, browser-sso). Firefox ist die Standard-Engine (-br/--browser); installieren Sie es mit python -m playwright install firefox.includes/web/cert.pem und includes/web/key.pem (nur benötigt für den auth-app PKCE-Flow — siehe ).git clone AzureRedOps cd AzureRedOps
python3 -m venv AzureRedOps source AzureRedOps/bin/activate # Linux / macOS
pip install -r requirements.txt
python -m playwright install firefox
Tool ausführen:```bash
python3 AzureRedOps.py -a <activity> [options]
Das allgemeine Aufrufmuster lautet:```bash python3 AzureRedOps.py -a [authentication] [activity options] [global options]
### Bereitstellen eines Tokens
Aktivitäten, die Microsoft Graph aufrufen, benötigen ein Zugriffstoken. Sie können es auf zwei Arten bereitstellen:
| Methode | Flag | Beispiel |
|--------|------|---------|
| Ein rohes Token übergeben | `-ac, --access-token` | `-ac eyJ0eXAi...` |
| Ein zwischengespeichertes Token nach Namen laden | `-l, --load-access-token` | `-l mytoken` |
Wenn `-l` verwendet wird, werden das passende `access_token` (und, falls relevant, `refresh_token` und `tenant`) aus dem `.azure_creds`-Speicher gelesen.
### Speichern von Token in einer Datei (`-s` / `-n`)
Jede Aktivität, die Token abruft (`auth`, `auth-app`, `auth-interactive`, `phish-start`/`phish-capture`, `refresh`), kann sie **automatisch** im lokalen Anmeldeinformationsspeicher (`.azure_creds`) speichern, indem `-s/--save` zusammen mit `-n/--name` angegeben wird:```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 aktiviert die automatische Speicherung; es erfordert -n/--name — das Tool beendet sich mit einem Fehler, wenn -n fehlt.-n/--name ist der Schlüssel, unter dem das Token gespeichert wird. Sie können es später mit -l victim1 wiederverwenden, anstatt das rohe JWT einzufügen, es mit -a view -n victim1 anzeigen oder mit -a delete -n victim1 löschen.auth-interactive-Aktivität speichert immer automatisch und fordert Sie interaktiv zur Eingabe eines Namens auf, wenn -n nicht angegeben ist.-j)Die meisten Aufzählungsaktivitäten (list-users, list-applications, list-principals, gather-all, raw-url) akzeptieren -j/--json <dateiname>, um die rohe API-Antwort in eine JSON-Datei zu schreiben, anstatt (oder zusätzlich zu) der Anzeige:```bash
python3 AzureRedOps.py -a list-users -l victim1 -j users.json
For `gather-all`, the supplied filename is used as a suffix and one file is written
per Graph endpoint (e.g. `users-<name>`, `groups-<name>`, ...).
> Tip: `-j` controls structured JSON export, while `-re/--redirect-to-file` mirrors
> the formatted console output to `output.txt`. The two are independent.
### Tenant identifiers
- `-t, --tenant` expects a **domain name** (e.g. `contoso.com`) and is used by the `id` activity.
- `-tid, --tenant-id` expects a **tenant GUID** or `common`, used by the authentication activities.
---
## Command-Line Options
| Short | Long | Default | Description |
|-------|------|---------|-------------|
| `-a` | `--activity` | `id` | **(erforderlich)** Auszuführende Aktivität (siehe [Aktivitäten](#activities)). |
| `-ac` | `--access-token` | | Azure-Zugriffstoken. |
| `-n` | `--name` | | Name, der zum Speichern/Laden eines Tokens verwendet wird, oder Anzeigename für `register-app`/`new-group`/`invite`. |
| `-t` | `--tenant` | | Azure-Mandanten-**Domänen**name (verwendet von `id`). |
| `-c` | `--devicecode` | | Gerätecode (verwendet von `phish-capture`). |
| `-tid` | `--tenant-id` | | Azure-Mandanten-**ID** (GUID) oder `common`. |
| `-app` | `--appid` | `d3590ed6-52b3-4102-aeff-aad2292ab01c` | Anwendungs- (Client-) ID. |
| `-e` | `--endpoint` | `microsoftonline.com` | Ziel-Login-Endpunkt-Domäne. |
| `-r` | `--refresh-token` | | Authentifizierungs-Refresh-Token. |
| `-as` | `--auto-start` | `True` | Automatisches Starten der Gerätecode-Erfassung nach `phish-start`. |
| `-l` | `--load-access-token` | | Ein gecachtes Token nach Namen aus `.azure_creds` laden. |
| `-j` | `--json` | | Aktivitätsausgabe in die angegebene JSON-Datei speichern. |
| `-fl` | `--filter` | | Nur Attribute ausgeben, deren Schlüssel mit einem dieser (kommagetrennt) übereinstimmt. |
| `-u` | `--username` | | Benutzerprinzipalname (E-Mail). |
| `-p` | `--password` | | Benutzerkennwort. |
| `-s` | `--save` | `False` | Automatisches Speichern erhaltener Token in `.azure_creds` (**erfordert `-n`**). |
| `-cp` | `--check-privileges` | `False` | Nach erfolgreichem Spray-Login prüfen, ob Benutzer/Apps aufgelistet werden können. |
| `-uid` | `--uid` | | Azure-Benutzerobjekt-ID (verwendet von `add-group`). |
| `-headers` | `--headers` | | Zusätzliche HTTP-Header als JSON, z.B. `{"X-Foo": "bar"}`. |
| `-gid` | `--gid` | `62e90394-69f5-4237-91f9-056ad24d70a7` | Verzeichnisrolle / Gruppen-ID (Standard = **Globaler Administrator**). |
| `-i` | `--id` | `False` | Für `interest`: nur die Anwendungs-IDs ausgeben. |
| `-ty` | `--type` | | Für `interest`: auf eine bestimmte Kategorie filtern. |
| `-fp` | `--filepath` | | Hochzuladende Datei (`push-file`) oder benutzerdefinierte App-Liste für Spraying. |
| `-v` | `--version` | `v2.0` | Authentifizierungs-API-Version: `v0` oder `v2.0`. |
| `-ua` | `--user-agent` | *(Chrome UA-String)* | HTTP `User-Agent` überschreiben. |
| `-au` | `--audience` | `https://graph.microsoft.com` | Token-Zielgruppe/Ressource. |
| `-sc` | `--scope` | `openid offline_access` | OAuth2-Bereich. Verwenden Sie `https://graph.microsoft.com/.default` für Graph, `openid` für Spraying. |
| `-url` | `--url` | | Ziel-URL für `raw-url`/`invite`; kommagetrennte Liste von URLs für `auth-interactive`. |
| `-beta` | `--beta` | `False` | Den **Beta**-Endpunkt von Microsoft Graph für `list-users`/`list-applications` verwenden. |
| `-exp` | `--expand` | `False` | Verschachtelte Listen/Dicts in der Ausgabe in ein menschenlesbares Format erweitern. |
| `-k` | `--keep` | `False` | Die Datei `session.har` nach `auth-interactive` / `browser-sso` behalten. |
| `-cs` | `--client-secret` | | Vertrauliches Client-Geheimnis, das vom `obo` On-Behalf-Of-Grant verwendet wird. |
| `-prt` | `--prt-cookie` | | PRT-Cookie-Wert (`x-ms-RefreshTokenCredential`) zum Initialisieren des Browser-SSO für `browser-sso`. |
| `-br` | `--browser` | `firefox` | Playwright-Browser-Engine für die Browser-Flows (`auth-interactive`, `browser-sso`). Einer von `firefox`, `chromium`, `webkit`. |
| `-aprt` | `--auto-prt` | `False` | Für `browser-sso`: Automatisches Erstellen eines PRT-Cookies aus dem Refresh-Token (Geräteregistrierung → PRT → `x-ms-RefreshTokenCredential`), sodass der Browser **bereits authentifiziert** geöffnet wird. Erfordert `cryptography` und ein FOCI/Broker-Refresh-Token. |
| `-d` | `--debug` | `False` | Debug-Logging aktivieren. |
| `-dd` | `--verbose-debug` | `False` | Ausführliches HTTP-Anfrage-/Antwort-Logging aktivieren. |
| `-re` | `--redirect-to-file` | `False` | Alle Konsolenausgaben in `output.txt` spiegeln. |
---
## Activities
Below, each activity lists its **required** and *optional* arguments.
"Token" means either `-ac` or `-l` is required.
### Token Management
| Activity | Required | Optional | Description |
|----------|----------|----------|-------------|
| `save` | `-ac`, `-n` | `-tid`, `-r` | Ein Zugriffs- (und optionales Refresh-) Token in `.azure_creds` speichern. |
| `list-token` | — | — | Die Namen aller gespeicherten Token auflisten. |
| `view` | `-n` | — | Die JWT-Ansprüche eines gespeicherten Tokens decodieren und anzeigen. |
| `delete` | `-n` | — | Ein gespeichertes Token aus dem Speicher entfernen. |```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
python3 AzureRedOps.py -a id -t contoso.com
python3 AzureRedOps.py -a phish-start -tid common -app d3590ed6-52b3-4102-aeff-aad2292ab01c
python3 AzureRedOps.py -a phish-capture -c -tid common
python3 AzureRedOps.py -a auth -u [email protected] -p 'P@ssw0rd!' -tid
python3 AzureRedOps.py -a auth-interactive -url https://portal.azure.com -s -n harvested
python3 AzureRedOps.py -a refresh -l mytoken -app d3590ed6-52b3-4102-aeff-aad2292ab01c
python3 AzureRedOps.py -a obo -l mytoken -tid -app -cs -au https://graph.microsoft.com
python3 AzureRedOps.py -a browser-sso -l mytoken -url outlook -prt
#### So funktioniert der Authentifizierungsfluss
AzureRedOps implementiert mehrere verschiedene Möglichkeiten, Tokens zu erhalten. Wählen Sie diejenige, die zu Ihrem Einsatz passt; alle beachten `-s/-n` zum automatischen Speichern des Ergebnisses.
##### Device-Code-Phishing (`phish-start` / `phish-capture`)
Der **Device Authorization Grant** von OAuth 2.0 ist für eingabeeingeschränkte Geräte konzipiert, was ihn zu einem mächtigen Phishing-Grundbaustein macht: Sie fordern einen Code im Namen einer Microsoft-Erstanbieteranwendung an, und überreden dann ein Ziel, diesen Code unter `https://microsoft.com/devicelogin` einzugeben, während es in seinem Konto angemeldet ist. Sobald dies geschieht, werden die Tokens **an Sie** ausgestellt.
- `phish-start` fordert einen Gerätecode an und gibt den **Benutzercode**, die Anmelde-URL und den rohen **Gerätecode** aus. Da `-as/--auto-start` standardmäßig auf `True` gesetzt ist, beginnt es sofort mit dem Abrufen des Tokens – in der Regel reicht es also aus, `phish-start` auszuführen und dem Ziel den Benutzercode zu geben.
- `phish-capture` ist das manuelle Gegenstück: Geben Sie ihm einen zuvor erhaltenen Gerätecode mit `-c/--devicecode` und es fragt den Token-Endpunkt ab, bis das Opfer die Anmeldung abschließt (das Tool wiederholt die Anfrage still, während die Autorisierung aussteht).
- Verwenden Sie `-app/--appid`, um einen bestimmten Erstanbieter-Client zu imitieren, und `-tid/--tenant-id`, um den Bereich auf einen Mandanten einzuschränken (standardmäßig `common`). Tipp: Setzen Sie den Bereich auf `'https://graph.microsoft.com/.default offline_access openid'`, um ein Graph-fähiges Token mit einem Refresh-Token zu erhalten.```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
auth-app)auth-app führt einen vollständigen Authorization Code flow with PKCE gegen eine
(nicht standardmäßige) Drittanbieter-Anwendungsregistrierung durch. Das Tool startet einen lokalen HTTPS-Listener
(includes/Webserver.py, unter https://localhost:2342), der als OAuth-Umleitungs-URI
dient, generiert das PKCE-Paar code_verifier/code_challenge und gibt eine
Autorisierungs-URL aus, die Sie in einem Browser öffnen können. Nach Ihrer Zustimmung leitet Azure den
Autorisierungscode zurück an den lokalen Listener, den das Tool dann gegen Token eintauscht.
Dies ist der Ablauf, den Sie verwenden, wenn Sie eine Anwendung kontrollieren (oder registriert haben) und die Zustimmung durch eine echte Browsersitzung herbeiführen möchten – nützlich für Szenarien im Stil der nicht autorisierten Zustimmung oder wenn ROPC blockiert ist.
includes/web/cert.pem und
includes/web/key.pem (siehe Notes zur Erstellung).8545b2fc-a69c-4851-9206-0f74a519fe5f.```bash
python3 AzureRedOps.py -a auth-app -tid -s -n consented##### Interaktive Browser-Authentifizierung (`auth-interactive`)
`auth-interactive` startet einen **echten Browser über Playwright** (standardmäßig Firefox; wählen Sie die Engine mit `-br/--browser`) und erlaubt dem Bediener (oder einem Ziel in einer gemeinsamen Sitzung), einen interaktiven Login durchzuführen – einschließlich MFA, Conditional Access und föderierten/SSO-Weiterleitungen, die scriptgesteuerte Abläufe nicht erfüllen können. Die gesamte Browsersitzung wird in einer HAR-Datei (`session.har`) aufgezeichnet; das Tool analysiert diese Aufzeichnung, extrahiert **jedes** Access-/Refresh-Token-Paar, das am Endpunkt `/oauth2/v2.0/token` gesehen wurde, dekodiert jedes JWT und lässt Sie auswählen, welche(s) Sie speichern möchten.
- `-url/--url` legt die Seite(n) fest, die nach dem Laden der Login-Seite angesteuert werden sollen. Es akzeptiert eine **durch Kommas getrennte Liste** von URLs (z. B. `https://portal.azure.com,https://outlook.office.com`), damit Sie in einer Sitzung Token für mehrere Ressourcen sammeln können. Standardmäßig: `https://portal.azure.com`.
- Diese Aktivität **speichert immer automatisch**: Nach der Erfassung fragt sie, welche Token-Indizes Sie behalten möchten und unter welchem Namen sie gespeichert werden sollen.
- Fügen Sie `-k/--keep` hinzu, um `session.har` für die Offline-Analyse zu erhalten (standardmäßig wird es gelöscht).```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
obo)obo implementiert den OAuth 2.0 On-Behalf-Of-Fluss (grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer).
Es nimmt ein bereits ausgestelltes Zugriffstoken als Behauptung (Assertion) und tauscht es gegen ein brandneues Token mit Gültigkeitsbereich für eine andere nachgelagerte Ressource ein – ohne den Benutzer erneut zu authentifizieren.
-ac/--access-token oder einem zwischengespeicherten Token über -l/--load-access-token bereitgestellt.-app/--appid + -cs/--client-secret identifizieren den vertraulichen Client (confidential client), der den Austausch durchführt. Entra ID erfordert, dass dieser Client die Zielgruppe (audience, aud) des Behauptungstokens ist; eine Nichtübereinstimmung führt zu AADSTS500131/AADSTS50013.-au/--audience (Standard https://graph.microsoft.com, umgewandelt in <audience>/.default) oder mit einem vollständigen Bereich (scope) über -sc/--scope festgelegt.-s/-n.```bashpython3 AzureRedOps.py -a obo -l mytoken -tid
-app -cs -au https://graph.microsoft.com -s -n obo-graph
##### Token-zu-Browser Single Sign-On (`browser-sso`)
`browser-sso` öffnet einen **echten Browser, der bereits als Benutzer authentifiziert ist** — Sie klicken nichts und landen direkt drin, z. B. in **Outlook im Web**. Dies ist der „Browser einfach öffnen und eine gültige Sitzung erhalten“-Ablauf. Der Browser erhält seine Sitzung auf eine von drei Arten, in der Reihenfolge der Präferenz:
**1. `-aprt/--auto-prt` — automatisch ein PRT-Cookie ausstellen (empfohlen).**
Das Aktualisierungstoken wird vollständig durch das Tool in ein **Primary Refresh Token (PRT)** und sein Browser-Cookie umgewandelt, dann eingespeist, sodass Entras ESTS SSO ohne manuelle Anmeldung abschließt. Die Kette (in `includes/PRT.py`, das ROADtoken / roadtx / AADInternals Protokoll) ist:
1. Das Aktualisierungstoken gegen ein **Device-Registration (DRS)** Token einlösen.
2. **Ein Gerät bei Azure AD registrieren** → Gerätezertifikat + Transportschlüssel.
3. Ein **PRT + Sitzungsschlüssel** mit dem Aktualisierungstoken anfordern, signiert durch das Gerätezertifikat.
4. Das **`x-ms-RefreshTokenCredential` Cookie ableiten** (KDFv2: SP800-108 KDF über `SHA256(ctx‖decoded-payload-bytes)` → HS256-signiertes JWT; KDFv1 → `AADSTS5000611`, falsche Bytes → `AADSTS50058`) und in einen neuen Browserkontext einspeisen.
Das Cookie wird mit `SameSite=None` eingespeist und über ein **Top-Level ESTS `/authorize` Warm-up** (den Office `landingv2` Client) verbraucht, sodass das `ESTSAUTH` Sitzungs-Cookie first-party ausgestellt wird — wonach sich die Ziel-App bereits angemeldet öffnet. Das Cookie wird mit einem frischen Nonce unmittelbar vor der Navigation abgeleitet und einmal wiederholt; falls SSO immer noch nicht abgeschlossen werden kann, untersucht das Tool `prompt=none` und gibt den genauen `AADSTS`-Grund aus (z. B. Conditional Access, das ein konformes/verwaltetes Gerät erfordert, oder MFA — beides ist mit einem frisch registrierten Gerät nicht umgehbar).
Das PRT, der Sitzungsschlüssel und das Cookie werden ausgegeben (mit einem fertig zum Einfügen `-prt "<value>"` Hinweis), sodass Sie sie später wiederverwenden können, ohne die Kette erneut ausführen zu müssen.
> **Anforderungen & OpSec für `-aprt`:**
> - Benötigt das **`cryptography`** Paket (`pip install cryptography`; es ist in `requirements.txt` enthalten).
> - Das Aktualisierungstoken muss zu einem **FOCI / Broker Client** gehören — z. B. einem, der durch **Device-Code Phishing des Microsoft Authentication Brokers** (`29d9ed98-a469-4536-ade2-f981bc1d605e`) erfasst wurde, was genau das ist, was der SharePoint/OneDrive Device-Code-Köder liefert. Der Standard-`-app` (Microsoft Office FOCI Client) funktioniert ebenfalls.
> - **Die Geräteregistrierung schreibt ein Geräteobjekt in den Mandanten** — sie ist nicht still und hinterlässt ein Artefakt (und erfordert, dass der Benutzer berechtigt ist, Geräte zu verbinden/registrieren).
**2. `-prt/--prt-cookie` — ein bereits vorhandenes PRT-Cookie einspeisen.**
Wenn Sie bereits einen `x-ms-RefreshTokenCredential`-Wert besitzen (von einem vorherigen `-aprt`-Lauf, oder von einem kompromittierten Host über `ROADtoken`/`browsercore` oder `Mimikatz`), übergeben Sie ihn direkt und überspringen Sie die Erstellungskette.
**3. Keines von beidem — Token umwandeln und manuell anmelden (Fallback).**
Ohne PRT-Cookie wird das Aktualisierungstoken gegen ein ressourcenbezogenes Zugriffs-/Aktualisierungstoken eingelöst (ausgegeben und mit `-s/-n` gespeichert), und der Browser wird am Ziel geöffnet, damit Sie die Anmeldung von Hand abschließen.
**PRT / Sitzungs-Cookie-Ernte.** Wenn die Browsersitzung endet (Auto-Close-Timeout oder Sie schließen das Fenster), liest `browser-sso` den Live-Browserkontext aus und **gibt jedes wiederverwendbare SSO-Cookie aus, das ausgestellt wurde** — das PRT-Cookie (`x-ms-RefreshTokenCredential`) und die ESTS-Sitzungs-Cookies (`ESTSAUTH`, `ESTSAUTHPERSISTENT`, ...) — jedes mit einem fertig zum Einfügen `-prt`-Hinweis, damit Sie sie beim nächsten Mal wiedergeben können. Cookies werden abgefragt, solange die Sitzung aktiv ist, sodass der Wert auch dann erfasst wird, wenn Sie das Fenster vorzeitig schließen. Die gleiche Ernte läuft am Ende von `auth-interactive`.
- `-url/--url` wählt das Ziel aus. Verwenden Sie eine freundliche Voreinstellung — `outlook`, `office`, `teams`, `sharepoint`, `onedrive`, `portal`, `graph` — oder übergeben Sie eine oder mehrere rohe `https://` URLs (kommagetrennt). Standardmäßig `outlook`.
- `-r/--refresh-token` + `-tid` (oder ein zwischengespeichertes `-l`) stellt das Aktualisierungstoken bereit. `-app/--appid` standardmäßig zum Microsoft Office FOCI Client.
- `-br/--browser` wählt die Playwright-Engine aus (standardmäßig Firefox).
- `-k/--keep` bewahrt die `session.har`-Aufzeichnung der Browsersitzung.```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
python3 AzureRedOps.py -a self -l mytoken
python3 AzureRedOps.py -a list-users -l mytoken -beta -j users.json -fl displayName,userPrincipalName
python3 AzureRedOps.py -a register-app -n EvilApp -l mytoken
python3 AzureRedOps.py -a add-group -uid -l mytoken
python3 AzureRedOps.py -a push-file -fp ./payload.docx -n payload.docx -l mytoken
python3 AzureRedOps.py -a raw-url -url "https://graph.microsoft.com/beta/users" -l mytoken
python3 AzureRedOps.py -a invite -n [email protected] -url https://example.com/invite -l mytoken
python3 AzureRedOps.py -a magic-app -l mytoken
### Password-Spraying
| Aktivität | Erforderlich | Optional | Beschreibung |
|-----------|-------------|----------|--------------|
| `spray` | `-u`, `-p`, `-tid` | `-fp`, `-cp` | Anmeldedaten gegen bekannte First-Party-App-IDs (v0 + v2.0 APIs) sprayen. |
| `spray-refresh` | `-v`, und (`-l`) **oder** (`-r` + `-tid`) | `-fp`, `-cp` | Einen Refresh-Token über viele App-IDs hinweg wiederverwenden. |
Standardmäßig verwenden beide Aktivitäten `includes/auth_apps.json` als App-Quelle; Überschreiben Sie mit `-fp`. Fügen Sie `-cp` hinzu, um zu testen, ob jeder erfolgreiche Login Benutzer/Apps aufzählen kann.```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
---
## Ausgabe & generierte Dateien
| Datei | Erstellt von | Beschreibung |
|------|-----------|-------------|
| `.azure_creds` | Token-Speicher-Aktivitäten | Lokaler JSON-Cache von Zugriffs-/Aktualisierungstokens, benannt nach Namen. |
| `output.txt` | `-re` Flag | Zeitgestempeltes Spiegelbild der gesamten Konsolenausgabe. |
| `session.har` | `auth-interactive` / `browser-sso` | Browser-Sitzungsaufzeichnung (gelöscht, sofern nicht `-k` gesetzt). |
| `<name>.json` | `-j` Flag / `gather-all` | Gespeicherte API-Antworten. |
### Mitgelieferte Datendateien
| Datei | Beschreibung |
|------|-------------|
| `includes/auth_apps.json` | Zielanwendungs-IDs für Spraying und die `interest`-Listen. |
| `includes/apps.json` | Bekannte Microsoft-App-IDs und Metadaten für `knownids`. |
| `includes/Webserver.py` | Lokaler HTTPS-Listener, der die PKCE-Weiterleitung für `auth-app` implementiert. |
| `includes/PRT.py` | PRT-Minting-Kette (Geräteregistrierung → PRT → `x-ms-RefreshTokenCredential`-Cookie), verwendet von `browser-sso -aprt`. |
| `includes/web/cert.pem`, `includes/web/key.pem` | TLS-Material für den lokalen Listener. |
---
## Hinweise & Tipps
- **Standard-App-ID** (`d3590ed6-52b3-4102-aeff-aad2292ab01c`) ist der Microsoft Office
First-Party-Client, der für die meisten Abläufe funktioniert. Die von einigen Aktivitäten
ausgegebenen Hinweise schlagen vor, die Tokens auf die **Microsoft Azure CLI**-App (`04b07795-8ddb-461a-bbee-02f9e1bf7b46`)
auszuweiten, um einen breiteren Zugriff zu erhalten.
- **Scope-Anleitung:** Verwenden Sie `-sc openid` für Passwort-Spraying und
`-sc 'https://graph.microsoft.com/.default'` für Graph-Operationen.
- **`--beta`** schaltet `list-users` / `list-applications` auf den Graph-Beta-Endpunkt um,
was zusätzliche Informationen (z. B. On-Prem-Synchronisationsattribute) sichtbar machen kann.
- **`auth-app` TLS:** Der lokale PKCE-Listener benötigt ein Zertifikat-/Schlüsselpaar unter
`includes/web/cert.pem` und `includes/web/key.pem`. Generieren Sie ein selbstsigniertes Paar,
falls es fehlt, z. B.: ```bash
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout includes/web/key.pem -out includes/web/cert.pem -days 365 -subj "/CN=localhost"
-d gibt Debug-Informationen auf hoher Ebene aus; -dd gibt vollständige HTTP-Anfragen und
Antworten (Header + Body) aus — nützlich bei der Diagnose fehlgeschlagener Token-Austausche.-br/--browser). Die Browser-Flows (auth-interactive,
browser-sso) führen einen sichtbaren Playwright-Browser aus. Die Engine ist standardmäßig firefox
(die zuverlässigste sichtbare Engine unter WSLg); wechseln Sie mit -br chromium oder -br webkit.
Installieren Sie die ausgewählte Engine einmalig mit python -m playwright install <engine>./dev/dxg, gesteuert durch den d3d12 Mesa-Treiber) bereit, die der
GPU/Compositor-Prozess des Browsers zu nutzen versucht, während der standardmäßige der WSL-VM
winzig ist (oft 64 MB). Beides zusammen — der GPU-Prozess dreht sich auf einem Gerät, das er nicht antreiben kann,
und der Shared-Memory-Compositor erschöpft — sodass nichts gerendert wird und die VM
anschwillt, bis der Windows-Host überlastet ist. Ein sekundärer Beitragender war
: Die Microsoft-Anmeldeseite führt Long-Polling durch, sodass
nie feuert und die Navigation auf einer leeren Seite bis zum Timeout blockiert.
Erstellt von Mr.Un1k0d3r — TrueCyber Inc.
refresh) — Tausch eines Refresh-Tokens gegen frische Zugriffstoken.obo) — Austausch eines bereits ausgestellten Zugriffstokens gegen ein neues Token für eine nachgelagerte Ressource (OAuth 2.0 jwt-bearer / OBO).browser-sso) — Öffnen eines echten Browsers, der bereits als Benutzer authentifiziert ist, direkt in die Ziel-Webanwendung (Outlook im Web, Teams, SharePoint, das Azure-Portal, ...). Mit -aprt/--auto-prt wird automatisch ein Primary Refresh Token (PRT)-Cookie aus einem Refresh-Token erstellt (Geräteregistrierung → PRT → x-ms-RefreshTokenCredential), sodass ein neuer Browser Single Sign-On ohne manuelle Anmeldung durchführt.gather-all.spray) und Cross-App-Refresh-Token-Spraying (spray-refresh).magic-app findet öffentlich umleitbare Apps mit AllPrincipals-Zustimmung; integrierte Listen bekannter/interessanter Microsoft-App-IDs.| Aktivität | Erforderlich | Optional | Beschreibung |
|---|
id | -t | — | Ermitteln der Mandanten-ID für eine angegebene E-Mail-Domain. |
phish-start | — | -app, -tid, -as, -s, -n | Beginnt einen Gerätecode-Flow; gibt den Benutzercode aus und erfasst (standardmäßig) automatisch. |
phish-capture | -c | -app, -tid, -s, -n | Abfragen von Token mittels eines zuvor ausgestellten Gerätecodes. |
auth | -u, -p, -tid, -app, -v | -s, -n | Authentifizierung mit Benutzername/Passwort (ROPC). |
auth-app | -tid | -s, -n | Authorization-Code + PKCE-Flow über einen lokalen HTTPS-Listener. |
auth-interactive | — | -url, -k, -n | Startet einen Browser (Playwright), lässt den Benutzer einloggen und extrahiert Token aus dem Sitzungs-HAR. Speichert immer automatisch. |
refresh | -v, -app, und (-l) oder (-r + -tid) | -s, -n | Austausch eines Aktualisierungstokens gegen ein neues Zugriffstoken. |
obo | -tid, -app, und (-ac) oder (-l) | -cs, -au, -sc, -s, -n | On-Behalf-Of: Austausch eines ausgestellten Zugriffstokens gegen ein Token, das auf eine andere Ressource beschränkt ist. |
browser-sso | -app, und (-l) oder (-r + -tid) | -aprt, -url, -prt, -v, -k, -s, -n | Öffnet einen bereits als Benutzer authentifizierten Browser. Fügen Sie -aprt hinzu, um automatisch ein PRT-Cookie aus dem Aktualisierungstoken zu erstellen, mit -prt ein vorhandenes einspielen, oder auf Token-Konvertierung + manuelle Anmeldung zurückgreifen. |
| Aktivität | Erforderlich | Optional | Beschreibung |
|---|
self | Token | — | Das aktuelle Benutzerprofil anzeigen (/me). |
email | Token, -fl | — | Im Postfach des angemeldeten Benutzers nach einem Stichwort suchen. |
permission | Token | — | Die Tenant-Autorisierungsrichtlinie anzeigen (Beta). |
list-users | Token | -j, -beta, -fl, -exp | Alle Benutzer auflisten. |
list-applications | Token | -j, -beta, -fl, -exp | Alle Anwendungen auflisten. |
list-principals | Token | -j, -fl, -exp | Alle Dienstprinzipale auflisten. |
register-app | Token, -n | — | Eine neue Anwendung registrieren (mit einem 1-jährigen Clientschlüssel). |
new-group | Token, -n | — | Eine neue Sicherheitsgruppe erstellen. |
add-group | Token, -uid | -gid | Eine Verzeichnisrolle einem Prinzipal zuweisen (Standardrolle = Globaler Administrator). |
push-file | Token, -fp, -n | — | Eine lokale Datei in das OneDrive des Benutzers hochladen. |
gather-all | Token | -j | Massensammlung von Benutzern, Gruppen, Apps, SPs, Rollen, Richtlinien und Berechtigungen. |
raw-url | Token, -url | -j, -fl, -exp | Ein rohes GET an eine beliebige Graph/REST-URL senden (behandelt @odata.nextLink-Paginierung). |
invite | Token, -n | -url | Einen externen (Gast-)Benutzer einladen. -n ist die E-Mail des Eingeladenen. |
magic-app | Token | — | Apps mit AllPrincipals-Zustimmung, appRoleAssignmentRequired=false und öffentlichen Umleitungs-URIs finden. |
| Aktivität | Erforderlich | Optional | Beschreibung |
|---|
knownids | — | -fl, -exp | Liste bekannte Microsoft-Anwendungs-IDs auf (includes/apps.json). |
list-interest | — | — | Liste die in includes/auth_apps.json definierten App-Kategorien auf. |
interest | — | -i, -ty | Liste interessante App-IDs auf; -i gibt nur IDs aus, -ty filtert nach Kategorie. |
| 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/dev/shmpage.goto(..., wait_until="networkidle")networkidle--no-sandbox --disable-gpu --disable-dev-shm-usage, Firefox erhält gfx.webrender.force-disabled /
layers.acceleration.disabled — und fällt auf CPU (Software) Rendering zurück, sodass die Seite
dennoch rendert und vollständig interaktiv ist. Jede Navigation wartet jetzt auf
domcontentloaded statt networkidle. Sie sollten einen funktionierenden Browser sehen./dev/shm (sudo mount -o remount,size=1g /dev/shm),
stellen Sie sicher, dass Sie WSL 2 mit WSLg verwenden (wsl --update; echo $DISPLAY sollte
nicht leer sein), und bestätigen Sie, dass die Browser-Laufzeitumgebung in der venv installiert ist
(python -m playwright install firefox und python -m playwright install-deps).