AD CS Certificate Theft

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Red Team de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Este es un pequeño resumen de los capítulos de Robo del increíble estudio de https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf

¿Qué puedo hacer con un certificado?

Antes de verificar cómo robar los certificados, aquí tienes información sobre para qué se puede utilizar el certificado:

# Powershell
$CertPath = "C:\path\to\cert.pfx"
$CertPass = "P@ssw0rd"
$Cert = New-Object
System.Security.Cryptography.X509Certificates.X509Certificate2 @($CertPath, $CertPass)
$Cert.EnhancedKeyUsageList

# cmd
certutil.exe -dump -v cert.pfx

Exportando Certificados Utilizando las APIs de Criptografía – ROBO1

En una sesión de escritorio interactiva, extraer un certificado de usuario o de máquina, junto con la clave privada, puede hacerse fácilmente, especialmente si la clave privada es exportable. Esto se puede lograr navegando hasta el certificado en certmgr.msc, haciendo clic derecho sobre él y seleccionando Todas las tareas → Exportar para generar un archivo .pfx protegido por contraseña.

Para un enfoque programático, herramientas como el cmdlet PowerShell ExportPfxCertificate o proyectos como el proyecto CertStealer de C# de TheWover están disponibles. Estos utilizan la API de Criptografía de Microsoft (CAPI) o la API de Criptografía: Generación Siguiente (CNG) para interactuar con el almacén de certificados. Estas APIs proporcionan una variedad de servicios criptográficos, incluidos los necesarios para el almacenamiento y autenticación de certificados.

Sin embargo, si una clave privada está configurada como no exportable, tanto CAPI como CNG normalmente bloquearán la extracción de dichos certificados. Para evitar esta restricción, se pueden emplear herramientas como Mimikatz. Mimikatz ofrece los comandos crypto::capi y crypto::cng para parchear las respectivas APIs, permitiendo la exportación de claves privadas. Específicamente, crypto::capi parchea el CAPI dentro del proceso actual, mientras que crypto::cng apunta a la memoria de lsass.exe para parchear.

Robo de Certificado de Usuario a través de DPAPI – ROBO2

Más información sobre DPAPI en:

pageDPAPI - Extracting Passwords

En Windows, las claves privadas de los certificados están protegidas por DPAPI. Es crucial reconocer que las ubicaciones de almacenamiento de las claves privadas de usuario y máquina son distintas, y las estructuras de archivos varían dependiendo de la API criptográfica utilizada por el sistema operativo. SharpDPAPI es una herramienta que puede navegar automáticamente estas diferencias al descifrar los bloques de DPAPI.

Los certificados de usuario se encuentran principalmente en el registro bajo HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates, pero algunos también se pueden encontrar en el directorio %APPDATA%\Microsoft\SystemCertificates\My\Certificates. Las claves privadas correspondientes a estos certificados generalmente se almacenan en %APPDATA%\Microsoft\Crypto\RSA\User SID\ para claves de CAPI y %APPDATA%\Microsoft\Crypto\Keys\ para claves de CNG.

Para extraer un certificado y su clave privada asociada, el proceso implica:

  1. Seleccionar el certificado objetivo del almacén del usuario y recuperar el nombre del almacén de claves.

  2. Localizar la clave maestra DPAPI requerida para descifrar la clave privada correspondiente.

  3. Descifrar la clave privada utilizando la clave maestra DPAPI en texto plano.

Para adquirir la clave maestra DPAPI en texto plano, se pueden utilizar los siguientes enfoques:

# With mimikatz, when running in the user's context
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc

# With mimikatz, if the user's password is known
dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS

Para agilizar la descifrado de archivos de clave maestra y archivos de clave privada, el comando certificates de SharpDPAPI resulta beneficioso. Acepta /pvk, /mkfile, /password o {GUID}:KEY como argumentos para descifrar las claves privadas y certificados vinculados, generando posteriormente un archivo .pem.

# Decrypting using SharpDPAPI
SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt

# Converting .pem to .pfx
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

Robo de Certificado de Máquina a través de DPAPI – THEFT3

Los certificados de máquina almacenados por Windows en el registro en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates y las claves privadas asociadas ubicadas en %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys (para CAPI) y %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys (para CNG) están encriptados utilizando las claves maestras DPAPI de la máquina. Estas claves no pueden ser descifradas con la clave de respaldo DPAPI del dominio; en su lugar, se requiere el secreto LSA DPAPI_SYSTEM, al que solo el usuario SYSTEM puede acceder.

