一、前言
熟练的代理转发,既可助你穿梭内网,亦可在工作生活中提供便利。理论上,任何接入互联网的计算机都是可访问的,但是如果目标主机处于内网,而我们又想和该目标主机进行通信的话,就需要借助一些端口转发工具来达到我们的目的。
二、端口转发
把端口接收到的流量转发到另外一个端口,可以是本机的端口,也可以是其它网络的端口。
实现原理:基于传输层协议,把socket字节流原封不动进行转发。
弊端:如果上层协议有校验,会出错。比如HTTP协议
中部分WEB服务会校验host头,导致HTTP连接中断。
2.1 简单端口转发
域C可访问域B,不可访问域A。172.16.1.1
把172.16.2.1
的SSH服务22
端口转发到自己的8022
端口,192.168.1.2
可通过访问172.16.1.1:8022
端口连接172.16.2.1
的SSH服务。
实现方法:
- Windows:
netsh int portproxy
,如:netsh interface portproxy add v4tov4 listenport=8022 connectport=22 connectaddress=172.16.2.1
- Linux:
socat、iptables DNAT+SNAT
,如:socat tcp-l:8022,reuseaddr,fork tcp:172.16.2.1:22,reuseaddr
- lcx
- ew
- 其它
2.2 反弹端口转发
局域网B内PC1无法直接访问局域网A内机器,把局域网A服务器172.16.2.1:22端口转发到公网服务器1.1.1.1:8022端口,这样可以让PC1通过公网访问该机器。
实现方法:
- SSH远程转发
- ngrok
- nps
- shootback
三、socks转发
socks转发与端口转发类似,但是效果不同,端口转发效果只能访问单个端口的服务,socks转发可以访问整个目标网络。与VP*N效果类似,但是不能转发传输层以下的包。
3.1 简单socks转发
实现方法:
- 小飞机
- ew
- nps
- reGeorg(webshell)
- 冰歇(webshell)
3.2 反弹socks转发
socks服务器位于内网,外部机器通过公网访问反弹的socks端口来访问内网。
实现方法: - 小飞机+反弹端口
- ew
- nps
- 其它socks服务+反弹端口
四、SSH代理隧道
4.1 使用SSH动态端口转发
需求
使用工作PC访问公司内网服务器,登陆内网网站、登陆内网服务器。
网络拓扑
工作PC可使用SSH连接123.123.123.123:2222登陆到内网服务器A,其它内网端口未做映射
操作步骤
- 工作机使用Xshell新建连接,并填好连接信息,然后打开隧道选项
- 添加动态转发隧道
- 这时候工作机使用浏览器设置
127.0.0.1:9999
为socks5代理,即可访问172.16.1.101:80
- 如果要连接服务器B的3389端口,则需要借助
sockscap64
之类的工具打开,因为Windows远程连接客户端原生不支持代理,需要借助工具强制让它使用代理,这里不多赘述,可参考我的另一篇文章让BurpSuite使用MSF的socks4a代理中解决方法
->步骤
->1
中的sockscap64使用示例原理解释
使用SSH动态端口转发,相当在远程SSH服务器启动了socks5代理服务,本地监听的9999
端口流量将通过SSH隧道转发到SSH服务器,SSH服务器再对外发起网络请求。以上转发亦可使用ssh
命令或者其它SSH客户端实现,具体方法可自行实验。出口数据流向
4.2 使用SSH隧道本地转发
需求
工作PC连接Windows服务器B的远程桌面。
网络拓扑
工作PC可使用SSH连接123.123.123.123:2222
登陆到内网服务器A,其它内网端口未做映射
操作步骤
- 工作机
xshell
创建连接后,在属性
->连接
->隧道
中添加Local
类型转发 - 这时工作机打开远程桌面客户端,通过连接
127.0.0.1:9999
端口,可连接到内网服务器B的3389
端口原理解释
SSH隧道的本地转发,相当于把本地监听的9999
端口接收到的TCP流量,通过SSH隧道转发到远程的SSH服务器A,服务器A再发起TCP连接到服务器B的3389端口。可以看到,本地转发跟动态转发有点相似,不同的是本地转发是转发了一个远程端口
到本地,而动态转发可通过配置代理访问整个远程网络
。
注意:这种方法转发HTTP
端口一般无法成功,因为HTTP协议带有Host
头,服务器端校验Host头后可能会重置该HTTP请求导致无法连接,如果想了解这一细节,不妨抓个包看看。
出口数据流向
4.3 使用SSH隧道远程转发
需求
工作PC-B访问工作PC-A上面的MySQL数据库(3306端口)。
网络拓扑
操作步骤
原理说明
远程转发的功能刚好与本地转发相反,可以把本地监听的端口转发到远程服务器上,可用于办公区的机器需要访问工作机的本地端口时候使用,比如工作机上面配置了数据库服务,监听本地3306端口,通过转发本地3306
端口到远程服务器A的9999
端口上,服务器B可访问工作机的数据库应用。
注意:远程转发默认只能转发到SSH服务器的环回网卡(127.0.0.1),外部网络访问(如本例)需要启动GatewayPorts
配置:
1 | # 编辑sshd 的配置文件/etc/ssh/sshd_config,将GatewayPorts 开关打开: |
出口数据流向
五、代理链工具
强制程序使用代理,让一些不支持代理的工具也能使用socks代理
- proxychains
- sockscap64