Az - Pass the PRT
Co to jest PRT
Az - Primary Refresh Token (PRT)Sprawdź, czy masz PRT
W sekcji SSO State powinieneś zobaczyć, że AzureAdPrt
jest ustawione na YES.
W tym samym wyniku możesz również zobaczyć, czy urządzenie jest połączone z Azure (w polu AzureAdJoined
):
PRT Cookie
PRT cookie jest faktycznie nazywane x-ms-RefreshTokenCredential
i jest to JSON Web Token (JWT). JWT zawiera 3 części, header, payload i signature, podzielone przez .
i wszystkie zakodowane w url-safe base64. Typowe PRT cookie zawiera następujący header i body:
Faktyczny Primary Refresh Token (PRT) jest zawarty w refresh_token
, który jest zaszyfrowany kluczem kontrolowanym przez Azure AD, co sprawia, że jego zawartość jest dla nas nieprzejrzysta i niemożliwa do odszyfrowania. Pole is_primary
oznacza, że główny token odświeżania jest zawarty w tym tokenie. Aby upewnić się, że ciasteczko pozostaje powiązane z konkretną sesją logowania, dla której było przeznaczone, request_nonce
jest przesyłany ze strony logon.microsoftonline.com
.
Przepływ ciasteczka PRT z użyciem TPM
Proces LSASS wyśle do TPM kontekst KDF, a TPM użyje klucza sesji (uzyskanego podczas rejestracji urządzenia w AzureAD i przechowywanego w TPM) oraz poprzedniego kontekstu do wyprowadzenia klucza, a ten wyprowadzony 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 PRT nie może być wyodrębniony, ponieważ znajduje się wewnątrz TPM, możliwe jest nadużycie LSASS do żądania wyprowadzonych kluczy z nowych kontekstów i używania wygenerowanych kluczy do podpisywania ciasteczek.
Scenariusze nadużycia PRT
Jako zwykły użytkownik możliwe jest żądanie użycia PRT poprzez poproszenie LSASS o dane SSO. Można to zrobić jak aplikacje natywne, które żądają tokenów od Web Account Manager (broker tokenów). WAM przekazuje żądanie do LSASS, który żąda tokenów używając podpisanego PRT assertion. Można to również 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żesz ukraść PRT, jeśli nie jest chroniony przez TPM lub interagować z kluczami PRT w LSASS używając API kryptograficznych.
Przykłady ataków Pass-the-PRT
Atak - ROADtoken
Więcej informacji na ten temat znajdziesz w tym poście. ROADtoken uruchomi BrowserCore.exe
z odpowiedniego katalogu i użyje go do uzyskania ciasteczka PRT. To ciasteczko może być następnie użyte z ROADtools do uwierzytelnienia i uzyskania trwałego tokena odświeżania.
Aby wygenerować ważne ciasteczko PRT, pierwszą rzeczą, której potrzebujesz, jest nonce. Możesz to uzyskać za pomocą:
Lub używając roadrecon:
Następnie możesz użyć roadtoken, aby uzyskać nowy PRT (uruchom w narzędziu z procesu użytkownika do ataku):
Jako oneliner:
Następnie możesz użyć wygenerowanego pliku cookie do generowania tokenów w celu logowania za pomocą Azure AD Graph lub Microsoft Graph:
Attack - Using roadrecon
Attack - Using AADInternals and a leaked PRT
Get-AADIntUserPRTToken
pobiera token PRT użytkownika z komputera dołączonego do Azure AD lub Hybrid. Używa BrowserCore.exe
do pobrania tokenu PRT.
Albo jeśli masz wartości z Mimikatz, możesz również użyć AADInternals do wygenerowania tokena:
Idź do https://login.microsoftonline.com, wyczyść wszystkie ciasteczka dla login.microsoftonline.com i wprowadź nowe ciasteczko.
Następnie przejdź do https://portal.azure.com
Reszta powinna być domyślna. Upewnij się, że możesz odświeżyć stronę i ciasteczko nie zniknie, jeśli tak się stanie, mogłeś popełnić błąd i musisz przejść przez proces ponownie. Jeśli nie, powinno być dobrze.
Atak - Mimikatz
Kroki
PRT (Primary Refresh Token) jest wyodrębniany z LSASS (Local Security Authority Subsystem Service) i przechowywany do późniejszego użycia.
Następnie wyodrębniany jest klucz sesji. Ponieważ ten klucz jest początkowo wydawany, a następnie ponownie szyfrowany przez lokalne urządzenie, wymaga odszyfrowania za pomocą klucza głównego DPAPI. Szczegółowe informacje na temat DPAPI (Data Protection API) można znaleźć w tych zasobach: HackTricks, a aby zrozumieć jego zastosowanie, odnieś się do Pass-the-cookie attack.
Po odszyfrowaniu klucza sesji, uzyskiwany jest klucz pochodny i kontekst dla PRT. Są one kluczowe dla utworzenia ciasteczka PRT. Konkretnie, klucz pochodny jest używany do podpisania JWT (JSON Web Token), który stanowi ciasteczko. Szczegółowe wyjaśnienie tego procesu zostało przedstawione przez Dirk-jan, 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że, możliwe będzie uzyskanie klucza z klucza pochodnego z kontekstu z TPM i użycie go do podpisania ciasteczka (sprawdź opcję 3).
Możesz znaleźć szczegółowe wyjaśnienie przeprowadzonego procesu wyodrębniania tych szczegółów tutaj: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
To nie zadziała dokładnie po poprawkach z sierpnia 2021, aby uzyskać tokeny PRT innych użytkowników, ponieważ tylko użytkownik może uzyskać swój PRT (lokalny administrator nie może uzyskać dostępu do PRT innych użytkowników), ale może uzyskać dostęp do swojego.
Możesz użyć mimikatz do wyodrębnienia PRT:
(Images from https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)
Skopiuj część oznaczoną jako Prt i zapisz ją.
Wyodrębnij również klucz sesji (wartość KeyValue
pola ProofOfPossesionKey
), który jest podświetlony poniżej. Jest on zaszyfrowany i będziemy musieli użyć naszych kluczy głównych DPAPI, aby go odszyfrować.
Jeśli nie widzisz żadnych danych PRT, może to oznaczać, że nie masz żadnych PRT, ponieważ Twoje urządzenie nie jest połączone z Azure AD lub używasz starej wersji Windows 10.
Aby odszyfrować klucz sesji, musisz podnieść swoje uprawnienia do poziomu SYSTEM, aby działać w kontekście komputera i móc użyć klucza głównego DPAPI do jego odszyfrowania. Możesz użyć następujących poleceń, aby to zrobić:
Opcja 1 - Pełny Mimikatz
Teraz chcesz skopiować zarówno wartość Context:
Jak i wartość derived key:
Na koniec możesz użyć wszystkich tych informacji, aby wygenerować ciasteczka PRT:
Przejdź do https://login.microsoftonline.com, wyczyść wszystkie pliki cookie dla login.microsoftonline.com i wprowadź nowy plik cookie.
Następnie przejdź do https://portal.azure.com
Reszta powinna być domyślna. Upewnij się, że możesz odświeżyć stronę i ciasteczko nie znika, jeśli znika, mogłeś popełnić błąd i musisz przejść przez proces ponownie. Jeśli nie znika, powinno być dobrze.
Opcja 2 - roadrecon używając PRT
Najpierw odnow PRT, co zapisze go w
roadtx.prt
:
Teraz możemy żądać tokenów używając interaktywnej przeglądarki z
roadtx browserprtauth
. Jeśli użyjemy poleceniaroadtx describe
, zobaczymy, że token dostępu zawiera roszczenie MFA, ponieważ PRT, którego użyłem w tym przypadku, również miał roszczenie MFA.
Opcja 3 - roadrecon używając kluczy pochodnych
Mając kontekst i klucz pochodny zrzutowany przez mimikatz, możliwe jest użycie roadrecon do wygenerowania nowego podpisanego ciasteczka za pomocą:
Referencje
Last updated