Kerberos Double-Hop Problem – explicación y soluciones

📌 Resumen

El problema del doble salto (double-hop) ocurre cuando intentamos ejecutar comandos remotos desde un host intermedio usando Kerberos, y el TGT (Ticket Granting Ticket) del usuario no se reenvía al segundo host.
Resultado: el segundo host no puede autenticarnos, aunque tengamos acceso legítimo.

Ejemplo clásico:

Attack Host → Host A (WinRM) → Host B (DC)


🟥 ¿Por qué ocurre?

✔ Qué se envía en WinRM (Kerberos)

✔ Qué pasa con NTLM / PSExec


🟥 Evidencia (Mimikatz)

Al conectarse vía WinRM:


🟥 Qué significa realmente

WinRM con Kerberos:

El usuario no puede demostrar identidad ante el segundo host → acceso denegado.


🟩 Cuando NO ocurre el doble salto

🔓 Delegación sin restricciones (Unconstrained Delegation)

Si está habilitada:


🟦 Soluciones prácticas

1. Pasar credenciales manualmente con PSCredential

Cuando usamos WinRM (evil-winrm, Enter-PSSession, etc.):

Crear SecureString:

$SecPassword = ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('DOMAIN\user', $SecPassword)

Usar PowerView con credenciales:

Get-DomainUser -SPN -Credential $Cred

Sin -Credential → falla por doble salto.


❗ Comprobación con klist

Con WinRM:

Solo 1 ticket → HTTP/HOST No hay TGT

Con RDP o PSExec:

TGT + múltiples TGS Delegación permitida → No hay problema de doble salto


2. Crear nueva configuración de PSSession (registrar sesión)

Cuando tenemos GUI o trabajamos desde un host Windows comprometido.

Permite:


🟦 Indicadores del doble salto

Sintomas:

DirectoryServicesCOMException: An operations error occurred

HTTP/host → 1 ticket


🟩 Proceso de ataque típico que falla por doble salto

Attack host (evil-winrm) → DEV01 DEV01 intenta → DC01

WinRM autentica con Kerberos, pero:


🟪 Procesos involucrados

Ejemplo:

wsmprovhost.exe conhost.exe tasklist.exe

→ ejecutándose bajo el usuario conectado vía WinRM, pero sin credenciales completas.


🟦 Conclusión clara y útil para pentesting

Método de conexión ¿Genera doble salto? ¿Por qué?
WinRM (evil-winrm, Enter-PSSession) 🟥 Sí No envía TGT. No guarda NTLM.
RDP 🟩 No La contraseña se almacena en memoria; se envía TGT completo.
PSExec / SMB 🟩 No Se almacena el hash NTLM.
Unconstrained Delegation 🟩 No El TGT del usuario se reenvía automáticamente.

🟦 Soluciones rápidas (cheat sheet)

✔ Pasar credenciales manualmente:

$pwd = ConvertTo-SecureString 'Pass123' -AsPlainText -Force
$cred = New-Object PSCredential ('DOMAIN\user', $pwd)
Invoke-Command -ComputerName DC01 -Credential $cred -ScriptBlock { ... }

✔ Usar un host Windows comprometido (RDP)

→ Ya tiene los tickets necesarios (klist para confirmar).

✔ Obtener ejecución por PSExec o SMB

✔ Buscar delegación sin restricciones:

Get-DomainComputer -Unconstrained