linux下的ssh是我们常用的终端管理命令,但是它不光管理终端,还可以转发流量的。
使用ssh的好处是不用将工具上传到目标主机,使用22端口穿透防火墙,并整个传输过程都是加密的。
-C 压缩传输,增加传输的效率
-f 将SSH传输放在后台执行
-N 建立静默连接,就是建立了连接
-g 允许远程主机连接本地用于转发端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发
-P 指定SSH的端口
ssh有三种转发模式:本地端口、远程端口和动态端口转发
ssh端口转发前提是:拿下了一台linux存在ssh服务,并知道他的用户密码,然后以ssh连接为隧道进行端口转发
将发送给本地的请求通过ssh隧道转发给目标端口,我们可以实现访问本地端口来访问目标端口的信息
ssh -CfNg 用户名@ssh机器IP -L <本地ip>:<本地端口>:<目标ip>:<目标端口>
//<本地ip>为空则绑定本地所有ip
场景1: 攻击机A,一台linux主机B(192.168.10.6,已知道密码),我要通过A主机的8899端口访问B的22或其他端口
A主机ssh连接B,然后将A本地的8899端口转发到B本地的22端口
ssh -fN xiaogang@192.168.10.6 -L 8899:127.0.0.1:22
此时我能访问A的127.0.0.1:8899端口,从而转发到B的127.0.0.1:22端口
场景2:一台A主机,一台linux主机B(192.168.10.6)和内网主机C(192.168.10.27),C的web服务(80端口)只能B访问
我要通过A主机的7788端口以B为跳转访问的C的web服务
A主机ssh连接B,然后-L将A的7788端口转发到C的80端口
ssh -fN xiaogang@192.168.10.6 -L 7788:192.168.10.27:80
此时A主机访问127.0.0.1:7788成功访问到C的web信息
将远程主机端口的请求通过ssh隧道转发给本地主机的端口
ssh -CfNg user@ssh机器IP -R <远程ip>:<远程端口>:<目标ip>:<目标端口>
场景1:一台linux主机B(有公网ip),一台B主机没公网ip,我要通过访问A外网的8080端口访问B主机的web服务
由于我们B没有外网ip,不能使用A主机连接B进行本地转发,所以我们需要使用B主机连接A主机,-R进行反向转发
ssh -CfNg xiaogang@192.168.10.6 -R 8080:127.0.0.1:80
netstat -tulnp | grep "8080"
这时我们用A主机测试127.0.0.1:8080,可以访问到B主机的web信息
但是尝试访问A的外网IP发现并不能访问,网上查了很多资料还是不能直接绑定外网ip
所以我们只能通过别的操作,将A主机的127.0.0.1:8080转发到外网IP的端口
本地和远程转发只能一对一端口转发,想访问别的端口还需要重新设定转发,所以有了动态转发
动态端口转发是只绑定一个本地端口,目标地址端口不固定,而是根据我们的请求决定。其实在这里 SSH 就是创建了个 SOCKS 代理服务
ssh -CfNg 用户名@ssh机器IP -D <本地ip>:<本地端口>
场景:攻击机A,一台外网服务器B(192.168.10.6,10.10.10.2),内网主机C、D、E(10.10.10.0/24),C、D、E只能B访问。实现以B主机为隧道访问内网所有主机的所有端口
ssh -CfNg xiaogang@192.168.10.6 -D 127.0.0.1:1080
这时候A主机的1080就是个socks代理,浏览器设置代理或设置全局代理后,就可以访问C、D、E内网主机了。
本文始发于微信公众号(XG小刚):内网穿透-ssh转发技术
评论