搭建SSH隧道绕过防火墙
起因
来到办公室第一天发现虽然有无线网,但是公司把对github,博客园,B站以及各种论坛的访问都切断了。最离奇的是我的Clash代理竟然也无法正常工作。
仔细研究了一下,发现所有请求先经过内网DNS服务器,并且有全流量设备对请求进行审计。审计规则是域名白名单策略,所有不在白名单内的域名,都会被DNS服务器拒绝。
而Clash代理配置的机场正是通过域名连接的,这就解释为什么clash也无法正常工作。
但是直接访问IP是不受限制的,由此我想可以在自己的云服务器上开启一个web代理,这样可以绕过DNS服务器访问外部网络。
1 | 本机浏览器 -- 云服务器代理服务器 -- 外部网络 |
经过
实现代理服务器有很多种方式,我先使用Tinyproxy工具搭建了一个简单的代理。并且Tinyproxy支持socks代理,可以将流量继续向上游转发。这样一来就可以和云服务器上的clash联动起来,实现对墙外网络的访问。
1 | # Tinyproxy配置socks代理 |
然而我使用手机热点测试一切正常,切换到办公室wifi网络却无法工作。Tinyproxy只支持http协议,而公司的路由似乎对http协议做了某些限制,在本机执行curl命令连接都会被重置。
1 | luckyfuture@aaa MINGW64 ~ |
所有http协议的代理就无法使用了,转头去寻找其它代理工具。其实在内网渗透中,在靶机上配置隧道穿透和代理转发的是基本操作,也有很多工具类似frp,Venom可供使用。只是我担心这些工具的流量会被公司内网的各种安全设备检测到告警,被领导发现搭隧道上外网摸鱼就尴尬了。
SSH隧道
我突然想到ssh的流量是端到端加密的,并且使用ssh也是正常业务范畴,应该不会引起注意。能不能搭建一条SSH隧道呢?
上网一查真的可以,ssh命令除了登陆外还有代理转发功能。只不过网上的教程讲的云山雾罩,看了好几遍才明白我所在场景该怎么操作。下面总结一下。
SSH一共提供了3种端口转发,分别是本地转发(-L参数)、远程转发(-R参数)和动态转发(-D参数)
为方便叙述规定如下:
1 | HostA 本地主机 在内网 |
- 本地转发(-L参数)
1 | ssh -L HostA:PORTA:HostC:PORTC root@HostB |
这条命令的作用是将HostC:PORTC通过HostB的代理映射到HostA:PORTA上来。实现不互通主机之间的端口映射。
我们的需求就可以用这条命令实现
1 | ssh -fN -L 0.0.0.0:7001:127.0.0.1:7891 [email protected] |
对于HostB来说127.0.0.1就是自己。所以这条命令的结果,是将云服务器上的7891端口映射到本地的7001端口。在浏览器中配置代理,所有的流量都会经过ssh转发到云服务器的7891端口也就是clash的监听端口去处理。
1 | 浏览器 -- 本地7001 -- ssh -- 云服务器7891 |
- 远程转发(-R参数)
使用前需要在HostB 的 /etc/ssh/sshd_config配置:
1 | GatewayPorts yes |
1 | ssh -R HostC:PORTC:HostA:PORTA user@HostB |
这条命令的作用是将HostA:PORTA的流量经过HostB代理转发到HostC:PORTC上,实际使用中,HostB和HostC可以是同一台主机。这就实现了内网穿透,将HostA:PORTA映射到了公网。
内网穿透十分危险,在工作环境中慎重使用。出了问题轻则被辞退,重则吃牢饭。
举例
1 | ssh -fN -R 0.0.0.0:12345:127.0.0.1:80 root@hostB |
将本地80端口映射到云服务器12345端口。便可以在公网访问内网web服务。
1 | 浏览器 -- 云服务器12345 -- ssh -- 内网80 |
- 动态转发(-D参数)
1 | ssh -D PORTA user@HostB |
这条命令在本机PORTA创建了一个SOCKS代理,所有通过该SOCKS代理发出的数据包将经过HostB转发出去。
这条命令实现一个最简单的代理隧道,在HostA浏览器里设置使用socks5代理127.0.0.1:PORTA,然后浏览器就可以访问hostB所在网络内的任何IP了。我们的需求也可以用这条命令实现,只不过不能和clash联动。
1 | 浏览器 --- 本机port --- ssh --- 流量转发 |
结果
愉快使用办公室wifi摸鱼。
参考资料
https://github.com/st286/SSH-port-forwarding
https://www.cnblogs.com/zlingh/p/15635870.html