使用SSH协议搭建隧道(附搭建环境超详细)
0x00 前言 SSH协议
在内网中,几乎所有的Linux/UNIX服务器和网络设备都支持SSH协议。SSH协议通常可以通过防火墙和边界设备,因此经常成为攻击者利用的目标。由于SSH协议传输过程中使用了加密,因此很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者利用SSH端口隧道可以突破防火墙的限制,建立之前无法建立的TCP连接。
一个普通的SSH命令示例如下:
ssh root@192.168.1.1
创建SSH隧道常用参数说明如下:
-C
:压缩传输,提高传输速度。-f
:将SSH传输转至后台执行,不占用当前的Shell。-N
:建立静默连接(建立了连接,但看不到具体会话)。-g
:允许远程主机连接本地用于转发的端口。-L
:本地端口转发。-R
:远程端口转发。-D
:动态转发(socks代理)。-P
:指定SSH端口。
0x01 本地转发
下图展示了测试环境,左侧为攻击者VPS(Kali Linux 192.168.200.23),右侧是一个小型内网,包含三台服务器。外部VPS可以访问内网Web服务器,但不能访问WIN7,而内网Web服务器和WIN7可以互相访问。测试目标是通过Web服务器作为跳板,访问WIN7的3389端口。
配置说明:
- 192.168.200.10(仅主机)
- 192.168.200.23(仅主机)
- 192.168.100.34(NAT)、192.168.200.34(仅主机)
- 192.168.100.7(NAT)
通过以下命令,在Web服务器192.168.200.34上将内网WIN7的3389端口映射到VPS机器192.168.200.23的2333端口,然后访问VPS的2333端口即可访问192.168.100.7的3389端口。在VPS上执行的命令如下,会要求输入Web服务器(跳板机)的密码:
ssh -CfNg -L 2333(VPS端口):192.168.100.7(目标主机):3389(目标端口)
常用参数说明如下:
-C
:压缩传输,提高传输速度。-f
:将SSH传输转至后台执行,不占用当前的Shell。-N
:建立静默连接(建立了连接,但看不到具体会话)。-g
:允许远程主机连接本地用于转发的端口。-L
:本地端口转发。-R
:远程端口转发。-D
:动态转发(socks代理)。-P
:指定SSH端口。
通过以下命令,检查本地2333端口是否已连接。可以看到,在进行本地映射时,本地的SSH进程会监听2333端口。
netstat -an | grep 2333
通过以下命令,在本地系统中访问VPS的2333端口。可以发现,已经与WIN7(192.168.100.7)的3389端口建立连接。
telnet localhost 2333
SSH进程的本地端口映射可以将本地(客户机)的某个端口转发到远端指定机器的指定端口。本地端口转发则是在本地(客户机)监听一个端口,所有访问这个端口的数据都会通过SSH隧道传输到远端的对应端口。
0x02 远程转发
正在研究中,暂无具体内容。
192.168.200.20不能访问192.168.100.34,但是192.168.100.34可以访问192.168.200.20。
0x03 动态转发
配置说明:
- 192.168.200.10(仅主机)
- 192.168.200.23(仅主机)
- 192.168.100.34(NAT)、192.168.200.34(仅主机)
- 192.168.100.7(NAT)
在Linux(192.168.200.23)上执行以下命令,并输入192.168.200.34的密码,然后查看是否运行了9999端口。
ssh -CfNg -D 9999 192.168.200.34
接下来,在Linux(192.168.200.23)上的浏览器中打开设置,配置网络代理,通过浏览器访问内网WIN7(192.168.200.7)。选择“手动代理配置” > “SOCKS主机”127.0.0.1, > “端口”9999。
通过网络代理访问WIN7(192.168.100.7)。动态端口映射建立了一个SSH加密的SOCKS4/5代理通道,任何支持SOCK4/5协议的程序都可以通过这个加密通道进行代理访问。
总结
在内网中,几乎所有的Linux/UNIX服务器和网络设备都支持SSH协议。SSH协议通常可以通过防火墙和边界设备,因此经常成为攻击者利用的目标。由于SSH协议传输过程中使用了加密,因此很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者利用SSH端口隧道可以突破防火墙的限制,建立之前无法建立的TCP连接。