6 minuto(s) de lectura

¿Por qué algunos DCs no soportan PKINIT?

Cuando exploto ESC1 y obtengo un .pfx como Administrator, el flujo normal es usar ese certificado para autenticarme vía Kerberos y obtener un TGT — esto se llama PKINIT (Public Key Cryptography for Initial Authentication in Kerberos).

El problema es que PKINIT no es universal. Para que funcione, el DC necesita tener configurado el servicio de autenticación por certificado, lo que implica que:

  • El DC debe tener instalado y configurado AD CS con soporte explícito para smart card / certificate logon
  • Debe existir un mapeo válido entre el certificado y el objeto de usuario en el directorio (vía SID o UPN)
  • La CA que emitió el certificado debe ser de confianza para el KDC

En entornos donde AD CS fue desplegado de forma básica o con configuraciones mínimas, el KDC simplemente no tiene habilitado el soporte para este tipo de pre-autenticación y responde con KDC_ERR_PADATA_TYPE_NOSUPP. Esto no significa que el certificado sea inútil — significa que hay que buscar otra vía para aprovecharlo, y esa vía es autenticación LDAP con el certificado directamente, saltando Kerberos por completo.


Escenario: HTB Authority

Cuento con credenciales de svc_ldap : lDaP_1n_th3_cle4r! obtenidas previamente a través del portal PWM mal configurado. Con esto enumero AD CS y encuentro el template CorpVPN vulnerable a ESC1.


1. Enumeración del Template Vulnerable

┌──(kali㉿kali)-[~/Desktop/HTB/authority/content]
└─$ certipy-ad find -u 'svc_ldap' -p 'lDaP_1n_th3_cle4r!' -target AUTHORITY.HTB -dc-ip 10.129.229.56 -stdout -vulnerable
Certipy v5.0.4 - by Oliver Lyak (ly4k)

[*] Finding certificate templates
[*] Found 37 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 13 enabled certificate templates
[*] Finding issuance policies
[*] Found 21 issuance policies
[*] Found 0 OIDs linked to templates
[*] Retrieving CA configuration for 'AUTHORITY-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Successfully retrieved CA configuration for 'AUTHORITY-CA'
[*] Checking web enrollment for CA 'AUTHORITY-CA' @ 'authority.authority.htb'
[!] Error checking web enrollment: [Errno 111] Connection refused
[!] Use -debug to print a stacktrace
[*] Enumeration output:
Certificate Authorities
  0
    CA Name                             : AUTHORITY-CA
    DNS Name                            : authority.authority.htb
    Certificate Subject                 : CN=AUTHORITY-CA, DC=authority, DC=htb
    Certificate Serial Number           : 2C4E1F3CA46BBDAF42A1DDE3EC33A6B4
    Certificate Validity Start          : 2023-04-24 01:46:26+00:00
    Certificate Validity End            : 2123-04-24 01:56:25+00:00
    Web Enrollment
      HTTP
        Enabled                         : False
      HTTPS
        Enabled                         : False
    User Specified SAN                  : Disabled
    Request Disposition                 : Issue
    Enforce Encryption for Requests     : Enabled
    Active Policy                       : CertificateAuthority_MicrosoftDefault.Policy
    Permissions
      Owner                             : AUTHORITY.HTB\Administrators
      Access Rights
        ManageCa                        : AUTHORITY.HTB\Administrators
                                          AUTHORITY.HTB\Domain Admins
                                          AUTHORITY.HTB\Enterprise Admins
        ManageCertificates              : AUTHORITY.HTB\Administrators
                                          AUTHORITY.HTB\Domain Admins
                                          AUTHORITY.HTB\Enterprise Admins
        Enroll                          : AUTHORITY.HTB\Authenticated Users
Certificate Templates
  0
    Template Name                       : CorpVPN
    Display Name                        : Corp VPN
    Certificate Authorities             : AUTHORITY-CA
    Enabled                             : True
    Client Authentication               : True
    Enrollment Agent                    : False
    Any Purpose                         : False
    Enrollee Supplies Subject           : True
    Certificate Name Flag               : EnrolleeSuppliesSubject
    Enrollment Flag                     : IncludeSymmetricAlgorithms
                                          PublishToDs
                                          AutoEnrollmentCheckUserDsCertificate
    Private Key Flag                    : ExportableKey
    Extended Key Usage                  : Encrypting File System
                                          Secure Email
                                          Client Authentication
                                          Document Signing
                                          IP security IKE intermediate
                                          IP security use
                                          KDC Authentication
    Requires Manager Approval           : False
    Requires Key Archival               : False
    Authorized Signatures Required      : 0
    Schema Version                      : 2
    Validity Period                     : 20 years
    Renewal Period                      : 6 weeks
    Minimum RSA Key Length              : 2048
    Template Created                    : 2023-03-24T23:48:09+00:00
    Template Last Modified              : 2023-03-24T23:48:11+00:00
    Permissions
      Enrollment Permissions
        Enrollment Rights               : AUTHORITY.HTB\Domain Computers
                                          AUTHORITY.HTB\Domain Admins
                                          AUTHORITY.HTB\Enterprise Admins
      Object Control Permissions
        Owner                           : AUTHORITY.HTB\Administrator
        Full Control Principals         : AUTHORITY.HTB\Domain Admins
                                          AUTHORITY.HTB\Enterprise Admins
        Write Owner Principals          : AUTHORITY.HTB\Domain Admins
                                          AUTHORITY.HTB\Enterprise Admins
        Write Dacl Principals           : AUTHORITY.HTB\Domain Admins
                                          AUTHORITY.HTB\Enterprise Admins
        Write Property Enroll           : AUTHORITY.HTB\Domain Admins
                                          AUTHORITY.HTB\Enterprise Admins
    [+] User Enrollable Principals      : AUTHORITY.HTB\Domain Computers
    [!] Vulnerabilities
      ESC1  

