Az - Pass the PRT
Last updated
Last updated
PRT çerezi aslında x-ms-RefreshTokenCredential
olarak adlandırılır ve bir JSON Web Token (JWT) içerir. Bir JWT 3 bölümden oluşur, başlık, içerik ve imza, .
ile ayrılmış ve tümü url-güvenli base64 kodlanmıştır. Tipik bir PRT çerezi aşağıdaki başlık ve gövdeyi içerir:
Gerçek Primary Refresh Token (PRT), içinde bulunduğumuz refresh_token
içinde kapsüllenir ve Azure AD'nin kontrolü altındaki bir anahtar tarafından şifrelenir, bu da içeriğini bizim için opak ve şifresiz hale getirir. is_primary
alanı, bu belirtecin içindeki birincil yenileme belirtecini kapsüllediğini belirtir. Çerezin belirli bir giriş oturumuna bağlı kalmasını sağlamak için request_nonce
, logon.microsoftonline.com
sayfasından iletilir.
LSASS işlemi, KDF bağlamını TPM'ye gönderecek ve TPM, oturum anahtarı (cihaz AzureAD'ye kaydedildiğinde toplanan ve TPM'de saklanan) ve önceki bağlamı türetmek için kullanacak ve bu türetilmiş anahtar PRT çerezini (JWT) imzalamak için kullanılacaktır.
KDF bağlamı, AzureAD'den gelen bir nonce ve JWT oluşturan PRT ile bir bağlam (rastgele baytlar) karışımıdır.
Bu nedenle, PRT TPM içinde bulunduğu için çıkarılamazsa da, LSASS'ı yeni bağlamlardan türetilmiş anahtarlar istemek ve oluşturulan anahtarları kullanarak Çerezleri imzalamak için kötüye kullanmak mümkündür.
Normal bir kullanıcı olarak, LSASS'ten SSO verilerini isteyerek PRT kullanımını talep etmek mümkündür. Bu, Web Hesap Yöneticisi'nden (token aracısı) belirteç isteyen yerel uygulamalar gibi yapılabilir. WAM, isteği LSASS'a ileterek, imzalı PRT iddiasını kullanarak belirteç istemektedir. Veya tarayıcı tabanlı (web) akışlar ile yapılabilir, burada bir PRT çerezi, Azure AS giriş sayfalarına yapılan istekleri kimlik doğrulamak için başlık olarak kullanılır.
SYSTEM olarak, PRT'nin TPM tarafından korunmadığı durumlarda PRT'yi çalabilir veya kripto API'leri kullanarak LSASS'ta PRT anahtarlarıyla etkileşimde bulunabilirsiniz.
Bu yöntem hakkında daha fazla bilgi için bu gönderiyi kontrol edin. ROADtoken, doğru dizinden BrowserCore.exe
'yi çalıştıracak ve bir PRT çerezi elde etmek için kullanacaktır. Bu çerez daha sonra ROADtools ile kimlik doğrulamak ve kalıcı bir yenileme belirteci almak için kullanılabilir.
Geçerli bir PRT çerezi oluşturmak için ihtiyacınız olan ilk şey bir nonce'dir. Bunu alabilirsiniz:
Veya roadrecon kullanarak:
Ardından yeni bir PRT almak için roadtoken kullanabilirsiniz (kullanıcı sürecinden araçta çalıştırın):
Ardından oluşturulan çerezi kullanarak Azure AD Graph veya Microsoft Graph kullanarak giriş yapmak için tokenlar oluşturabilirsiniz:
Get-AADIntUserPRTToken
, Azure AD'ye katılmış veya Hibrit katılmış bilgisayardan kullanıcının PRT belirtecini alır. PRT belirtecini almak için BrowserCore.exe
kullanır.
Ya da Mimikatz'dan değerlere sahipseniz, AADInternals'ı kullanarak bir belirteç oluşturabilirsiniz:
https://login.microsoftonline.com adresine gidin, login.microsoftonline.com için tüm çerezleri temizleyin ve yeni bir çerez girin.
Sonra https://portal.azure.com adresine gidin.
Gerisi varsayılan olmalıdır. Sayfayı yenileyebilmeli ve çerezin kaybolmadığından emin olmalısınız, eğer kaybolursa hata yapmış olabilirsiniz ve işlemi tekrar yapmanız gerekebilir. Eğer kaybolmazsa, sorun yok demektir.
PRT (Primary Refresh Token), LSASS (Local Security Authority Subsystem Service) 'dan çıkarılır ve sonraki kullanımlar için saklanır.
Oturum Anahtarı ardından çıkarılır. Bu anahtarın başlangıçta verildiği ve ardından yerel cihaz tarafından yeniden şifrelendiği göz önüne alındığında, bir DPAPI anahtarını kullanarak şifre çözme gerektirir. DPAPI (Data Protection API) hakkında detaylı bilgiyi şu kaynaklarda bulabilirsiniz: HackTricks ve uygulamasını anlamak için Çerez Geçirme saldırısına başvurun.
Oturum Anahtarı'nın şifre çözülmesinden sonra, türetilmiş anahtar ve PRT için bağlam elde edilir. Bunlar, PRT çerezi oluşturmak için hayati öneme sahiptir. Özellikle, türetilmiş anahtar, çerezi oluşturan JWT'yi (JSON Web Token) imzalamak için kullanılır. Bu sürecin kapsamlı bir açıklaması Dirk-jan tarafından sağlanmış olup buradan erişilebilir.
PRT TPM içindeyse ve lsass
içinde değilse, mimikatz onu çıkaramaz.
Ancak, TPM'den bir türetilmiş anahtar ve bağlam almak ve bunu kullanarak bir çerez imzalamak mümkün olacaktır (seçenek 3'ü kontrol edin).
Bu ayrıntıları çıkarmak için yapılan sürecin detaylı açıklamasını burada bulabilirsiniz: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
Bu, Ağustos 2021 sonrası düzeltmelerden sonra diğer kullanıcıların PRT tokenlerini almak için tam olarak çalışmayacak, çünkü yalnızca kullanıcı kendi PRT'sini alabilir (yerel bir yönetici diğer kullanıcıların PRT'lerine erişemez), ancak kendi PRT'sine erişebilir.
PRT'yi çıkarmak için mimikatz kullanabilirsiniz:
(Resimler https://blog.netwrix.com/2023/05/13/pass-the-prt-overview adresinden alınmıştır)
Prt olarak etiketlenen kısmı kopyalayın ve kaydedin.
Ayrıca aşağıda vurgulanan ProofOfPossesionKey
alanının KeyValue
değerini de çıkarın. Bu değer şifrelenmiştir ve bunu çözmek için DPAPI anahtarlarımızı kullanmamız gerekecek.
Eğer PRT verilerini görmüyorsanız, cihazınızın Azure AD'ye katılmadığı veya Windows 10'un eski bir sürümünü çalıştırdığınız olabilir.
Oturum açma anahtarını çözmek için yetkilerinizi yükseltmeniz ve DPAPI anahtarını kullanarak çözmek için bilgisayar bağlamında SİSTEM olarak çalışmanız gerekmektedir. Bunun için aşağıdaki komutları kullanabilirsiniz:
Şimdi hem Bağlam değerini kopyalamak istiyorsunuz:
Hem de türetilmiş anahtar değerini:
Son olarak, tüm bu bilgileri kullanarak PRT çerezleri oluşturabilirsiniz:
https://login.microsoftonline.com adresine gidin, login.microsoftonline.com için tüm çerezleri temizleyin ve yeni bir çerez girin.
Ardından https://portal.azure.com adresine gidin.
Gerisi varsayılan olmalı. Sayfayı yenileyebilmelisiniz ve çerezin kaybolmamasını sağlamalısınız, eğer kaybolursa bir hata yapmış olabilirsiniz ve işlemi tekrar yapmanız gerekebilir. Eğer kaybolmazsa, sorun yok demektir.
İlk olarak PRT'yi yenileyin, bu da onu roadtx.prt
dosyasına kaydedecektir:
Şimdi etkileşimli tarayıcı kullanarak token isteyebiliriz roadtx browserprtauth
. roadtx describe
komutunu kullandığımızda, erişim token'ının bir MFA iddiası içerdiğini görüyoruz çünkü bu durumda kullandığım PRT'nin de bir MFA iddiası vardı.
Mimikatz tarafından dökülen bağlam ve türetilmiş anahtarı kullanarak roadrecon'u kullanarak yeni imzalı çerez oluşturmak mümkündür: