Port Forwarding
MITRE ATT&CK™ Protocol Tunneling - Technique T1572
Theory
Port forwarding involves using any compromised host as a Jump Box to pivot to other hosts to which we do not have direct access from our attacking host. We configure the compromised host to listen on a port and relay all packets received on that port to another destination (and vice versa for a remote forward).

There are fore main types of port forwarding:
Local port forwarding: Open a local port on the compromised server and redirect incoming traffic to an other port on the same host or to a different host in a remote network.
Remote port forwarding: Open a local port on our attacking server and redirect incoming traffic to a port on a remote machine through a compromised intermediary machine (the Jump Box).
Dynamic port forwarding (Forward Proxy): tunnel the whole attacker's network traffic (instead of only one port) through the compromised machine opened SOCKS port.
Remote dynamic port forwarding (Reverse Proxy): tunnel the whole network traffic from a remote machine through the attacker's machine SOCKS port.
In brief, while in local and dynamic port forwarding, the listening port is bound to the client, in remote port forwarding and remote dynamic port forwarding, the listening port is bound to the server. It should be noted that we prefer to use remote techniques, which will open the port on our attacking machine and have a greater chance of evading network defences.
Practice
SSH tunneling
By using a SSH client with an OpenSSH server, it's possible to create both forward (local) and reverse (remote) connections to make SSH tunnels, allowing us to forward ports, and/or create proxies.
SSH Local Forwarding: Open a local port on the SSH client and redirect incoming traffic from that port to a specific port through the SSH tunnel established with the server.
SHH Remote forwarding: Open a remote port on the SSH server and redirect incoming traffic from that port to a specific port through the SSH tunnel established with the server.
SSH Dynamic port forwarding (Forward Proxy): The SSH client creates a local SOCKS proxy server port to tunnel the whole attacker's network traffic
SSH Reverse dynamic port forwarding (Reverse Proxy): The SSH client creates a remote SOCKS proxy server port on the SSH server to tunnel the whole attacker's network traffic
This example opens a connection to the jump-server.net, and forwards any connection to port 80 on the local machine (attacking machine) to port 80 of intra.example.com.
On the compromised computer (Jump Box), we can connect back to the attacking machine with a reverse port forward using the following command, this example produce the same result as previously seen with Local Forwarding. Any connection on ATTACKING_IP:8000 will be redirected on intra.example.com:80
its possible to create a Dynamic Port Forwarding (Forward proxy) using SSH.
For example, by using the following command on our attacking host, SOCKS port 9090 will be opened on our attacking machine. Traffic sent via this port will be pushed through the SSH tunnel to the Jump Host, then forwarded wherever they are addressed.
Once configured, you can use proxychains on your attacking host to run applications through the proxy network connections.
In newer versions of the SSH client, it is also possible to create a Remote Dynamic Port Forwarding (Reverse Proxy).
This feature is available since OpenSSH 7.6. Despite this, only the OpenSSH client needs to be at version 7.6 or above to make it works.
By using this command on the compromised host (Jump Box), SOCKS port 9090 will be opened on our attacking machine (the SSH server). Traffic sent via this port will be pushed through the SSH tunnel to the Jump Box, then forwarded wherever they are addressed.
Once configured, you can use proxychains on your attacking host to run applications through the proxy network connections.
SOCAT
We can use static binaries of socat to pivot, they are easy to find for both Linux and Windows.
Windows version is unlikely to bypass Antivirus software by default, so custom compilation may be required.
Setting up a Local port forward with SOCAT involves opening a listening port on the compromised server and redirecting incoming traffic to a target server.
Using this command on the Jump-Box will open port 33060 on it, and forward any connection from this port to port 3306 on 172.16.0.10.
Setting up a reverse port forwarding with SOCAT involves to redirect any local traffic from a port of our attacking server to a port on a remote machine via the compromised machine (Jump Box).
This example will forward any traffic from localhost:8000, on our attacking machine, to 172.16.0.10:80 trough the compromised Jump Box.
First of all, on our attacking machine, we issue the following command:
Next, on the compromised machine (Jump Box) we execute this command.
CHISEL
Chisel is an awesome tool which can be used to quickly and easily set up a tunnelled proxy or port forward through a compromised system regardless of whether you have SSH access or not. It's written in Golang and can be easily compiled for any system (with static release binaries for Linux and Windows provided). It tunnels connections within the HTTP protocol and uses the SSH protocol within this tunnel to encrypt our data.
Setting up a Reverse Proxy involves connecting from the compromised server to a listener on the attacking machine. Then, the Chisel client (Jump Box) opens/creates a remote SOCKS proxy server port on the Chisel Server (Attacking Host).
On the attacking host:
On the compromised host, after uploading chisel, we use the following command:
Once configured, you can use proxychains on your attacking host to run applications through the proxy network connections.
Setting up a Forward Proxy involves connecting from the attacking host to a listener on the compromised machine (Jump Box). Then, the Chisel client creates a local SOCKS proxy server port.
On the compromised host, we would use the following command:
On the attacking host, using the following command, we will open the local PROXY_PORT port on our attacking host.
Like with the reverse proxy, you can use proxychains to run applications through the proxy network connection.
A Remote Port Forward is when we connect from the Jump Box to a chisel server listening on the attacking machine, and open a listening port for forwarding on that server.
To do a reverse port forwarding with chisel, we can do as follow:
On the compromised host, we would use the following command. It will forward every requests sent to 8889 on the attacking host to the compromised host on localhost:6666
A Local Port Forward is when we connect from our own attacking machine to a chisel server listening on a compromised target, and open a local listening port for forwarding.
On the compromised target (jump box) we set up a chisel server:
On the attacking host, we would use the following command. It will connect to the compromised host running a chisel server, forwarding our local port 2222 to 172.16.0.10:22 (our intended target).
PLINK
Plink.exe is a Windows command line version of the PuTTY SSH client. Now that Windows comes with its own inbuilt SSH client, plink is less useful for modern servers; however, it is still a very useful tool.
To create a reverse connection, we can execute the following command on our compromised host (Jump Box).
As with SSH Remote Forwarding, any connection on ATTACKING_IP:8000 will be redirected on 172.16.0.10:80.
Netsh
On windows target, we can perform port forwarding using the the built-in firewall configuration tool Netsh (also known as Network Shell).
On windows, Netsh requires administrative privileges to create a port forward.
We can setup a Local Port Forward using the Netsh commands on the compromised host (Jump Box).
The following command will open the local port 2222 on the Jump Box, and forward any connection from it to 192.168.50.44:22.
Then, we ensure that the connections will be allowed on firewall
After we successfully performed our port forwarding, we can clear our tracks like so.
Resources
Last updated
Was this helpful?