
Un fork de l'excellent TokenTactics avec prise en charge de CAE et de l'endpoint token v2.
______ __ __ __ _ ___
/_ __/___ / /_____ ____ / /_____ ______/ /_(_)_________ _ __ |__ \
/ / / __ \/ //_/ _ \/ __ \ / __/ __ `/ ___/ __/ / ___/ ___/ | | / / __/ /
/ / / /_/ / ,< / __/ / / / / /_/ /_/ / /__/ /_/ / /__(__ ) | |/ / / __/
/_/ \____/_/|_|\___/_/ /_/ \__/\__,_/\___/\__/_/\___/____/ |___(_)____/
Ceci est une version mise à jour de TokenTactics écrite à l'origine par Stephan Borosh @rvrsh3ll et Bobby Cooke @0xBoku.
Les jetons d'accès Azure vous permettent de vous authentifier auprès de certains points de terminaison en tant qu'utilisateur qui se connecte avec un code d'appareil. Si vous disposez d'un jeton d'actualisation compatible FOCI (famille d'ID clients), vous pouvez l'utiliser pour obtenir des jetons d'accès pour tous les points de terminaison compatibles FOCI connus. Étant donné que le jeton d'actualisation contient également l'information indiquant si l'utilisateur a effectué une authentification multifacteur, vous pouvez l'utiliser. Une fois que vous avez le jeton d'accès d'un utilisateur, il peut être possible d'accéder à certaines applications telles que Outlook, SharePoint, OneDrive, Microsoft Teams, etc.
Par exemple, si vous disposez d'un jeton d'actualisation Graph ou MSGraph, vous pouvez alors vous connecter à Azure et extraire des utilisateurs, des groupes, etc. Vous pouvez ensuite, selon les politiques d'accès conditionnel, passer à un jeton Azure Core Management et exécuter AzureHound. Ensuite, obtenez un jeton d'accès Outlook et lisez/envoyez des e-mails, ou un jeton Microsoft Teams et lisez/envoyez des messages Teams !
Pour en savoir plus sur les types de jetons Azure, consultez Jetons d'accès de la plateforme d'identités Microsoft
Quelques exemples de requêtes vers des points de terminaison se trouvent dans le dossier resources. Vous y trouverez également un modèle de phishing pour le phishing par code d'appareil.
Vous pouvez également utiliser ces jetons avec AAD Internals. Nous vous recommandons vivement de découvrir cet outil étonnant.
Import-Module .\TokenTactics.psd1
Get-Help Get-EntraIDToken
Invoke-RefreshToSubstrateToken -Domain "myclient.org"
La suite de tests nécessite PowerShell 7 et Pester 5.7.1. Elle utilise des réponses HTTP simulées et ne nécessite ni identifiants Entra ID ni accès réseau.
Install-Module Pester -RequiredVersion 5.7.1 -Scope CurrentUser
pwsh ./tests/Invoke-Tests.ps1
La même suite s'exécute sur Linux, macOS et Windows pour chaque pull request.
Get-EntraIDToken -Client MSGraph
Une fois que l'utilisateur s'est connecté, le JWT s'affiche et est sauvegardé dans la variable $response. Pour accéder au jeton d'accès, utilisez $response.access_token dans votre fenêtre PowerShell pour afficher le jeton. Vous pouvez également afficher le jeton d'actualisation avec $response.refresh_token. Astuce : c'est le jeton d'actualisation qu'il vous faut pour continuer à actualiser vers de nouveaux jetons !
Get-EntraIDToken -Client DODMSGraph
[!IMPORTANT] Cette fonctionnalité a été introduite dans la v0.2.20 et nécessite PowerShell 7.0.
Si vous avez créé une clé d'accès auprès d'un fournisseur tiers comme KeePassXC, Bitwarden, 1Password ou similaire, vous pouvez exporter le matériel de clé privée.
[!CAUTION] Exporter votre matériel de clé privée est extrêmement dangereux. Assurez-vous de bien comprendre le risque avant de continuer.
Le format de fichier de clé d'accès KeePassXC est pris en charge nativement et vous pouvez pointer la cmdlet directement vers le fichier. La procédure de connexion initiale ne permet d'obtenir que le cookie ESTSAUTH requis ; vous devez ensuite utiliser Get-EntraIDTokenFromESTSCookie pour échanger ce cookie contre un jeton porteur (jeton d'accès, jeton d'actualisation et jeton d'identité).
# Retrieve the ESTSAUTH cookie value
Invoke-EntraIDPasskeyLogin -Verbose -KeyFilePath "C:\Users\Fabian\Microsoft.passkey"
# Exchange the ESTSAUTH cookie for bearer tokens
Get-EntraIDTokenFromESTSCookie -CookieValue $Global:ESTSAUTH
Si vous avez un format de fichier non pris en charge, vous pouvez spécifier manuellement les valeurs requises et obtenir le même résultat.
Invoke-EntraIDPasskeyLogin -Verbose -UserPrincipalName "[email protected]" -UserHandle "XYZ" -CredentialId "9e9c8297-0cde-4726-8852-16c141e15bd3" -PrivateKey $PrivateKey
Get-EntraIDTokenFromESTSCookie -CookieValue $Global:ESTSAUTH
Si vous avez obtenu un cookie sccauth à partir d'une session authentifiée sur security.microsoft.com (par exemple via Evilginx ou les DevTools du navigateur), vous pouvez l'utiliser pour récupérer des jetons d'accès Entra ID pour un large ensemble de ressources via le portail Microsoft Defender XDR.
# Retrieve a Microsoft Graph token using the sccauth cookie
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -ResourceName MicrosoftGraph
# Provide an XSRF token explicitly to skip the bootstrapping request
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -XSRF "your_xsrf_value" -ResourceName Azure
# Use a custom resource URL
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -Resource "https://management.core.windows.net/"
Valeurs -ResourceName prises en charge : Azure, LogAnalytics, MATP, MCAS, MicrosoftGraph, MicrosoftOffice, Purview, PurviewACC, ThreatIntelligencePortal.
Get-EntraIDTokenFromESTSCookie -ESTSAuthCookie "0.AbcApTk..."
Ce module utilise le flux de code d'autorisation pour obtenir un jeton d'accès et un jeton d'actualisation à l'aide du cookie ESTSAuth (ou ESTSAuthPersistent). Utile si vous avez hameçonné une session via Evilginx ou si vous avez obtenu ce cookie d'une autre manière.
Assurez-vous d'utiliser le bon cookie ! ESTSAuthPersistent n'est utile que lorsqu'une politique d'accès conditionnel accorde effectivement une session persistante. Sinon, vous devez utiliser ESTSAuth. Vous pouvez généralement déterminer lequel utiliser en fonction de la longueur : le cookie le plus long est celui que vous voulez utiliser :)
Remarque : cela peut ne pas fonctionner dans tous les cas, car cela peut nécessiter une interaction de l'utilisateur. Dans ce cas, utilisez le flux de code d'appareil ci-dessus ou essayez roadtx interactiveauth --estscookie
Cette fonctionnalité a été rétroportée depuis la pull request de rotarydrone dans le dépôt d'origine.
L'un des exemples les plus marquants de ce flux OAuth2 (du moins au début de 2025) est le portail d'entreprise Intune, qui permet, pour certaines ressources, de contourner les exigences de conformité des appareils.
Cette information a d'abord été publiée par @dirkjan, puis présentée au Black Hat Europe à un public plus large par @TEMP43487580
JumpsecLabs a publié un article de blog et une preuve de concept sous la forme de TokenSmith peu de temps après.
Les mêmes capacités sont désormais disponibles dans TokenTacticsV2.
Get-AzureAuthorizationCode crée une URL que vous pouvez ensuite utiliser pour vous authentifier.
Get-EntraIDTokenFromAuthorizationCode utilise soit l'URL complète, soit les paramètres AuthorizationCode et RedirectUrl pour échanger le code d'autorisation contre un jeton d'accès et un jeton d'actualisation. Ensuite, vous pouvez essayer d'accéder à d'autres ressources comme d'habitude.

