En esta publicación descubriremos como extraer credenciales encriptadas con DPAPI, una vez las hayamos encontrados en un escaneo manual o automatizado en sistemas operativos Windows visto desde la perspectiva de un atacante. No nos enfocamos en el levantamiento y configuración de laboratorio (posible update a este post).
Para empezar DPAPI (DATA PROTECTION API) es una característica de Windows, un sistema interno que utiliza para facilitar el encriptado simétrico de llaves asimétricas con un secreto que usualmente es la contraseña del usuario o en casos de sistema un "secreto" del dominio, de algunas aplicaciones de Microsoft, esto nos hace entender que es una capa de protección que se les da a las credenciales.
Cuando DPAPI ha encriptado una credencial/blob/data con una clave RSA, crea una ruta dentro del perfil del usuario localizado en: %APPDATA%\Microsoft\Protect\{SID}, en donde SID es Security Identifier.
1En estas rutas se almacen suelen almacenar las credenciales:2Get-ChildItem -Force C:\Users\USER\AppData\Roaming\Microsoft\Credentials\3Get-ChildItem -Force C:\Users\USER\AppData\Local\Microsoft\Credentials\45En esta ruta las masterkeys:6Get-ChildItem -Force $env:APPDATA\Microsoft\Protect\$env:USERNAME7
Lo que se encuentra directamente en las materkeys realmente es un identificador, un nombre que se le pone a la masterkey llamada guidmasterkey para registrarla.
Es importante reconocer estas rutas ya que podemos encontrarnos con diferentes tipos de blobs encriptados que a veces no contienen información interesante y además debemos de vincular cada masterkey de la ruta /Protect/ con cada credencial en la ruta /Credential/. Se debe de encontrar con qué Masterkey está asociada una credencial.
No llegues a pensar que solamente se puede utilizar estas DPAPI's para hacer un CTF, realmente se utilizan en varios aspectos dentro de un entorno real.
Teniendo estas dos rutas localizadas y como hemos visto anteriormente, primero debemos mapear cuales son las masterkeys asociadas a que credencial, para esto podemos utilizar mimikatz, la herramienta apropiada para hacer esto.
1.\mimikatz.exe "dpapi::cred /in:C:\Users\USER\AppData\Roaming\Microsoft\Credentials\{CRED}" exit| findstr "guidMasterKey"
Esto nos ayudará a relacionarlos, para continuar debemos ahora también con mimikatz, desencriptar la masterkey.
1.\mimikatz.exe "dpapi::masterkey /in:C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID}\{guidMasterKey} /rpc" exit
Tambien se puede utilizar /pvk
Este comando nos dará la llave que necesitaremos para poder extraer la información dentro de la credencial.
Ahora procederemos a desencriptar la credencial con la respectiva masterkey, habrá casos especiales en el cual la contraseña no está cacheada y tenemos que especificar /sid, /password, /protect, etc. Se sugiere leer el manual de MimiKatz.
1.\mimikatz.exe "dpapi::cred /in:C:\Users\USER\AppData\Roaming\Microsoft\Protect\{CRED /masterkey:{key_extraida}"
Es posible que no podamos encontrar nada util.
Cuando somos administradores del sistema podemos utilizar esto para dumpear con mimikatz tambien absolutamente todas las credenciales almacenadas en DPAPI, se puede obtener como hemos dichos contraseñas WIFI (que son las mas comunes que se encuentran).
Léase tambien otras herramientas que pueden automatizar este proceso, sin embargo es bueno entender como funciona todo por detrás igualmente:
Tags: dpapi dumping, dpapi htb, dpapi exploit, dpapi vulnerabilite, exploit dpapi, dpapi dump, dpapi crendential, dpapi pentest, dpapi red team, dpapi windows extract, dpapi what is.