Certipy identifica CorpVPN como vulnerable a ESC1. Las tres condiciones que lo hacen explotable son:

  • Enrollee Supplies Subject: True → puedo especificar libremente el UPN en el SAN, lo que me permite impersonar a cualquier usuario, incluyendo Administrator
  • Client Authentication: True → el certificado resultante sirve para autenticarse en el dominio
  • Enrollment Rights: Domain Computers → solo cuentas de computadora pueden solicitar este template

El tercer punto es el que complica la solicitud directa con svc_ldap, ya que es una cuenta de usuario y no de computadora. Así que primero necesito crear una.


2. Crear una Cuenta de Computadora Falsa

Uso impacket-addcomputer para agregar una computadora al dominio con las credenciales de svc_ldap. Esto es posible porque por defecto en Active Directory cualquier usuario autenticado puede unir hasta 10 computadoras al dominio (atributo ms-DS-MachineAccountQuota).

Esto me da una cuenta FAKEBOX$ que sí pertenece al grupo Domain Computers y por lo tanto tiene derecho de enroll en el template CorpVPN.


3. Solicitar el Certificado como Administrator (ESC1)

Con las credenciales de FAKEBOX$ solicito el certificado especificando el UPN de Administrator en el SAN. Esto es el núcleo de ESC1: el template no valida que el solicitante sea realmente el usuario que declara en el certificado.

La CA emite el certificado sin validar la identidad real del solicitante frente al UPN declarado. El resultado es administrator.pfx — un certificado que acredita ser Administrator.


4. Intento de Autenticación PKINIT — Error

El flujo estándar sería usar ese .pfx para obtener un TGT de Kerberos:

Pero el DC responde con:

KDC_ERR_PADATA_TYPE_NOSUPP (KDC has no support for padata type)

El KDC no tiene habilitado PKINIT, así que no puede procesar pre-autenticación basada en certificados. El TGT no se emite. El certificado sigue siendo válido — solo necesito una ruta diferente para usarlo.


5. Extraer el Certificado y la Clave del PFX

La alternativa es usar el certificado para autenticarme directamente contra LDAP en lugar de Kerberos. Para eso necesito el .crt y el .key por separado:

Estos dos archivos me permiten establecer una sesión LDAP autenticada con el certificado del Administrator, sin pasar por Kerberos en ningún momento.


6. PassTheCert — Otorgar DCSync a svc_ldap

Con PassTheCert uso el certificado para autenticarme en LDAP como Administrator y desde ahí modificar el objeto svc_ldap en el directorio, otorgándole permisos de DCSync (DS-Replication-Get-Changes + DS-Replication-Get-Changes-All).

La herramienta confirma: Granted user 'svc_ldap' DCSYNC rights!

Esto funciona porque LDAP sí acepta autenticación por certificado (SASL EXTERNAL / TLS client auth), a diferencia del KDC en este DC. Ahora svc_ldap puede replicar el directorio como si fuera un Domain Controller.


7. DCSync — Dumping de Credenciales

Con los permisos de replicación ya asignados, ejecuto DCSync con secretsdump:

Obtengo los hashes NTLM de todos los usuarios del dominio, incluyendo:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:6961f422924da90a6928197429eea4ed:::

8. Pass-the-Hash → Shell como Administrator

Verifico el hash y me conecto al DC


Resumen de la Cadena de Ataque

svc_ldap (credenciales) 
  → Enumeración AD CS → CorpVPN vulnerable a ESC1
  → Crear FAKEBOX$ (Domain Computer)
  → Solicitar certificado con UPN=administrator@authority.htb
  → PKINIT bloqueado por el DC
  → Extraer .crt y .key del PFX
  → PassTheCert vía LDAP → DCSync rights a svc_ldap
  → secretsdump → Hash NTLM de Administrator
  → Pass-the-Hash → evil-winrm → SYSTEM

Por qué funciona PassTheCert cuando PKINIT no funciona

Protocolo Autenticación por certificado ¿Funciona en Authority?
Kerberos (PKINIT) Requiere configuración explícita en el KDC No soportado
LDAP (SASL/TLS) Nativo en cualquier DC con LDAPS activo Funciona

LDAP acepta el certificado como identidad porque el DC tiene LDAPS activo en el puerto 636, y el certificado lleva el UPN de Administrator como SAN — el directorio lo toma como prueba de identidad válida. No necesita que el KDC lo valide.