# API & Tool Reference — Device-Code / Consent Phishing ## Entra ID OAuth 2.0 endpoints | Endpoint | Method | Purpose | |----------|--------|---------| | `https://login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode` | POST | Request `user_code` + `device_code`. `tenant` = `organizations`, `common`, or a tenant ID. | | `https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token` | POST | Poll for tokens (`grant_type=urn:ietf:params:oauth:grant-type:device_code`) or redeem `authorization_code` / `refresh_token`. | | `https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize` | GET | Consent / authorization-code request (illicit consent variant). | | `https://microsoft.com/devicelogin` | GET | Genuine Microsoft page where the victim enters the `user_code`. | ### Device-code request parameters | Parameter | Example | Notes | |-----------|---------|-------| | `client_id` | `d3590ed6-52b3-4102-aeff-aad2292ab01c` | Microsoft Office (first-party, broad pre-auth). | | `scope` | `https://graph.microsoft.com/.default offline_access` | `offline_access` yields a long-lived refresh token. | ### Token-poll parameters | Parameter | Value | |-----------|-------| | `grant_type` | `urn:ietf:params:oauth:grant-type:device_code` | | `client_id` | same as request | | `device_code` | from device-code response | Poll responses: `authorization_pending`, `slow_down`, `expired_token`, `authorization_declined`, or success (`access_token`, `refresh_token`, `id_token`). ## Common first-party client IDs | Client | Client ID | |--------|-----------| | Microsoft Office | `d3590ed6-52b3-4102-aeff-aad2292ab01c` | | Microsoft Azure CLI | `04b07795-8ddb-461a-bbee-02f9e1bf7b46` | | Microsoft Azure PowerShell | `1950a258-227b-4e31-a9cf-717495945fc2` | | Microsoft Teams | `1fec8e78-bce4-4aaf-ab1b-5451cc387264` | ## TokenTactics (PowerShell) functions | Function | Key parameters | Purpose | |----------|---------------|---------| | `Get-AzureToken` | `-Client` (MSGraph, DODMSGraph) | Generate device code, poll, return tokens. | | `Invoke-RefreshToMSGraphToken` | `-domain -refreshToken [-ClientId]` | Refresh to Microsoft Graph. | | `Invoke-RefreshToOutlookToken` | `-domain -refreshToken` | Refresh to Outlook/EXO. | | `Invoke-RefreshToMSTeamsToken` | `-domain -refreshToken` | Refresh to Teams. | | `Invoke-RefreshToAzureCoreManagementToken` | `-domain -refreshToken` | Refresh to Azure ARM. | | `Invoke-RefreshToSubstrateToken` | `-domain -refreshToken` | Refresh to Substrate. | | `Invoke-DumpOWAMailboxViaMSGraphApi` | `-AccessToken -mailFolder` | Read mailbox via Graph. | | `Invoke-ParseJWTtoken` | `-Token` | Decode a JWT. | ## ROADtools | Command | Purpose | |---------|---------| | `roadtx refreshtokento -r -c -s ` | Exchange refresh token for new resource. | | `roadrecon auth --refresh-token -c ` | Authenticate roadrecon. | | `roadrecon gather` | Dump directory to local DB. | | `roadrecon gui` | Browse enumerated tenant data. | Source: https://github.com/rvrsh3ll/TokenTactics , https://github.com/dirkjanm/ROADtools , RFC 8628.