Skip to content

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 ​

c
# 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 ​

c
# 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.20

Conexió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.

c
# 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 2222

Buscar claves privadas en el sistema ​

c
# 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/null

Ver 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.

c
# Ver authorized_keys en el host remoto
type C:\Users\jsmith\.ssh\authorized_keys
cat /home/jsmith/.ssh/authorized_keys

Permisos 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.

c
# 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.20

Solución alternativa — corregir permisos manualmente ​

c
# 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 ​

c
# 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:

c
# 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_rsa

Para pivoting y tunneling via SSH revisar el módulo de Pivoting, Tunneling and Port Forwarding.