> For the complete documentation index, see [llms.txt](https://g4b0.gitbook.io/g4b0-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/tunneling-and-portforwarding/dynamic-port-forwarding-with-ssh-with-ssh-and-socks-tunneling.md).

# Dynamic Port Forwarding with SSH with SSH and SOCKS tunneling

#### Conceptos Base

* El port forwarding redirige solicitudes de comunicación de un puerto a otro usando TCP como capa de transporte.
* Protocolos como SSH o SOCKS pueden encapsular el tráfico redirigido — útil para evadir firewalls y pivotar entre redes desde un host comprometido.
* **SSH Local Port Forwarding**: redirige un puerto local de tu máquina hacia un servicio en el servidor remoto (o en redes accesibles desde él).

> **Nota:** Los diagramas de red son conceptuales; las IPs pueden no coincidir exactamente con el laboratorio. Úsalos para entender el concepto.

**Escenario:** Attack host (`10.10.15.x`) → Ubuntu pivot comprometido (`10.129.202.64`, `172.16.5.129`) → red interna (`172.16.5.0/23`)

***

#### 1. Escaneo del Pivot Target

```bash
nmap -sT -p22,3306 10.129.202.64
```

* `-sT` — TCP connect scan (full handshake)
* `-p22,3306` — escanea solo SSH y MySQL

**Output esperado:**

```
PORT     STATE  SERVICE
22/tcp   open   ssh
3306/tcp closed mysql
```

MySQL está cerrado externamente pero accesible desde dentro del servidor → candidato ideal para local port forward. Sin port forwarding, no se pueden ejecutar exploits remotos contra ese servicio.

***

#### 2. Ejecutar el Local Port Forward

```bash
ssh -L 1234:localhost:3306 ubuntu@10.129.202.64
```

* `-L 1234:localhost:3306` — redirige el puerto local `1234` al `localhost:3306` del servidor Ubuntu (MySQL). El tráfico viaja cifrado por el túnel SSH.

**Output esperado:** shell SSH establecida con banner de Ubuntu 20.04, mostrando la IP de `ens224` (`172.16.5.129`).

***

#### 3. Verificar el Port Forward

```bash
netstat -antp | grep 1234
```

**Output esperado:**

```
tcp   0   0 127.0.0.1:1234   0.0.0.0:*   LISTEN   4034/ssh
tcp6  0   0 ::1:1234         :::*         LISTEN   4034/ssh
```

```bash
nmap -v -sV -p1234 localhost
```

* `-sV` — detección de versión de servicio
* `-p1234` — escanea el puerto redirigido localmente

**Output esperado:**

```
PORT     STATE SERVICE VERSION
1234/tcp open  mysql   MySQL 8.0.28-0ubuntu0.20.04.3
```

***

#### 4. Redirigir Múltiples Puertos Simultáneamente

```bash
ssh -L 1234:localhost:3306 -L 8080:localhost:80 ubuntu@10.129.202.64
```

* Múltiples flags `-L` en un mismo comando — redirige MySQL (`3306→1234`) y Apache (`80→8080`) en una sola sesión SSH.

***

#### 5. Identificar Oportunidades de Pivoting

```bash
ifconfig
```

**Interfaces relevantes en el Ubuntu comprometido:**

* `ens192`: `10.129.202.64` — conectada al attack host
* `ens224`: `172.16.5.129` — conectada a red interna (`172.16.5.0/23`), **no accesible directamente** desde el attack host
* `lo`: loopback

Un host comprometido con múltiples NICs (dual-homed) es el punto de entrada ideal para pivotar hacia redes internas no enrutables.

***

#### 6. Dynamic Port Forwarding con SSH (-D)

**Aclaración:** SOCKS (Socket Secure) es un protocolo de proxy que enruta tráfico TCP a través de un intermediario. El cliente SOCKS inicia la conexión al servidor SOCKS, que actúa en su nombre. Soporta NAT traversal. SOCKS4 no tiene autenticación ni UDP; SOCKS5 sí.

```bash
ssh -D 9050 ubuntu@10.129.202.64
```

* `-D 9050` — abre un SOCKS listener en `localhost:9050`. Todo el tráfico enviado ahí se enruta a través del túnel SSH hacia `172.16.5.0/23`. A diferencia de `-L`, no necesitas conocer el puerto destino de antemano.

***

#### 7. Configurar Proxychains

```bash
tail -4 /etc/proxychains.conf
```

Verificar (o añadir) al final del archivo:

```
socks4  127.0.0.1 9050
```

Proxychains intercepta las llamadas de red de cualquier herramienta y las enruta a través del proxy SOCKS, permitiendo usar herramientas como Nmap o msfconsole contra la red interna sin modificarlas.

***

#### 8. Host Discovery en la Red Interna

```bash
proxychains nmap -v -sn 172.16.5.1-200
```

* `-sn` — ping scan (solo host discovery, sin escaneo de puertos)

> **CRÍTICO: Proxychains solo soporta TCP completo. Los half-open scans (`-sS`) devolverán resultados incorrectos — usa siempre `-sT`.**
>
> **CRÍTICO: El host discovery (`-sn`) puede fallar contra targets Windows porque Windows Defender bloquea ICMP por defecto. Usa `-Pn` para saltarlo.**

**Output esperado:**

```
|S-chain|-<>-127.0.0.1:9050-<><>-172.16.5.5:80-<><>-OK
```

**Troubleshooting:** Un full scan de `172.16.5.0/23` es muy lento vía proxychains — limita el rango a hosts conocidos vivos o usa rangos pequeños.

***

#### 9. Enumeración del Target Windows

```bash
proxychains nmap -v -Pn -sT 172.16.5.19
```

* `-Pn` — omite host discovery (necesario cuando ICMP está bloqueado por Windows Defender)
* `-sT` — full TCP connect scan (obligatorio con proxychains)

**Output esperado (puertos relevantes):**

```
445/tcp  open  microsoft-ds
135/tcp  open  msrpc
3389/tcp open  ms-wbt-server   ← RDP
139/tcp  open  netbios-ssn
```

***

#### 10. Metasploit a través de Proxychains

```bash
proxychains msfconsole
```

Todo el tráfico de msfconsole se enruta automáticamente por el proxy SOCKS.

**Escaneo RDP con el módulo `rdp_scanner`:**

```
msf6 > search rdp_scanner
msf6 > use auxiliary/scanner/rdp/rdp_scanner
msf6 auxiliary(scanner/rdp/rdp_scanner) > set rhosts 172.16.5.19
msf6 auxiliary(scanner/rdp/rdp_scanner) > run
```

**Output esperado:**

```
[*] 172.16.5.19:3389 - Detected RDP on 172.16.5.19:3389
    (name:DC01) (domain:DC01) (domain_fqdn:DC01)
    (os_version:10.0.17763) (Requires NLA: No)
[*] Scanned 1 of 1 hosts (100% complete)
```

Confirma que el host es un Domain Controller (`DC01`) con Windows Server 2019 (`10.0.17763`) y que **NLA no está requerido** — facilitando la autenticación.

***

#### 11. Conexión RDP a través del Túnel SOCKS

```bash
proxychains xfreerdp /v:172.16.5.19 /u:victor /p:pass@123
```

* `/v:` — target host
* `/u:` — usuario
* `/p:` — contraseña

**Output esperado:** solicitud de aceptación de certificado RDP → sesión de escritorio remoto Windows activa pivotando a través del servidor Ubuntu.

> **Nota:** Después de lanzar el laboratorio, esperar 3-5 minutos para que todas las configuraciones se establezcan antes de conectar.

***

#### Mitigación

* **Remediación:** Deshabilitar port forwarding en el servidor SSH (`AllowTcpForwarding no`, `GatewayPorts no` en `/etc/ssh/sshd_config`). Implementar segmentación de red estricta para aislar hosts dual-homed. Monitorear conexiones SOCKS salientes y tráfico inusual en puertos como `9050`. Restringir acceso SSH a usuarios y IPs específicos. Bloquear RDP (`3389`) desde segmentos no autorizados mediante firewall interno y aplicar NLA obligatoriamente.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/tunneling-and-portforwarding/dynamic-port-forwarding-with-ssh-with-ssh-and-socks-tunneling.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
