
Un fork del excelente TokenTactics con soporte para CAE y token endpoint v2
______ __ __ __ _ ___
/_ __/___ / /_____ ____ / /_____ ______/ /_(_)_________ _ __ |__ \
/ / / __ \/ //_/ _ \/ __ \ / __/ __ `/ ___/ __/ / ___/ ___/ | | / / __/ /
/ / / /_/ / ,< / __/ / / / / /_/ /_/ / /__/ /_/ / /__(__ ) | |/ / / __/
/_/ \____/_/|_|\___/_/ /_/ \__/\__,_/\___/\__/_/\___/____/ |___(_)____/
Esta es una versión actualizada de TokenTactics escrita originalmente por Stephan Borosh @rvrsh3ll y Bobby Cooke @0xBoku.
Los tokens de acceso de Azure te permiten autenticarte en determinados endpoints como un usuario que inicia sesión con un código de dispositivo. Si posees un token de actualización capaz de FOCI (Familia de IDs de Cliente), puedes usarlo para obtener tokens de acceso a todos los endpoints capaces de FOCI conocidos. Dado que el token de actualización también contiene información sobre si el usuario ha realizado autenticación multifactor, puedes aprovecharlo. Una vez que tienes el token de acceso de un usuario, es posible acceder a ciertas aplicaciones como Outlook, SharePoint, OneDrive, MSTeams y más.
Por ejemplo, si tienes un token de actualización de Graph o MSGraph, puedes conectarte a Azure y volcar usuarios, grupos, etc. Luego, dependiendo de las políticas de acceso condicional, podrías cambiar a un token de Azure Core Management y ejecutar AzureHound. Después, obtener un token de acceso de Outlook y leer/enviar correos electrónicos, o de MS Teams y leer/enviar mensajes de Teams!
Para más información sobre los tipos de tokens de Azure: Tokens de acceso de la plataforma de identidad de Microsoft
Hay algunos ejemplos de solicitudes a endpoints en la carpeta resources. También hay una plantilla de phishing de ejemplo para el phishing con código de dispositivo.
También puedes usar estos tokens con AAD Internals. Recomendamos encarecidamente echarle un vistazo a esta increíble herramienta.
Import-Module .\TokenTactics.psd1
Get-Help Get-EntraIDToken
Invoke-RefreshToSubstrateToken -Domain "myclient.org"
El conjunto de pruebas requiere PowerShell 7 y Pester 5.7.1. Utiliza respuestas HTTP simuladas y no requiere credenciales de Entra ID ni acceso a la red.
Install-Module Pester -RequiredVersion 5.7.1 -Scope CurrentUser
pwsh ./tests/Invoke-Tests.ps1
El mismo conjunto se ejecuta en Linux, macOS y Windows para cada pull request.
Get-EntraIDToken -Client MSGraph
Una vez que el usuario haya iniciado sesión, se te presentará el JWT y se guardará en la variable $response. Para acceder al token de acceso, usa $response.access_token desde tu ventana de PowerShell para mostrar el token. También puedes mostrar el token de actualización con $response.refresh_token. Pista: ¡querrás el token de actualización para seguir renovando a nuevos tokens!
Get-EntraIDToken -Client DODMSGraph
[!IMPORTANT] Esta funcionalidad se introdujo en v0.2.20 y requiere PowerShell 7.0
Si has creado una clave de acceso en un proveedor de terceros como KeePassXC, Bitwarden, 1Password o similar, puedes exportar el material de la clave privada.
[!CAUTION] Exportar tu material de clave privada es extremadamente peligroso. Asegúrate de entender el riesgo antes de continuar.
El formato de archivo de clave de acceso de KeePassXC es compatible de forma nativa y puedes apuntar el cmdlet directamente al archivo. El procedimiento de inicio de sesión inicial solo obtendrá la cookie ESTSAUTH necesaria, y luego debes usar Get-EntraIDTokenFromESTSCookie para intercambiar esta cookie por un token de portador (token de acceso, token de actualización y token de identificación).
# Recuperar el valor de la cookie ESTSAUTH
Invoke-EntraIDPasskeyLogin -Verbose -KeyFilePath "C:\Users\Fabian\Microsoft.passkey"
# Intercambiar la cookie ESTSAUTH por tokens de portador
Get-EntraIDTokenFromESTSCookie -CookieValue $Global:ESTSAUTH
Si tienes un formato de archivo no compatible, puedes especificar los valores necesarios manualmente y lograr el mismo objetivo.
Invoke-EntraIDPasskeyLogin -Verbose -UserPrincipalName "[email protected]" -UserHandle "XYZ" -CredentialId "9e9c8297-0cde-4726-8852-16c141e15bd3" -PrivateKey $PrivateKey
Get-EntraIDTokenFromESTSCookie -CookieValue $Global:ESTSAUTH
Si has obtenido una cookie sccauth de una sesión autenticada en security.microsoft.com (por ejemplo, a través de Evilginx o las herramientas de desarrollo del navegador), puedes usarla para recuperar tokens de acceso de Entra ID para un amplio conjunto de recursos a través del portal de Microsoft Defender XDR.
# Recuperar un token de Microsoft Graph usando la cookie sccauth
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -ResourceName MicrosoftGraph
# Proporcionar un token XSRF explícitamente para omitir la solicitud de arranque
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -XSRF "your_xsrf_value" -ResourceName Azure
# Usar una URL de recurso personalizada
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -Resource "https://management.core.windows.net/"
Valores admitidos de -ResourceName: Azure, LogAnalytics, MATP, MCAS, MicrosoftGraph, MicrosoftOffice, Purview, PurviewACC, ThreatIntelligencePortal.
Get-EntraIDTokenFromESTSCookie -ESTSAuthCookie "0.AbcApTk..."
Este módulo utiliza el flujo de código de autorización para obtener un token de acceso y un token de actualización usando la cookie ESTSAuth (o ESTSAuthPersistent). Útil si has suplantado una sesión a través de Evilginx u obtenido esta cookie de otro modo.
¡Asegúrate de usar la cookie correcta! ESTSAuthPersistent solo es útil cuando una política de CA realmente otorga una sesión persistente. De lo contrario, debes usar ESTSAuth. Por lo general, puedes saber cuál usar por la longitud; la cookie más larga es la que quieres usar :)
Nota: Esto puede no funcionar en todos los casos, ya que podría requerir interacción del usuario. Si es así, usa el flujo de código de dispositivo anterior o prueba roadtx interactiveauth --estscookie
Esta funcionalidad fue retroportada del pull request de rotarydrone en el repositorio original.
Uno de los ejemplos más destacados de este flujo oauth2 (al menos a principios de 2025) es el Portal de empresa de Intune, que permite, para algunos recursos, omitir los requisitos de cumplimiento del dispositivo.
Esta inteligencia fue publicada por primera vez por @dirkjan y luego presentada en Black Hat Europe a un público más amplio por @TEMP43487580
JumpsecLabs publicó un artículo de blog y un POC en forma de TokenSmith poco después.
Ahora las mismas capacidades están disponibles en TokenTacticsV2.
Get-AzureAuthorizationCode creará una URL que luego puedes usar para autenticarte.
Get-EntraIDTokenFromAuthorizationCode usa la URL completa o se puede usar con los parámetros AuthorizationCode y RedirectUrl para intercambiar el código de autorización por un token de acceso y actualización. Después de eso, puedes intentar acceder a otros recursos como siempre.

