Az - Pass the PRT
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
W sekcji Stanu SSO powinieneś zobaczyć AzureAdPrt
ustawione na TAK.
W tym samym wyniku możesz również zobaczyć, czy urządzenie jest dołączone do Azure (w polu AzureAdJoined
):
Ciasteczko PRT nazywa się właściwie x-ms-RefreshTokenCredential
i jest to JSON Web Token (JWT). JWT zawiera 3 części, nagłówek, ładunek i podpis, podzielone przez .
i wszystkie zakodowane w bezpiecznym dla URL base64. Typowe ciasteczko PRT zawiera następujący nagłówek i ciało:
Aktualny Primary Refresh Token (PRT) jest enkapsulowany w refresh_token
, który jest szyfrowany kluczem kontrolowanym przez Azure AD, co sprawia, że jego zawartość jest dla nas nieprzezroczysta i nie do odszyfrowania. Pole is_primary
oznacza enkapsulację głównego tokena odświeżania w tym tokenie. Aby zapewnić, że ciasteczko pozostaje związane z konkretną sesją logowania, request_nonce
jest przesyłany z strony logon.microsoftonline.com
.
Proces LSASS wyśle do TPM KDF context, a TPM użyje session key (zgromadzonego podczas rejestracji urządzenia w AzureAD i przechowywanego w TPM) oraz poprzedniego kontekstu, aby wyprowadzić klucz, a ten wyprowadzony klucz jest używany do podpisania ciasteczka PRT (JWT).
KDF context 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życia wygenerowanych kluczy do podpisywania ciasteczek.
Jako zwykły użytkownik możliwe jest żądanie użycia PRT poprzez zapytanie 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óre prosi o tokeny używając podpisanej asercji PRT. Można to również zrobić za pomocą przepływów opartych na przeglądarkach (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.
Aby uzyskać więcej informacji na ten temat sprawdź ten post. 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 narzędzie z procesu użytkownika, którego chcesz zaatakować):
Jako jednolinijkowiec:
Następnie możesz użyć wygenerowanego ciasteczka do generowania tokenów do logowania za pomocą Azure AD Graph lub Microsoft Graph:
Get-AADIntUserPRTToken
pobiera token PRT użytkownika z komputera dołączonego do Azure AD lub dołączonego w trybie hybrydowym. Używa BrowserCore.exe
, aby uzyskać token PRT.
Lub jeśli masz wartości z Mimikatz, możesz również użyć AADInternals do wygenerowania tokena:
Przejdź 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ślnymi ustawieniami. Upewnij się, że możesz odświeżyć stronę i ciasteczko nie znika; jeśli tak, mogłeś popełnić błąd i musisz przejść przez proces ponownie. Jeśli nie znika, powinno być w porządku.
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, zapoznaj się z atakiem Pass-the-cookie.
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óre stanowi ciasteczko. Szczegółowe wyjaśnienie tego procesu zostało przedstawione przez Dirka-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 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 roku, aby uzyskać tokeny PRT innych użytkowników, ponieważ tylko użytkownik może uzyskać swój PRT (lokalny administrator nie może uzyskać PRT innych użytkowników), ale może uzyskać swój.
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 (KeyValue
pola ProofOfPossesionKey
), który możesz zobaczyć wyróżniony 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 dołączone do Azure AD lub możesz uruchamiać starą wersję systemu Windows 10.
Aby odszyfrować klucz sesji, musisz podnieść swoje uprawnienia do SYSTEM, aby działać w kontekście komputera i móc użyć klucza głównego DPAPI do odszyfrowania go. Możesz użyć następujących poleceń, aby to zrobić:
Teraz chcesz skopiować zarówno wartość Context:
Jak i wartość klucza pochodnego:
Na koniec możesz użyć wszystkich tych informacji do generowania ciasteczek PRT:
Przejdź do https://login.microsoftonline.com, wyczyść wszystkie pliki cookie dla login.microsoftonline.com i wprowadź nowe ciasteczko.
Następnie przejdź do https://portal.azure.com
Reszta powinna być domyślnymi ustawieniami. Upewnij się, że możesz odświeżyć stronę i ciasteczko nie znika; jeśli tak, mogłeś popełnić błąd i musisz przejść przez proces ponownie. Jeśli nie znika, powinno być w porządku.
Najpierw odnowić PRT, co zapisze go w roadtx.prt
:
Teraz możemy zażądać tokenów za pomocą interaktywnej przeglądarki z roadtx browserprtauth
. Jeśli użyjemy polecenia roadtx describe
, zobaczymy, że token dostępu zawiera roszczenie MFA, ponieważ PRT, którego użyłem w tym przypadku, również miało roszczenie MFA.
Mając kontekst i klucz pochodny zrzutowany przez mimikatz, możliwe jest użycie roadrecon do wygenerowania nowego podpisanego ciasteczka z:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)