Port forwarding y pivoting: SSH, chisel y socat

Cómo llegar a un servicio que solo escucha en 127.0.0.1 o a otra red interna: túneles locales, remotos y dinámicos con SSH, chisel cuando no hay SSH, socat y proxychains.

· 3 min de lectura

Muy a menudo, la vía a root está en un servicio que solo escucha en local: un panel web interno en el puerto 8080, una base de datos, una API de Docker. Desde fuera no lo ves; tienes que llevar ese puerto hasta tu máquina.

Encontrar lo que escucha en local

ss -tlnp                 # o netstat -tlnp en sistemas viejos
cat /proc/net/tcp        # si no hay ninguno de los dos (puertos en hexadecimal)
ip a; ip route           # ¿hay más redes? (docker0, una 172.16.x.x...)
cat /etc/hosts

Fíjate en lo que escucha en 127.0.0.1 o ::1 y no salía en tu nmap. Esos son los candidatos.

Truco

Para traducir /proc/net/tcp a mano: 0100007F:1F90 es 127.0.0.1:8080 (la IP va al revés byte a byte y el puerto en hexadecimal: 0x1F90 = 8080).

Con SSH

Si tienes credenciales o una clave SSH, SSH es lo más cómodo.

Local (-L): traer un puerto remoto a tu máquina

ssh -L 8080:127.0.0.1:8080 [email protected]
# ahora http://localhost:8080 en tu navegador es el 8080 interno de la víctima

El formato es -L puerto_en_tu_máquina:destino:puerto_destino. El destino se resuelve desde la víctima, así que puedes llegar a otra máquina de su red: -L 3306:172.17.0.2:3306.

Remoto (-R): llevar un puerto tuyo a la víctima

Útil cuando la víctima no puede conectarse a ti directamente o para exponer tu servidor en ella:

ssh -R 9001:127.0.0.1:9001 [email protected]
# en la víctima, conectar a 127.0.0.1:9001 llega a tu 9001

Dinámico (-D): un proxy SOCKS a toda su red

ssh -D 1080 -N [email protected]

Y en /etc/proxychains4.conf, al final:

socks5 127.0.0.1 1080
proxychains -q nmap -sT -Pn -p 22,80,445 172.16.1.10
proxychains -q curl http://172.16.1.10

Cuidado

Por un proxy SOCKS solo pasa TCP. nmap tiene que ir con -sT -Pn (sin ping, sin SYN scan), y es lento: limita los puertos.

Trucos de SSH

  • -N no abre shell y -f lo manda a segundo plano: ssh -fN -L 8080:127.0.0.1:8080 usuario@ip.
  • En una sesión ya abierta, ~C (tras un Enter) abre una línea de órdenes donde escribir -L 8080:127.0.0.1:8080 sin reconectar. En OpenSSH 9.2 o posterior necesitas -o EnableEscapeCommandline=yes.
  • Si solo tienes una shell sin SSH pero puedes escribir en ~/.ssh/authorized_keys, mete tu clave pública y ya tienes SSH.

Sin SSH: chisel

chisel es un solo binario (Linux y Windows) que hace túneles sobre HTTP. Súbelo a la víctima y lanza el servidor en tu máquina:

# Tu máquina
./chisel server -p 8000 --reverse

# Víctima: lleva su 127.0.0.1:8080 a tu puerto 8080
./chisel client 10.10.14.5:8000 R:8080:127.0.0.1:8080

# Víctima: varios a la vez
./chisel client 10.10.14.5:8000 R:8080:127.0.0.1:8080 R:3306:127.0.0.1:3306

# Víctima: un proxy SOCKS en tu 127.0.0.1:1080 hacia toda su red
./chisel client 10.10.14.5:8000 R:socks

Con R:socks usas proxychains igual que con ssh -D.

Nota

Usa la misma versión de chisel en los dos lados. Si la víctima es Windows, baja el .exe de la misma release (chisel_x.y.z_windows_amd64).

socat: reenviar un puerto en la propia víctima

Si quieres exponer un puerto local de la víctima hacia fuera (para atacarlo directamente desde tu máquina), y socat está instalado o puedes subirlo:

socat TCP-LISTEN:8081,fork,reuseaddr TCP:127.0.0.1:8080
# ahora 10.10.10.10:8081 llega al 8080 interno

También vale para hacer de "puente" en un pivote: lo que llega a la máquina intermedia se reenvía a una tercera.

En Windows

  • chisel.exe, exactamente igual que arriba.
  • plink.exe (el SSH de PuTTY) para hacer un -R hacia tu máquina: plink.exe -l tunel -pw tunel -R 4445:127.0.0.1:445 10.10.14.5 (crea un usuario solo para esto: su contraseña queda en la víctima).
  • netsh (requiere administrador): netsh interface portproxy add v4tov4 listenport=8081 listenaddress=0.0.0.0 connectport=8080 connectaddress=127.0.0.1.

Redes enteras: ligolo-ng

Cuando hay varias redes internas y muchos servicios, un proxy SOCKS se queda corto. ligolo-ng crea una interfaz de red en tu máquina y enruta todo el tráfico (incluidos nmap normal y UDP) por el agente que corre en la víctima. Es más montaje la primera vez, pero luego trabajas como si estuvieras dentro de la red. Mira la documentación de la versión que bajes, porque los comandos han cambiado entre versiones.

Qué hacer con el puerto

Una vez lo tienes en tu localhost, trátalo como un objetivo nuevo: nmap -sCV -p 8080 127.0.0.1, abre la web, busca la versión. Paneles internos sin parchear, APIs sin autenticación y bases de datos con la contraseña del fichero de configuración son el final de muchas máquinas.

Practícalo en máquinas reales

Máquinas de Hack The Box donde se usa la técnica. Cada ▶ salta al minuto del vídeo de IppSec donde aparece.

Servicios internos y port forwarding 56 máquinas

Ver las 56 máquinas →

¿Ves un error o echas algo en falta? Cuéntanoslo