Redes
SSH a Fondo: Túneles y ProxyJump
Local, Remote y Dynamic forwarding con SSH explicados con diagramas — más ProxyJump, ~/.ssh/config multi-salto y sshuttle para pivotar en OSCP.
Índice▾
- SSH como herramienta de pivoting
- Los tres reenvíos SSH
- Local Port Forwarding (-L)
- Remote Port Forwarding (-R)
- Dynamic Port Forwarding (-D) — Proxy SOCKS
- Tabla resumen
- Flags útiles para túneles
- ProxyJump: saltar bastiones
- ~/.ssh/config: configuración permanente
- sshuttle: "VPN de pobre"
- Encaje en el workflow de pivoting
- Práctica
- Recursos
SSH como herramienta de pivoting
En OSCP, SSH no es solo "acceso remoto seguro". Es una VPN instantánea que ya viene instalada en casi todo servidor Linux. Cuando comprometes una máquina con SSH habilitado y credenciales válidas, puedes tunelizar tráfico hacia redes internas sin instalar nada extra.
Los túneles SSH requieren que AllowTcpForwarding esté a yes en el servidor (es el valor por defecto). En hardening extremo puede estar desactivado — en ese caso recurre a chisel o socat. Ver Firewalls, NAT y Tunneling.
Los tres reenvíos SSH
Local Port Forwarding (-L)
Sintaxis: ssh -L <puerto_local>:<destino>:<puerto_destino> user@pivot
Pregunta clave: ¿qué servicio ve el pívot pero tú no puedes alcanzar directamente?
Tu Kali Pívot SSH Red interna
┌──────────────┐ ┌─────────┐ ┌──────────────┐
│ localhost:8080│────────►│ SSH srv │────────►│ 10.10.10.5:80│
└──────────────┘ túnel └─────────┘ TCP └──────────────┘ssh -L 8080:10.10.10.5:80 user@pivot
# Ahora: curl http://localhost:8080 → llega al puerto 80 de 10.10.10.5El tráfico va cifrado entre Kali y el pívot; dentro de la red interna va en claro.
Remote Port Forwarding (-R)
Sintaxis: ssh -R <puerto_remoto>:<destino>:<puerto_destino> user@pivot
Caso de uso: quieres que el servidor SSH (u otras máquinas que lo vean) accedan a algo que tú ofreces.
Tu Kali Pívot SSH
┌──────────────┐ ┌─────────────────┐
│ tu servicio │◄────────│ 0.0.0.0:9090 │
│ localhost:80 │ túnel │ (abre el pívot) │
└──────────────┘ └─────────────────┘ssh -R 9090:localhost:80 user@pivot
# En el pívot: curl http://localhost:9090 → llega a tu puerto 80El Remote forwarding es útil cuando quieres entregar un payload o archivo desde tu Kali a máquinas de la red interna que sí ven al pívot pero no te ven a ti.
Dynamic Port Forwarding (-D) — Proxy SOCKS
Sintaxis: ssh -D <puerto_local> user@pivot
Crea un proxy SOCKS5 local. Todo lo que configures para pasar por ese proxy viajará a través del túnel SSH y saldrá por el pívot.
Tu Kali Pívot SSH Red interna
┌──────────────┐ ┌─────────┐ ┌──────────────┐
│ SOCKS5:1080 │────────►│ SSH srv │────────►│ cualquier │
│ proxychains │ túnel └─────────┘ TCP │ host:port │
└──────────────┘ └──────────────┘# Abrir el proxy SOCKS
ssh -D 1080 user@pivot
# Usar proxychains para enrutar herramientas a través del proxy
proxychains nmap -sT -Pn -p 22,80,443 10.10.10.0/24Con proxychains, usa siempre nmap -sT -Pn (TCP connect, sin ping). Los escaneos SYN (-sS) y UDP no funcionan a través de SOCKS porque requieren privilegios de raw socket que el proxy no reenvía. Ver Escaneo de Puertos: Teoría.
Tabla resumen
| Reenvío | Flag | ¿Quién abre el puerto? | Caso típico en OSCP |
|---|---|---|---|
| Local | -L | Tu Kali | Acceder a servicio interno (MySQL, RDP, web interna) |
| Remote | -R | El pívot | Exponer tu servidor de archivos a la red interna |
| Dynamic | -D | Tu Kali (SOCKS) | Escanear toda la red interna con proxychains |
Flags útiles para túneles
| Flag | Efecto | Por qué usarlo |
|---|---|---|
-f | Manda SSH al background | No bloquea la terminal |
-N | No ejecuta comando remoto | Solo para el túnel, no abre shell |
-C | Compresión del tráfico | Útil en conexiones lentas |
-T | Desactiva pseudo-TTY | Evita warnings en combinación con -N |
Combinación habitual para abrir un proxy SOCKS en background:
ssh -fND 1080 user@pivotPara cerrar ese túnel después:
# Busca el PID
ps aux | grep "ssh -fND"
kill <PID>ProxyJump: saltar bastiones
ProxyJump (-J) conecta a un destino a través de uno o más saltos intermedios. SSH maneja el túnel internamente — no necesitas abrir un puerto local primero.
# Llegar a destino_interno usando pivot como bastión
ssh -J user@pivot user@destino_interno Tu Kali ──SSH──► pivot ──SSH──► destino_internoPara múltiples saltos en cadena:
ssh -J user@pivot1,user@pivot2 user@destino_final~/.ssh/config: configuración permanente
Escribir los flags en cada comando es propenso a errores. El fichero ~/.ssh/config guarda alias de hosts con todas sus opciones.
# ~/.ssh/config
# Bastión / pívot
Host pivot
HostName 10.10.10.100
User pentester
IdentityFile ~/.ssh/id_rsa_htb
# Máquina interna — salta automáticamente por pivot
Host interno
HostName 172.16.0.50
User admin
ProxyJump pivot
# Proxy SOCKS permanente (levanta el túnel con: ssh socks-proxy)
Host socks-proxy
HostName 10.10.10.100
User pentester
DynamicForward 1080
RequestTTY no
RemoteCommand noneCon esta config:
ssh interno # conecta a 172.16.0.50 a través de pivot automáticamente
ssh socks-proxy # levanta el SOCKS en :1080ProxyCommand es la forma más antigua y explícita: ProxyCommand ssh -W %h:%p pivot. ProxyJump es el alias moderno equivalente disponible desde OpenSSH 7.3.
sshuttle: "VPN de pobre"
sshuttle enruta subredes completas a través de SSH sin necesitar proxychains ni configurar SOCKS. Funciona inyectando reglas de iptables/nftables transparentemente.
# Instalar en Kali
sudo apt install sshuttle
# Enrutar la subred 172.16.0.0/24 a través del pívot
sshuttle -r user@pivot 172.16.0.0/24
# Enrutar TODO el tráfico (cuidado: incluye tu propio tráfico)
sshuttle -r user@pivot 0.0.0.0/0Ventajas sobre SOCKS + proxychains:
- Funciona con herramientas que no soportan proxychains (resolución DNS, ICMP básico).
nmap -sTynmap -sUfuncionan directamente sin flags especiales.- No requiere tocar la config de cada herramienta.
sshuttle modifica las tablas de routing de tu Kali. Si enrutas 0.0.0.0/0, TODO tu tráfico de internet pasará por el pívot. Usa subredes específicas en OSCP para no perder acceso a otros recursos.
Encaje en el workflow de pivoting
Kali ──[SSH -D 1080]──► Pívot ──► Red interna (172.16.0.0/24)
│
proxychains nmap -sT -Pn
proxychains crackmapexec
proxychains curl http://172.16.0.50El flujo típico en OSCP:
- Comprometer el pívot (shell o SSH con credenciales).
ssh -fND 1080 user@pivot— levantar SOCKS.- Editar
/etc/proxychains4.conf— asegurarsocks5 127.0.0.1 1080. proxychains nmap -sT -Pn 172.16.0.0/24— descubrir hosts internos.- Para pivoting más complejo (múltiples saltos), ver Pivoting Avanzado.
Práctica
Ejercicio 1. Escenario: tu Kali NO puede alcanzar el puerto MySQL (3306) de 172.16.0.10, pero el pívot 10.10.10.100 sí. ¿Qué tipo de reenvío usas (-L, -R o -D) y cuál es el comando exacto para que mysql -h 127.0.0.1 -P 3306 funcione desde tu Kali?
Ver solución
Usas Local Port Forwarding (-L) porque quieres que un puerto de tu Kali llegue a un servicio que ve el pívot:
ssh -L 3306:172.16.0.10:3306 user@10.10.10.100Ahora en otra terminal:
mysql -h 127.0.0.1 -P 3306 -u root -pEl tráfico viaja: Kali:3306 → túnel SSH → pívot → 172.16.0.10:3306.
Si el puerto 3306 local ya está en uso (tienes MySQL local), usa uno alternativo:
ssh -L 13306:172.16.0.10:3306 user@10.10.10.100
mysql -h 127.0.0.1 -P 13306 -u root -pEjercicio 2. Escribe un bloque ~/.ssh/config que permita hacer ssh interno y llegar a 192.168.1.50 saltando por pivot (10.10.10.100), usando la clave ~/.ssh/id_rsa_lab para ambos saltos y el usuario kali en el pívot y administrator en el destino interno.
Ver solución
# ~/.ssh/config
Host pivot
HostName 10.10.10.100
User kali
IdentityFile ~/.ssh/id_rsa_lab
Host interno
HostName 192.168.1.50
User administrator
IdentityFile ~/.ssh/id_rsa_lab
ProxyJump pivotCon esta configuración:
ssh interno
# Equivale a: ssh -J kali@10.10.10.100 administrator@192.168.1.50 -i ~/.ssh/id_rsa_labSSH usa la IdentityFile del bloque pivot para el primer salto y la del bloque interno para el segundo.