
Форк отличного TokenTactics с поддержкой CAE и token endpoint v2
______ __ __ __ _ ___
/_ __/___ / /_____ ____ / /_____ ______/ /_(_)_________ _ __ |__ \
/ / / __ \/ //_/ _ \/ __ \ / __/ __ `/ ___/ __/ / ___/ ___/ | | / / __/ /
/ / / /_/ / ,< / __/ / / / / /_/ /_/ / /__/ /_/ / /__(__ ) | |/ / / __/
/_/ \____/_/|_|\___/_/ /_/ \__/\__,_/\___/\__/_/\___/____/ |___(_)____/
Это обновлённая версия TokenTactics, изначально написанная Стефаном Борошем @rvrsh3ll и Бобби Куком @0xBoku.
Токены доступа Azure позволяют аутентифицироваться в определённых конечных точках от имени пользователя, который входит с помощью кода устройства. Если у вас есть FOCI (Family of Client IDs) — обновляемый токен, совместимый с FOCI, вы можете использовать его для получения токенов доступа ко всем известным конечным точкам, поддерживающим 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 для каждого pull request.
Get-EntraIDToken -Client MSGraph
После того как пользователь войдёт, вам будет показан JWT, и он будет сохранён в переменной $response. Чтобы получить токен доступа, используйте $response.access_token в окне PowerShell. Вы также можете отобразить обновляемый токен с помощью $response.refresh_token. Подсказка: вам понадобится обновляемый токен, чтобы продолжать обновлять его до новых токенов!
Get-EntraIDToken -Client DODMSGraph
[!IMPORTANT] Эта функция была добавлена в версии 0.2.20 и требует PowerShell 7.0
Если вы создали ключ доступа у стороннего провайдера, такого как KeePassXC, Bitwarden, 1Password или аналогичного, вы можете экспортировать закрытый ключ.
[!CAUTION] Экспорт закрытого ключа крайне опасен. Убедитесь, что вы понимаете риски, прежде чем продолжить.
Формат файла ключа доступа KeePassXC поддерживается изначально, и вы можете указать путь к файлу напрямую. Процедура начального входа получит только необходимый cookie ESTSAUTH, после чего нужно использовать Get-EntraIDTokenFromESTSCookie для обмена этого cookie на токен-носитель (токен доступа, обновляемый токен и ID-токен).
# Получить значение cookie ESTSAUTH
Invoke-EntraIDPasskeyLogin -Verbose -KeyFilePath "C:\Users\Fabian\Microsoft.passkey"
# Обменять cookie ESTSAUTH на токены-носители
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
Если вы получили cookie sccauth из аутентифицированной сессии на security.microsoft.com (например, через Evilginx или инструменты разработчика браузера), вы можете использовать его для получения токенов доступа Entra ID для большого набора ресурсов через портал Microsoft Defender XDR.
# Получить токен Microsoft Graph с помощью cookie sccauth
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..."
Этот модуль использует поток кода авторизации для получения токена доступа и обновляемого токена с помощью cookie ESTSAuth (или ESTSAuthPersistent). Полезно, если вы перехватили сессию через Evilginx или иным образом получили этот cookie.
Обязательно используйте правильный cookie! ESTSAuthPersistent полезен только в том случае, если политика CA действительно предоставляет постоянную сессию. В противном случае используйте ESTSAuth. Обычно можно определить, какой использовать, по длине: длиннее cookie — тот, который вам нужен :)
Примечание: Это может работать не во всех случаях, так как может потребоваться взаимодействие с пользователем. Если это так, используйте поток с кодом устройства выше или попробуйте roadtx interactiveauth --estscookie
Эта функция была перенесена из pull request от rotarydrone в оригинальном репозитории.
Одним из наиболее известных примеров этого потока oauth2 (по крайней мере, на начало 2025 года) является Intune Company Portal, который для некоторых ресурсов позволяет обходить требования к соответствию устройств.
Эта информация была впервые опубликована @dirkjan, а затем представлена на Black Hat Europe более широкой аудитории @TEMP43487580
JumpsecLabs опубликовали статью в блоге и PoC в виде TokenSmith вскоре после этого.
Теперь те же возможности доступны в TokenTacticsV2.
Get-AzureAuthorizationCode создаст URL, который вы затем сможете использовать для аутентификации.
Get-EntraIDTokenFromAuthorizationCode использует либо полный URL, либо может быть использован с параметрами AuthorizationCode и RedirectUrl для обмена кода авторизации на токен доступа и обновляемый токен. После этого вы можете попытаться получить доступ к другим ресурсам как обычно.

Если вы не укажете обновляемый токен, командлеты по умолчанию будут использовать $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
С помощью непрерывной оценки доступа Microsoft реализует дополнительные меры безопасности, но также продлевает максимальное время жизни токена доступа до 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 остаются закрытыми деталями реализации.
Методы TokenTactics во многом основаны на замечательных исследованиях доктора Нестори Сюнимаа на https://o365blog.com/.
Get-EntraIDTokenFromSCCAUTHCookie для получения токенов доступа Entra ID для различных ресурсов (Azure, MicrosoftGraph, MATP, MCAS, Purview и т.д.) с использованием cookie sccauth с security.microsoft.com. Опционально принимает XSRF-токен; если он опущен, выполняется автоматическая начальная загрузка. Поддерживает необязательный параметр TenantId для вставки заголовка и создания ресурса PurviewACC.Get-Azure в Get-EntraIDInvoke-EntraIDPasskeyLogin для автоматизации потоков входа с ключом доступа. Это сохраняет cookie ESTSAUTH и веб-сессию как глобальные переменные для повторного использования в других командлетах, таких как Get-EntraIDTokenFromESTSCookieInvoke-EntraIDPasskeyLogin, Get-EntraIDTokenFromCookie, Get-EntraIDTokenFromRefreshTokenCredentialCookie и Get-EntraIDTokenFromESTSCookie-Username для предварительного заполнения параметра login_hint в командлете Get-AzureAuthorizationCode-CopyToClipboard в командлет Get-AzureAuthorizationCodeForeach-Object -parallel)-CustomUserAgent. Спасибо Pri3stResourceTenant для Get-EntraIDToken для поддержки B2B-фишинга с кодом устройстваUseCodeVerifier для поддержки Proof Key for Code Exchange (PKCE)UseV1Endpoint в некоторые функции для поддержки более широкого спектра тестов конечных точекGet-AzureTokenFromRefreshTokenCredentialCookie ("x-ms-RefreshTokenCredential") и модульный Get-AzureTokenFromCookieGet-AzureTokenFromESTSCookieGet-AzureTokenFromAuthorizationCode в вывод Get-AzureAuthorizationCodeGet-AzureTokenFromESTSCookie для поддержки конечной точки appverifyGet-AzureTokenFromESTSCookieGet-AzureAuthorizationCode и Get-AzureTokenFromAuthorizationCodeGet-AzureAuthorizationCodeGet-AzureAuthorizationCode и Get-AzureTokenFromAuthorizationCode Invoke-RefreshToDeviceRegistrationToken, который является версией TokenTactics для AADInternals командлета Get-AccessTokenForAADJoinInvoke-RefreshToToken с помощью UseV1Endpoint. Это требовалось для добавления Invoke-RefreshToDeviceRegistrationTokenConvertFrom-JWTtokenGet-ForgedUserAgentv2.0 конечной точки OAuth2 Azure AD-UseCAEClientId теперь является параметромclient_id для MSTeamsIssuedAt, NotBefore, ExpirationDate и ValidForHours в вывод ConvertFrom-JWTtoken в удобочитаемом формате