ssh隧道
来自我超怕的 - https://www.cnblogs.com/iAmSoScArEd/p/17120954.html
ssh在线官方命令详解 https://man.openbsd.org/ssh
也可以执行 man ssh
查看详细命令
为什么选择通过SSH隧道转发? 隐蔽、普遍。
1、本地转发
通常用在 攻击主机与被攻击主机无法互通,但跳板机可互通双方的场景,也可用在隐藏攻击机时使用跳板
攻击主机(192.168.0.1)
被攻击主机(10.0.1.1)
跳板机(对外路由IP 192.168.2.1, 内网路由IP10.0.2.1)
1、攻击机执行ssh -CfNg -L 33890:10.0.1.1:3389 root@192.168.2.1
需要输入跳板机的密码。
解释:将被攻击主机的3389端口通过跳板机转发映射到本地的33890端口,连接后使用 rdp连接本地主机的127.0.0.1 的33890端口即可。其他端口同理。
-C 要求压缩所有数据(包括stdin、stdout、stderr,以及转发的X11、TCP和UNIX域连接的数据) 加快传输速度。
压缩算法与gzip(1)使用的算法相同。压缩在调制解调器线路和其他慢速连接上是可取的,但在快速网络上只会降低速度而不会增加传输速度。
-f 要求ssh在命令执行前转入后台。一般用在如果ssh需要密码或通行证,用户希望在后台进行。这个命令隐含了-n选项。
-n 重定向来自/dev/null的stdin(实际上是防止从stdin读取)。当ssh在后台运行时,必须使用这个功能。
-N 不执行远程命令。这对只用来转发端口很有用。
-g 允许远程主机连接到本地转发的端口。如果在多路连接上使用,那么这个选项必须在主进程上指定。(比如允许跳板主机连接本地的33890)
-L 指定本地主机上给定的TCP端口或Unix套接字的连接将被转发到远程的给定主机和端口或Unix套接字上。
它的工作原理是分配一个套接字来监听本地的TCP端口,可以选择与指定的bind_address绑定,或者与Unix套接字绑定。
每当连接到本地端口或套接字时,连接就会在安全通道上被转发,并从远程机器上向主机端口hostport或Unix套接字remote_socket建立连接。
端口转发也可以在配置文件中指定。只有超级用户可以转发特权端口。IPv6地址可以通过把地址放在方括号里来指定。
支持的参数格式:
-L [bind_address:]port:host:hostport
-L [bind_address:]port:remote_socket
-L local_socket:host:hostport
-L local_socket:remote_socket
2、远程转发
通常用在 攻击主机与被攻击主机无法互通,但跳板机可互通双方的场景,也可用在隐藏攻击机时使用跳板
攻击主机(192.168.0.1)
被攻击主机(10.0.1.1)
跳板机(对外路由IP 192.168.2.1, 内网路由IP10.0.2.1)
1、跳板机执行ssh -CfNg -R 33890:10.0.1.1:3389 root@192.168.0.1
需要输入攻击机的密码。
解释:大致同本地转发,只不过换了一个主机转发。连接后使用 rdp连接本地主机的127.0.0.1 的33890端口即可。其他端口同理。
-R 指定远程(服务器)主机上给定的TCP端口或Unix套接字的连接将被转发到本地。
这通过分配一个套接字来监听远程的TCP端口或Unix套接字来实现。
每当连接到这个端口或Unix套接字时,连接就会被转发到安全通道上,并且从本地机器连接到由host port hostport或local_socket指定的明确目的地
如果没有指定明确的目的地,ssh将作为一个SOCKS 4/5代理,将连接转发到远程SOCKS客户端所要求的目的地。
端口转发也可以在配置文件中指定。只有在远程机器上以root身份登录时,才能转发特权端口。
可以通过把地址放在方括号里来指定IPv6地址。
默认情况下,服务器上的TCP监听套接字将只绑定到回环接口。这可以通过指定一个bind_address来重写。
一个空的bind_address或者地址'*',表示远程套接字应该监听所有的接口。。
3、动态转发
通常用在 攻击主机与被攻击主机无法互通,但跳板机可互通双方的场景,也可用在隐藏攻击机时使用跳板
攻击主机(192.168.0.1)
被攻击主机(10.0.1.1)
跳板机(对外路由IP 192.168.2.1, 内网路由IP10.0.2.1)
1、攻击机执行ssh -CfNg -D 5678 root@192.168.2.1
需要输入跳板机的密码。
2、攻击机此时已经通过5678端口与跳板机建立socks通道,可以在本机需要使用跳板机网络的地方配置socks代理即可正常访问,终端也有配置代理的命令,可以自行谷歌搜索如何设置。
使用格式 -D [bind_address:]port
-D 指定一个本地的 "动态 "应用级端口转发。它的工作原理是在本地分配一个套接字来监听端口,可以选择绑定到指定的bind_address。每当连接到这个端口时,连接就会通过安全通道转发,然后应用协议被用来确定从远程机器连接到哪里。目前支持SOCKS4和SOCKS5协议,ssh将作为一个SOCKS服务器。只有root可以转发特权端口。动态端口转发也可以在配置文件中指定。
可以用方括号括住地址来指定IPv6地址。只有超级用户可以转发特权端口。默认情况下,本地端口是按照GatewayPorts的设置来绑定的。然而,可以使用明确的bind_address来将连接绑定到一个特定的地址。bind_address为 "localhost "表示监听端口仅用于本地,而空地址或'*'表示该端口应从所有接口可用。
如:需要访问被攻击主机web应用,可通过谷歌浏览器的 Proxy Switcher扩展快速配置代理,访问跳板机所在内网环境http://10.0.1.1:8080 等任意web应用。
4、如何防御
只是临时想到的一些思路,并没有完全体系思考,供参考
1、企业禁止账号密码登录SSH,经允许以堡垒机密钥方式登录
2、重要主机设置SSH 连接IP白名单
3、禁止内网主机SSH外连