Si no especificas un token de actualización, los cmdlets usarán $response.refresh_token por defecto.
Invoke-RefreshToOutlookToken -domain "myclient.org"
$OutlookToken.access_token
Connect-AzureAD -AadAccessToken $response.access_token -AccountId [email protected]
Invoke-RefreshToMSGraphToken -Domain "myclient.org"
Connect-MgGraph -AccessToken $MSGraphToken.access_token -Scopes "User.Read.All","Group.ReadWrite.All"
Esto eliminará cualquier variable de token.
Clear-Token -Token All
Con la evaluación continua de acceso, Microsoft implementa medidas de seguridad adicionales, pero también extiende la vida útil máxima de un token de acceso a 24 horas. Ciertos servicios capaces de CAE como MSGraph, Exchange, Teams y SharePoint pueden bloquear tokens de acceso basándose en ciertos eventos desencadenados por Azure AD. Actualmente, estos eventos críticos son:
Invoke-RefreshToMSGraphToken -Domain "myclient.org" -UseCAE
if ((Parse-JWTtoken $MSGraphToken.access_token).ValidForHours -gt 23) { "El token de MSGraph es capaz de CAE" }
Si también tienes instalado AADInternals, puedes usar los tokens de acceso creados.
Invoke-RefreshToMSTeamsToken -UseCAE -Domain "myclient.org"
Set-AADIntTeamsStatusMessage -Message "Mi mensaje de estado genial" -AccessToken $MSTeamsToken.access_token -Verbose
Get-Command -Module TokenTactics
Solo se exportan los comandos orientados al usuario compatibles; los ayudantes de análisis, PKCE, renovación genérica y criptografía FIDO siguen siendo detalles de implementación privados.
Los métodos de TokenTactics están fuertemente influenciados por la gran investigación del Dr. Nestori Syynimaa en https://o365blog.com/.
Get-EntraIDTokenFromSCCAUTHCookie para recuperar tokens de acceso de Entra ID para varios recursos (Azure, MicrosoftGraph, MATP, MCAS, Purview, etc.) usando una cookie sccauth de security.microsoft.com. Opcionalmente acepta un token XSRF; si se omite, arranca automáticamente. Admite un parámetro TenantId opcional para inyección de encabezados y construcción del recurso PurviewACC.Get-Azure a Get-EntraIDInvoke-EntraIDPasskeyLogin para automatizar flujos de inicio de sesión con passkey. Esto guardará la cookie ESTSAUTH y la sesión web como variables globales para reutilizar en otros cmdlets como Get-EntraIDTokenFromESTSCookieInvoke-EntraIDPasskeyLogin, Get-EntraIDTokenFromCookie, Get-EntraIDTokenFromRefreshTokenCredentialCookie y Get-EntraIDTokenFromESTSCookie-Username para rellenar previamente el parámetro login_hint en el cmdlet Get-AzureAuthorizationCode-CopyToClipboard en el cmdlet Get-AzureAuthorizationCodeForeach-Object -parallel)-CustomUserAgent. Gracias a Pri3stResourceTenant para Get-EntraIDToken para admitir phishing con código de dispositivo B2BUseCodeVerifier para admitir Prueba de Clave para Intercambio de Código (PKCE)UseV1Endpoint a algunas funciones para admitir una variedad más amplia de pruebas de endpointsGet-AzureTokenFromRefreshTokenCredentialCookie ("x-ms-RefreshTokenCredential") y agregar Get-AzureTokenFromCookie modularizadoGet-AzureTokenFromESTSCookieGet-AzureTokenFromAuthorizationCode a la salida de Get-AzureAuthorizationCodeGet-AzureTokenFromESTSCookie para admitir el endpoint appverifyGet-AzureTokenFromESTSCookieGet-AzureAuthorizationCode y Get-AzureTokenFromAuthorizationCodeGet-AzureAuthorizationCodeGet-AzureAuthorizationCode y Get-AzureTokenFromAuthorizationCode Invoke-RefreshToDeviceRegistrationToken, que es una versión de TokenTactics del cmdlet AADInternals Get-AccessTokenForAADJoinInvoke-RefreshToToken con UseV1Endpoint. Esto fue necesario para agregar Invoke-RefreshToDeviceRegistrationTokenConvertFrom-JWTtokenGet-ForgedUserAgentv2.0 de OAuth2 de Azure AD-UseCAEClientId en un parámetroclient_id para MSTeamsIssuedAt, NotBefore, ExpirationDate y ValidForHours en la salida de ConvertFrom-JWTtoken en formato legible para humanos