Si vous ne spécifiez pas de jeton d'actualisation, les cmdlets utiliseront $response.refresh_token par défaut.
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"
Cela supprimera toutes les variables de jeton.
Clear-Token -Token All
Avec l'évaluation continue de l'accès, Microsoft met en œuvre des mesures de sécurité supplémentaires, mais prolonge également la durée de vie maximale d'un jeton d'accès à 24 heures. Certains services compatibles CAE comme MSGraph, Exchange, Teams et SharePoint peuvent bloquer les jetons d'accès en fonction de certains événements déclenchés par Azure AD. Actuellement, ces événements critiques sont :
Invoke-RefreshToMSGraphToken -Domain "myclient.org" -UseCAE
if ((Parse-JWTtoken $MSGraphToken.access_token).ValidForHours -gt 23) { "MSGraph token is CAE capable" }
Si AADInternals est également installé, vous pouvez utiliser les jetons d'accès créés.
Invoke-RefreshToMSTeamsToken -UseCAE -Domain "myclient.org"
Set-AADIntTeamsStatusMessage -Message "My cool status message" -AccessToken $MSTeamsToken.access_token -Verbose
Get-Command -Module TokenTactics
Seules les commandes publiques prises en charge sont exportées ; les fonctions d'analyse, PKCE, d'actualisation générique et les helpers cryptographiques FIDO restent des détails d'implémentation privés.
Les méthodes de TokenTactics sont fortement influencées par les excellents travaux de recherche du Dr Nestori Syynimaa sur https://o365blog.com/.
Get-EntraIDTokenFromSCCAUTHCookie pour récupérer les jetons d'accès Entra ID pour diverses ressources (Azure, MicrosoftGraph, MATP, MCAS, Purview, etc.) à l'aide d'un cookie sccauth provenant de security.microsoft.com. Accepte éventuellement un jeton XSRF ; s'il est omis, l'initialisation est automatique. Prend en charge un paramètre facultatif TenantId pour l'injection d'en-têtes et la construction de la ressource PurviewACC.Get-Azure en Get-EntraIDInvoke-EntraIDPasskeyLogin pour automatiser les flux de connexion par clé d'accès. Cela enregistrera le cookie ESTSAUTH et la session web en tant que variables globales réutilisables dans d'autres cmdlets comme Get-EntraIDTokenFromESTSCookieInvoke-EntraIDPasskeyLogin, Get-EntraIDTokenFromCookie, Get-EntraIDTokenFromRefreshTokenCredentialCookie et Get-EntraIDTokenFromESTSCookie-Username pour préremplir le paramètre login_hint dans la cmdlet Get-AzureAuthorizationCode-CopyToClipboard dans la cmdlet Get-AzureAuthorizationCodeForeach-Object -parallel)-CustomUserAgent. Merci à Pri3stResourceTenant pour Get-EntraIDToken afin de prendre en charge le phishing par code d'appareil B2BUseCodeVerifier pour prendre en charge la Proof Key for Code Exchange (PKCE)UseV1Endpoint à certaines fonctions pour prendre en charge une plus grande variété de tests de points de terminaisonGet-AzureTokenFromRefreshTokenCredentialCookie (« x-ms-RefreshTokenCredential ») et ajout de la version modulaire de Get-AzureTokenFromCookieGet-AzureTokenFromESTSCookieGet-AzureTokenFromAuthorizationCode à la sortie de Get-AzureAuthorizationCodeGet-AzureTokenFromESTSCookie pour prendre en charge le point de terminaison appverifyGet-AzureTokenFromESTSCookieGet-AzureAuthorizationCode et Get-AzureTokenFromAuthorizationCodeGet-AzureAuthorizationCodeGet-AzureAuthorizationCode et Get-AzureTokenFromAuthorizationCode Invoke-RefreshToDeviceRegistrationToken, une version TokenTactics de la cmdlet AADInternals Get-AccessTokenForAADJoinInvoke-RefreshToToken avec UseV1Endpoint. Cette prise en charge était nécessaire pour ajouter Invoke-RefreshToDeviceRegistrationTokenConvertFrom-JWTtokenGet-ForgedUserAgentv2.0 du point de terminaison OAuth2 d'Azure AD-UseCAEClientId est désormais un paramètreclient_id pour MSTeamsIssuedAt, NotBefore, ExpirationDate et ValidForHours dans la sortie de ConvertFrom-JWTtoken dans un format lisible par l'humain