
CAE 및 토큰 엔드포인트 v2를 지원하는 훌륭한 TokenTactics의 포크입니다.
______ __ __ __ _ ___
/_ __/___ / /_____ ____ / /_____ ______/ /_(_)_________ _ __ |__ \
/ / / __ \/ //_/ _ \/ __ \ / __/ __ `/ ___/ __/ / ___/ ___/ | | / / __/ /
/ / / /_/ / ,< / __/ / / / / /_/ /_/ / /__/ /_/ / /__(__ ) | |/ / / __/
/_/ \____/_/|_|\___/_/ /_/ \__/\__,_/\___/\__/_/\___/____/ |___(_)____/
이것은 원래 Stephan Borosh @rvrsh3ll와 Bobby Cooke @0xBoku가 작성한 TokenTactics의 업데이트된 버전입니다.
Azure 액세스 토큰을 사용하면 디바이스 코드로 로그인한 사용자로 특정 엔드포인트에 인증할 수 있습니다. FOCI(클라이언트 ID 패밀리) 지원 갱신 토큰을 보유하고 있다면 이를 사용하여 알려진 FOCI 지원 엔드포인트 모두에 대한 액세스 토큰을 얻을 수 있습니다. 갱신 토큰에는 사용자가 다단계 인증을 수행했는지 여부에 대한 정보도 포함되어 있으므로 이를 활용할 수 있습니다. 사용자의 액세스 토큰을 확보하면 Outlook, SharePoint, OneDrive, MSTeams 등과 같은 특정 앱에 액세스할 수 있습니다.
예를 들어, Graph 또는 MSGraph 갱신 토큰을 보유한 경우 Azure에 연결하여 사용자, 그룹 등을 덤프할 수 있습니다. 그런 다음 조건부 액세스 정책에 따라 Azure Core Management 토큰으로 전환하고 AzureHound를 실행할 수 있습니다. 그런 다음 Outlook 액세스 토큰을 얻어 이메일을 읽거나 보내거나, MS Teams 액세스 토큰을 얻어 Teams 메시지를 읽거나 보낼 수 있습니다!
Azure 토큰 유형에 대한 자세한 내용은 Microsoft ID 플랫폼 액세스 토큰을 참조하세요.
리소스 폴더에는 엔드포인트에 대한 예시 요청이 몇 개 있습니다. 또한 디바이스 코드 피싱을 위한 예시 피싱 템플릿도 있습니다.
이러한 토큰을 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 쿠키만 가져오며, Get-EntraIDTokenFromESTSCookie를 사용하여 이 쿠키를 베어러 토큰(액세스 토큰, 갱신 토큰 및 ID 토큰)으로 교환해야 합니다.
# ESTSAUTH 쿠키 값 검색
Invoke-EntraIDPasskeyLogin -Verbose -KeyFilePath "C:\Users\Fabian\Microsoft.passkey"
# 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
security.microsoft.com에 대한 인증된 세션(예: Evilginx 또는 브라우저 DevTools를 통해)에서 sccauth 쿠키를 획득한 경우, Microsoft Defender XDR 포털을 통해 다양한 리소스에 대한 Entra ID 액세스 토큰을 검색하는 데 사용할 수 있습니다.
# sccauth 쿠키를 사용하여 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) 쿠키에서 액세스 토큰과 갱신 토큰을 얻습니다. Evilginx를 통해 세션을 피싱했거나 다른 방법으로 이 쿠키를 획득한 경우 유용합니다.
올바른 쿠키를 사용해야 합니다! ESTSAuthPersistent는 CA 정책이 실제로 영구 세션을 부여하는 경우에만 유용합니다. 그렇지 않으면 ESTSAuth를 사용해야 합니다. 일반적으로 길이를 기준으로 어느 것을 사용할지 알 수 있습니다. 더 긴 쿠키가 사용하려는 쿠키입니다 :)
참고: 일부 경우 사용자 상호 작용이 필요할 수 있으므로 항상 작동하지 않을 수 있습니다. 이런 경우 위의 디바이스 코드 흐름을 사용하거나 roadtx interactiveauth --estscookie를 시도하세요.
이 기능은 원래 저장소의 rotarydrone이 pull request에서 백포트했습니다.
이 oauth2 흐름의 가장 대표적인 예시(적어도 2025년 초 기준) 중 하나는 Intune 회사 포털로, 일부 리소스에 대해 디바이스 준수 요구 사항을 우회할 수 있습니다.
이 정보는 @dirkjan이 처음 공개했으며, 이후 Black Hat Europe에서 @TEMP43487580이 더 넓은 청중에게 공개했습니다.
JumpsecLabs는 블로그 게시물과 TokenSmith 형태의 POC를 얼마 지나지 않아 게시했습니다.
이제 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
연속 액세스 평가를 통해 Microsoft는 추가 보안 조치를 구현하면서도 액세스 토큰의 최대 수명을 24시간으로 연장합니다. MSGraph, Exchange, Teams 및 SharePoint와 같은 특정 CAE 지원 서비스는 Azure AD에서 트리거된 특정 이벤트를 기반으로 액세스 토큰을 차단할 수 있습니다. 현재 이러한 중요 이벤트는 다음과 같습니다.
Invoke-RefreshToMSGraphToken -Domain "myclient.org" -UseCAE
if ((Parse-JWTtoken $MSGraphToken.access_token).ValidForHours -gt 23) { "MSGraph token is CAE capable" }
AADInternals도 설치되어 있는 경우 생성된 액세스 토큰을 사용할 수 있습니다.
Invoke-RefreshToMSTeamsToken -UseCAE -Domain "myclient.org"
Set-AADIntTeamsStatusMessage -Message "My cool status 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 쿠키를 사용하여 다양한 리소스(Azure, MicrosoftGraph, MATP, MCAS, Purview 등)에 대한 Entra ID 액세스 토큰 검색. 선택적으로 XSRF 토큰 허용. 생략 시 자동으로 부트스트랩. 헤더 주입 및 PurviewACC 리소스 생성을 위한 선택적 TenantId 매개변수 지원.Get-Azure cmdlet 이름을 Get-EntraID로 변경Invoke-EntraIDPasskeyLogin 추가. Get-EntraIDTokenFromESTSCookie와 같은 다른 cmdlet에서 재사용할 수 있도록 ESTSAUTH 쿠키 및 웹 세션을 전역 변수로 저장Invoke-EntraIDPasskeyLogin, Get-EntraIDTokenFromCookie, Get-EntraIDTokenFromRefreshTokenCredentialCookie 및 Get-EntraIDTokenFromESTSCookie에 프록시 지원 추가Get-AzureAuthorizationCode cmdlet에 login_hint 매개변수를 미리 채우기 위한 -Username 매개변수 추가Get-AzureAuthorizationCode cmdlet에 -CopyToClipboard 매개변수 추가Foreach-Object -parallel에서 실행될 때) 출력 최소화-CustomUserAgent 속성을 사용하여 UserAgent를 자유롭게 정의할 수 있는 기능 추가. Pri3st에게 감사드립니다.Get-EntraIDToken에 ResourceTenant 추가UseCodeVerifier 추가UseV1Endpoint 추가Get-AzureTokenFromRefreshTokenCredentialCookie("x-ms-RefreshTokenCredential") 추가 및 모듈화된 Get-AzureTokenFromCookie 추가Get-AzureTokenFromESTSCookie에 쿠키 유형(ESTSAuth, ESTSAUTHPERSISTENT)을 선택하는 매개변수 추가Get-AzureTokenFromAuthorizationCode에 대한 샘플 출력을 Get-AzureAuthorizationCode 출력에 추가Get-AzureTokenFromESTSCookie가 appverify 엔드포인트를 지원하도록 확장Get-AzureTokenFromESTSCookie의 쿠키 관리 개선Get-AzureAuthorizationCode 및 Get-AzureTokenFromAuthorizationCode의 사용자 지정 범위 버그 수정Get-AzureAuthorizationCode의 기본 리디렉션 URI 변경Get-AzureAuthorizationCode 및 Get-AzureTokenFromAuthorizationCode 추가 Get-AccessTokenForAADJoin인 Invoke-RefreshToDeviceRegistrationToken 새 cmdlet 추가Invoke-RefreshToToken에 UseV1Endpoint와 함께 v1 엔드포인트 지원 추가. Invoke-RefreshToDeviceRegistrationToken을 추가하는 데 필요했습니다.ConvertFrom-JWTtoken에 파이프라인 지원 추가Get-ForgedUserAgent에 기본값 추가v2.0으로 전환-UseCAE 스위치를 사용한 연속 액세스 평가 지원ClientId를 매개변수로 만듦client_id 변경ConvertFrom-JWTtoken 출력에 IssuedAt, NotBefore, ExpirationDate 및 ValidForHours 추가