
Un fork del grande TokenTactics con supporto per CAE e token endpoint v2
______ __ __ __ _ ___
/_ __/___ / /_____ ____ / /_____ ______/ /_(_)_________ _ __ |__ \
/ / / __ \/ //_/ _ \/ __ \ / __/ __ `/ ___/ __/ / ___/ ___/ | | / / __/ /
/ / / /_/ / ,< / __/ / / / / /_/ /_/ / /__/ /_/ / /__(__ ) | |/ / / __/
/_/ \____/_/|_|\___/_/ /_/ \__/\__,_/\___/\__/_/\___/____/ |___(_)____/
Questa è una versione aggiornata di TokenTactics originariamente scritta da Stephan Borosh @rvrsh3ll e Bobby Cooke @0xBoku.
I token di accesso di Azure consentono di autenticarsi su determinati endpoint come un utente che accede tramite un codice dispositivo. Se si è in possesso di un refresh token compatibile con FOCI (Family of Client IDs), è possibile usarlo per ottenere token di accesso per tutti gli endpoint noti compatibili con FOCI. Poiché il refresh token contiene anche l'informazione se l'utente ha eseguito l'autenticazione a più fattori, è possibile sfruttarlo. Una volta ottenuto il token di accesso di un utente, potrebbe essere possibile accedere a determinate app come Outlook, SharePoint, OneDrive, MSTeams e altro.
Ad esempio, se si dispone di un refresh token di Graph o MSGraph, è possibile connettersi ad Azure ed estrarre utenti, gruppi, ecc. A seconda dei criteri di accesso condizionale, si potrebbe poi passare a un token di Azure Core Management ed eseguire AzureHound. Quindi, ottenere un token di accesso di Outlook e leggere/inviare email oppure di MS Teams e leggere/inviare messaggi di Teams!
Per maggiori informazioni sui tipi di token di Azure: Microsoft identity platform access tokens
Nella cartella resources sono presenti alcuni esempi di richieste agli endpoint. È presente anche un template di phishing di esempio per il phishing tramite codice dispositivo.
Puoi anche usare questi token con AAD Internals. Consigliamo vivamente di dare un'occhiata a questo straordinario strumento.
Import-Module .\TokenTactics.psd1
Get-Help Get-EntraIDToken
Invoke-RefreshToSubstrateToken -Domain "myclient.org"
La suite di test richiede PowerShell 7 e Pester 5.7.1. Utilizza risposte HTTP simulate e non richiede credenziali di Entra ID o accesso alla rete.
Install-Module Pester -RequiredVersion 5.7.1 -Scope CurrentUser
pwsh ./tests/Invoke-Tests.ps1
La stessa suite viene eseguita su Linux, macOS e Windows per ogni pull request.
Get-EntraIDToken -Client MSGraph
Dopo che l'utente ha effettuato l'accesso, ti verrà mostrato il JWT e verrà salvato nella variabile $response. Per accedere al token di accesso, usa $response.access_token nella finestra di PowerShell per visualizzare il token. Puoi anche visualizzare il refresh token con $response.refresh_token. Suggerimento: ti servirà il refresh token per continuare a ottenere nuovi token!
Get-EntraIDToken -Client DODMSGraph
[!IMPORTANT] Questa funzionalità è stata introdotta nella v0.2.20 e richiede PowerShell 7.0
Se hai creato una passkey in un provider di terze parti come KeePassXC, Bitwarden, 1Password o simili, puoi esportare il materiale della chiave privata.
[!CAUTION] Esportare il materiale della tua chiave privata è estremamente pericoloso. Assicurati di comprendere il rischio prima di procedere.
Il formato file delle passkey di KeePassXC è supportato nativamente e puoi indicare direttamente il file al cmdlet. La procedura di accesso iniziale recupererà solo il cookie ESTSAUTH necessario e dovrai usare Get-EntraIDTokenFromESTSCookie per scambiare questo cookie con un bearer token (access token, refresh token e id token).
# 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
Se hai un formato di file non supportato, puoi specificare manualmente i valori richiesti e raggiungere lo stesso obiettivo.
Invoke-EntraIDPasskeyLogin -Verbose -UserPrincipalName "[email protected]" -UserHandle "XYZ" -CredentialId "9e9c8297-0cde-4726-8852-16c141e15bd3" -PrivateKey $PrivateKey
Get-EntraIDTokenFromESTSCookie -CookieValue $Global:ESTSAUTH
Se hai ottenuto un cookie sccauth da una sessione autenticata su security.microsoft.com (ad esempio tramite Evilginx o DevTools del browser), puoi usarlo per recuperare token di accesso Entra ID per un'ampia serie di risorse attraverso il portale 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/"
Valori supportati per -ResourceName: Azure, LogAnalytics, MATP, MCAS, MicrosoftGraph, MicrosoftOffice, Purview, PurviewACC, ThreatIntelligencePortal.
Get-EntraIDTokenFromESTSCookie -ESTSAuthCookie "0.AbcApTk..."
Questo modulo usa il flusso del codice di autorizzazione per ottenere un access token e un refresh token tramite il cookie ESTSAuth (o ESTSAuthPersistent). Utile se hai rubato una sessione tramite Evilginx o hai ottenuto questo cookie in altro modo.
Assicurati di usare il cookie giusto! ESTSAuthPersistent è utile solo quando un criterio CA concede effettivamente una sessione persistente. In caso contrario, dovresti usare ESTSAuth. Di solito puoi capire quale usare in base alla lunghezza: il cookie più lungo è quello che ti serve :)
Nota: potrebbe non funzionare in tutti i casi perché richiede l'interazione dell'utente. In tal caso, usa il flusso Device Code qui sopra oppure prova roadtx interactiveauth --estscookie
Questa funzionalità è stata backportata dalla pull request di rotarydrone nel repository originale.
Uno degli esempi più noti di questo flusso oauth2 (almeno all'inizio del 2025) è il portale aziendale di Intune, che consente, per alcune risorse, di aggirare i requisiti di conformità dei dispositivi.
Queste informazioni sono state pubblicate per la prima volta da @dirkjan e poi diffuse a un pubblico più ampio al Black Hat Europe da @TEMP43487580
Poco dopo, JumpsecLabs ha pubblicato un articolo del blog e un POC sotto forma di TokenSmith.
Ora le stesse funzionalità sono disponibili in TokenTacticsV2.
Get-AzureAuthorizationCode creerà un URL che potrai poi usare per autenticarti.
Get-EntraIDTokenFromAuthorizationCode usa l'URL completo oppure può essere usato con i parametri AuthorizationCode e RedirectUrl per scambiare il codice di autorizzazione con un access token e un refresh token. Dopodiché puoi provare ad accedere ad altre risorse come al solito.

Se non specifichi un refresh token, i cmdlet useranno $response.refresh_token come predefinito.
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"
Questa operazione rimuoverà eventuali variabili dei token.
Clear-Token -Token All
Con la valutazione dell'accesso continuo Microsoft implementa misure di sicurezza aggiuntive, ma estende anche la durata massima di un access token a 24 ore. Alcuni servizi compatibili con CAE come MSGraph, Exchange, Teams e SharePoint possono bloccare gli access token in base a determinati eventi generati da Azure AD. Attualmente questi eventi critici sono:
Invoke-RefreshToMSGraphToken -Domain "myclient.org" -UseCAE
if ((Parse-JWTtoken $MSGraphToken.access_token).ValidForHours -gt 23) { "MSGraph token is CAE capable" }
Se hai installato anche AADInternals, puoi usare gli access token creati.
Invoke-RefreshToMSTeamsToken -UseCAE -Domain "myclient.org"
Set-AADIntTeamsStatusMessage -Message "My cool status message" -AccessToken $MSTeamsToken.access_token -Verbose
Get-Command -Module TokenTactics
Vengono esportati solo i comandi supportati rivolti all'utente; parsing, PKCE, refresh generico e helper crittografici FIDO rimangono dettagli implementativi privati.
I metodi di TokenTactics sono fortemente influenzati dall'ottima ricerca del Dr. Nestori Syynimaa su https://o365blog.com/.
Get-EntraIDTokenFromSCCAUTHCookie per recuperare access token Entra ID per varie risorse (Azure, MicrosoftGraph, MATP, MCAS, Purview, ecc.) usando un cookie sccauth da security.microsoft.com. Accetta opzionalmente un token XSRF; se omesso, esegue il bootstrap automaticamente. Supporta un parametro opzionale TenantId per l'iniezione negli header e la costruzione della risorsa PurviewACC.Get-Azure in Get-EntraIDInvoke-EntraIDPasskeyLogin per automatizzare i flussi di accesso Passkey. Salva il cookie ESTSAUTH e la websession come variabili globali per il riutilizzo in altri cmdlet come Get-EntraIDTokenFromESTSCookieInvoke-EntraIDPasskeyLogin, Get-EntraIDTokenFromCookie, Get-EntraIDTokenFromRefreshTokenCredentialCookie e Get-EntraIDTokenFromESTSCookie-Username per precompilare il parametro login_hint nel cmdlet Get-AzureAuthorizationCode-CopyToClipboard nel cmdlet Get-AzureAuthorizationCodeForeach-Object -parallel)-CustomUserAgent. Grazie a Pri3stResourceTenant per Get-EntraIDToken per supportare il phishing tramite device code B2BUseCodeVerifier per supportare Proof Key for Code Exchange (PKCE)UseV1Endpoint ad alcune funzioni per supportare una più ampia varietà di test sugli endpointGet-AzureTokenFromRefreshTokenCredentialCookie ("x-ms-RefreshTokenCredential") e aggiunto Get-AzureTokenFromCookie modularizzatoGet-AzureTokenFromESTSCookieGet-AzureTokenFromAuthorizationCode all'output di Get-AzureAuthorizationCodeGet-AzureTokenFromESTSCookie per supportare l'endpoint appverifyGet-AzureTokenFromESTSCookieGet-AzureAuthorizationCode e Get-AzureTokenFromAuthorizationCodeGet-AzureAuthorizationCodeGet-AzureAuthorizationCode e Get-AzureTokenFromAuthorizationCode Invoke-RefreshToDeviceRegistrationToken, una versione TokenTactics del cmdlet AADInternals Get-AccessTokenForAADJoinInvoke-RefreshToToken con UseV1Endpoint. Questo è stato necessario per aggiungere Invoke-RefreshToDeviceRegistrationTokenConvertFrom-JWTtokenGet-ForgedUserAgentv2.0 di Azure AD OAuth2-UseCAEClientId un parametroclient_id per MSTeamsIssuedAt, NotBefore, ExpirationDate e ValidForHours nell'output di ConvertFrom-JWTtoken in formato leggibile