La descifrado manual se puede lograr ejecutando el comando lsadump::secrets en Mimikatz para extraer el secreto LSA DPAPI_SYSTEM, y posteriormente utilizando esta clave para descifrar las claves maestras de la máquina. Alternativamente, el comando crypto::certificates /export /systemstore:LOCAL_MACHINE de Mimikatz se puede utilizar después de parchear CAPI/CNG como se describió anteriormente.

SharpDPAPI ofrece un enfoque más automatizado con su comando de certificados. Cuando se utiliza la bandera /machine con permisos elevados, se escala a SYSTEM, extrae el secreto LSA DPAPI_SYSTEM, lo utiliza para descifrar las claves maestras DPAPI de la máquina, y luego emplea estas claves en texto plano como una tabla de búsqueda para descifrar cualquier clave privada de certificado de máquina.

Encontrar Archivos de Certificado – THEFT4

A veces los certificados se encuentran directamente dentro del sistema de archivos, como en carpetas compartidas o en la carpeta de Descargas. Los tipos de archivos de certificado más comúnmente encontrados dirigidos a entornos de Windows son archivos .pfx y .p12. Aunque con menos frecuencia, también aparecen archivos con extensiones .pkcs12 y .pem. Otras extensiones de archivo relacionadas con certificados que son notables incluyen:

  • .key para claves privadas,

  • .crt/.cer para solo certificados,

  • .csr para Solicitudes de Firma de Certificado, que no contienen certificados o claves privadas,

  • .jks/.keystore/.keys para Almacenes de Claves de Java, que pueden contener certificados junto con claves privadas utilizadas por aplicaciones Java.

Estos archivos se pueden buscar utilizando PowerShell o el símbolo del sistema buscando las extensiones mencionadas.

En casos donde se encuentra un archivo de certificado PKCS#12 y está protegido por una contraseña, la extracción de un hash es posible mediante el uso de pfx2john.py, disponible en fossies.org. Posteriormente, se puede emplear JohnTheRipper para intentar descifrar la contraseña.

# Example command to search for certificate files in PowerShell
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys

# Example command to use pfx2john.py for extracting a hash from a PKCS#12 file
pfx2john.py certificate.pfx > hash.txt

# Command to crack the hash with JohnTheRipper
john --wordlist=passwords.txt hash.txt

Robo de Credenciales NTLM a través de PKINIT - THEFT5

El contenido proporcionado explica un método para el robo de credenciales NTLM a través de PKINIT, específicamente a través del método de robo etiquetado como THEFT5. Aquí se presenta una reexplicación en voz pasiva, con el contenido anonimizado y resumido cuando sea aplicable:

Para admitir la autenticación NTLM [MS-NLMP] para aplicaciones que no facilitan la autenticación Kerberos, el KDC está diseñado para devolver la función unidireccional NTLM del usuario (OWF) dentro del certificado de atributos de privilegio (PAC), específicamente en el búfer PAC_CREDENTIAL_INFO, cuando se utiliza PKCA. En consecuencia, si una cuenta autentica y asegura un Ticket-Granting Ticket (TGT) a través de PKINIT, se proporciona inherentemente un mecanismo que permite al host actual extraer el hash NTLM del TGT para mantener los protocolos de autenticación heredados. Este proceso implica la descifrado de la estructura PAC_CREDENTIAL_DATA, que es esencialmente una representación serializada NDR del texto sin formato NTLM.

La utilidad Kekeo, accesible en https://github.com/gentilkiwi/kekeo, se menciona como capaz de solicitar un TGT que contenga estos datos específicos, facilitando así la recuperación del NTLM del usuario. El comando utilizado para este propósito es el siguiente:

tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local

Además, se señala que Kekeo puede procesar certificados protegidos por tarjeta inteligente, siempre que se pueda recuperar el PIN, con referencia a https://github.com/CCob/PinSwipe. La misma capacidad se indica que es compatible con Rubeus, disponible en https://github.com/GhostPack/Rubeus.

Esta explicación encapsula el proceso y las herramientas involucradas en el robo de credenciales NTLM a través de PKINIT, centrándose en la recuperación de hashes NTLM a través de TGT obtenidos mediante PKINIT, y las utilidades que facilitan este proceso.

Última actualización