DPAPI offline takeover (Active Directory)

Vorrei condividere con gli utenti del forum questa esperienza maturata nel tentativo di recupero delle password salvate nel browser chrome di un Cliente (client joinato in AD) a seguito dell’impossibilità di avvio del sistema operativo.
Tale richiesta ha richiesto non poco tempo da parte mia visto che non avevo esperienza in tal senso: per questo ho voluto condividere gli step necessari per risolvere la problematica.
Su os Microsoft la gestione del password manager integrato in chrome passa attraverso le “Windows Data Protection API”.
Per evitare di entrare nei tecnicismi e crare un post enorme segnalo un’ottima risorsa online che spiega molto bene il funzionamento della API: https://www.exploit-db.com/docs/48589.

Entrando nel merito della procedura, macroscopicamente dobbiamo eseguire i seguenti step:

  • recupero della master key dalla macchina target
  • recupero del db dalla macchina target
  • recupero della backup key da un domain controller
  • decifratura della master key del target
  • craft di una nuova master key associata ad altro utente su altro host

Per quanto riguarda il primo punto, la chiave si trova in “C:\Users<TARGETUSER>\AppData\Roaming\Microsoft\Protect<SSID><GUID>” e si può recuperare (ad esempio da console di ripristino) con un xcopy su dispositivo esterno (xcopy /h /s /e C:\Users\<TARGETUSER>\AppData\Roaming\Microsoft\Protect\<SSID>\<GUID> .)

I file di chrome necessari sono invece: “C:\Users<TARGETUSER>\AppData\Local\Google\Chrome\User Data\Default\Login Data” (DB delle password, sqlite) e “C:\Users<TARGETUSER>\AppData\Local\Google\Chrome\User Data\Local State” (contiene la encrypted key)

Per il recupero della backup key dal domain controller, che permette di decifrare ogni key degli utenti AD(conservare / cancellare con cura!), ho optato per l’utilizzo dei moduli DSInternals, dal momento che funzionano anche sulle implementazioni AD Samba (mio caso). A titolo informativo i comandi utilizzati sono i seguenti:

  • Install-Module DSInternals -RequiredVersion 4.3
  • Import-Module DSInternals
  • Get-ADReplBackupKey -Domain domain.tld -Server dc01.domain.tld | Save-DPAPIBlob -DirectoryPath .\keys

In questo modo otteniamo, nella cartella keys, il file della backup private key (.pvk)

Decifriamo la chiave con mimikatz, su altro host:
dpapi::masterkey /in:<GUID> /pvk:"keys\ntds_<...>.pvk"
# key : f7<...>1e

e creiamo, sempre con mimikatz, una nuova master key su tale host, legata all’utente locale:
dpapi::create /guid:{<GUID>} /key:f7<...>1e /password:<LOCALUSERPASSWORD> /protected
copiandola, successivamente, nella directory corretta:
xcopy /H <GUID> C:\Users\<LOCALUSER>\AppData\Roaming\Microsoft\Protect\<LOCALSSID>\

A questo punto abbiamo tutti gli elementi per decifrare qualunque segreto DPAPI dell’utente, comprese le password di chrome (e i cookies). Per le password è sufficiente copiare i due files prelevati al punto 2 nelle corrette directory dell’host e aprire chrome!

Lesson learned: non fidarsi troppo del DPAPI, specialmente su sistemi in dominio; massimizzare la sicurezza dei domain controller (compresi i loro backup!); privilegiare l’utilizzo di password manager che richiedano l’inserimento manuale della master key in fase di autofill.

4 Likes

WOW … davverro interessante, mi piacciono un sacco questi real cases !!!

Complimenti anche per l’esposizione Problema, Soluzione, Tips&Tricks :muscle:

Visto che apprezzi i real cases…
Questo è lo script che ho sempre utilizzato per il recupero delle password dagli account Outlook dei Clienti smemorati:

$key_path = 'HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\outlook\93<...>76\0000000b\'
$reg = (Get-ItemProperty -Path $key_path)."IMAP Password"
$hex = for($i=1; $i -lt $reg.Length; $i++) { '{0:x2}' -f ($reg[$i]) }
$enc_pwd = $hex -join ""
$PasswordSecureString = ConvertTo-SecureString $enc_pwd
$PlainTextPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PasswordSecureString))
$PlainTextPasswor

Dal momento che la cifratura sfrutta la stessa API, probabilmente si riesce a replicare offline anche questo ripristino.

2 Likes

Grazie per la condivisione, use case che potrebbe essere utile anche ad altre persone. :+1: