DNS隧道基础

DNS隧道基础

DNS隧道,是隧道技术中的一种。当我们的HTTP、HTTPS这样的上层协议、正反向端口转发都失败的时候,可以尝试使用DNS隧道。DNS隧道很难防范,因为平时的业务也好,使用也罢,难免会用到DNS协议进行解析,所以防火墙大多对DNS的流量是放行状态。这时候,如果我们在不出网机器构造一个恶意的域名(***.xxx.ga),本地的DNS服务器无法给出回答时,就会以迭代查询的方式通过互联网定位到所查询域的权威DNS服务器。最后,这条DNS请求会落到我们提前搭建好的恶意DNS服务器上,于是乎,我们的不出网主机就和恶意DNS服务器交流上了。

搭建DNS隧道的工具目前有iodine,dnscat,dns2tcp等

基础知识

DNS的集中资源记录类型

1.主机记录(A记录)
主机记录可以将DNS中的域名称对应到IPv4地址。
2.PTR
PTR可以定义某个对应的域名。
3.CNAME记录,通常称别名解析
CNAME记录可以将注册的不同域名都转到一个域名记录上,由这个域名记录同意解析管理,与A记录不同的是,CNAME别名记录设置的可以是一个域名的描述而不一定是IP地址。
4.NS(Name Server)记录是域名服务器记录
NS记录用来置顶该域名是由那个DNS服务器来进行解析的,可以吧一个域名的不同二级域名分别只想到不同的DNS系统来解析。
5.TXT记录
TXT记录一般是为某条记录设置说明,比如你新建了一条a.com的TXT记录,TXT记录内容“this is a test TXT record"的字样了。

DNS协议解析过程

dns协议解析过程分为两种,迭代查询和递归查询。

迭代查询:

本地域名服务器像根域名服务器发送请求报文,根域名服务器直接给出ip地址或者告诉本地域名服务器下一步应该去向另一个域名服务器A进行查询。同理,A域名服务器直接给出ip地址或者告诉本地域名服务器下一步应该去查询B域名服务器。过程以此类推,知道找到ip地址为止。

递归查询:

客户机向本地域名服务器查询,如果本地域名服务器的缓存中没有需要查询的ip地址,那么本地域名服务器会以客户机的身份(代替本机查询),向根域名服务器发送请求报文。

DNS隧道

DNS隧道是隐蔽信道的一种,通过将其他协议封装在DNS协议中进行通信。封装由客户端完成,将DNS流量还原成正常的流量由服务器完成。DNS隧道攻击利用了防火墙放行DNS单特点以及协议解析流程来实现的。

而DNS隧道也要分为两种,一种是直连型,一种是域名型DNS隧道(中继)。

直连型DNS隧道:
客户端直接和指定的目标DNS Server进行UDPsocket套接字连接,通过将数据编码封装在DNS协议中进行通信,这种方式速度快,但是隐蔽性比较弱,很容易被探测到,但如果客户端指定了信任的DNS解析服务器,那么将会被白名单限制在外。
域名型DNS隧道(中继):
通过DNS迭代查询实现的中继隧道,比较隐蔽,但同时因为数据包到达目标DNS Server前需要经过多个节点,所以速度上较直连慢很多。中继过程中的一个关键点是对DNS缓存机制的规避,因为如果解析的域名在Local DNS 中已经有缓存,那么Local DNS 就不会继续发送数据包,所以在构造请求中,每次查询的域名需要不同或者是已过期的。
DNS隧道建立的过程:
Step 1:受控PC机将数据封装进DNS数据包里,像局域网内部的本地域名服务器请求查询aaa.com
Step 2:本地域名服务器透过防火墙向根域名服务器发送查询请求
Step 3:经过大量重定向,查询请求最终要aaa.com的权威域名服务器
Step 4:aaa.com权威域名服务器是在攻击者的控制下,解析发送过来的DNS数据包并发送回应包
Step 5:DNS回应包穿透防火墙
Step 6:DNS回应包进入内网
Step 7:本地域名服务器将回应包返回给受控PC机
Step 8:受控PC机解析DNS回应包里的数据,得到新的指令
DNS Beacon原理:
利用DNS请求应答机制作为攻击渗透到命令控制通道,吧C&C服务器指令封装到DNS相应报文中,以此控制被控段主机。

发送端将隐蔽数据信息切分并且编码后封装到DNS报文域名中进行传输,每一级域名长度为63,域名总长度不超过253,接收端收到DNS报文后提取域名中的隐蔽信息字段进行解码重组还原得到IP报文。主要的工具有DNSCat,Iodine等

实践

需要一个域名和一个公网服务器。

iodine DNS隧道搭建

值得一提到是iodine(碘)的原子序数为53,这恰好是DNS端口号,故取名为iodine。

apt install iodine命令会同时安装服务端与客户端。

dnspod:https://www.dnspod.cn,在dnspod中添加刚申请的域名,然后dnspod会给出两条dns服务器地址。

前往域名注册商处修改为 DNSPod 所属服务器。(阿里云中
dns修改后有24-48小时dns生效时间。)

等了一天DNS生效,继续配置。

dnspod得到域名的管理权之后,在里面添加两条解析记录。

第一条A类记录,告诉域名系统,"www.xxx"的IP地址是"121.xxx.xxx.xxx"。

第二条NS记录,告诉域名系统,"ns.xxx"的域名由"www.xxx"进行解析。

到此前期准备工作就已经完成了,已经将域名绑定到了我们的公网服务器上。

image-20221228151559428

但是更改之后,也不会马上生效,需要等待一段时间,等各地的运营商的缓存刷新才可以。

服务端:

在公网服务器上部署iodine服务端。(需要root权限运行)

iodined -f -c -P 123.com 192.168.200.1 ns.xxx -DD

\-f:在前台运行

\-c:禁止检查所有传入请求的客户端IP地址。

\-P:客户端和服务端之间用于验证身份的密码。

\-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。

其中ns.xxx就是在腾讯dns设置的ns记录那个

这里的192.168.200.1为自定义局域网虚拟IP地址,建议不要与现有网段冲突。

执行完该命令之后会新生成一个dns0虚拟网卡,ip地址就是刚才命令中输入的ip地址(192.168.200.1)。

image-20221228162144458

**ubuntu默认53端口是打开的,通过下面命令关闭掉53端口**

rm /etc/resolv.conf&&echo "nameserver x.x.x.x" >> /etc/resolv.conf 配置dns服务器(x.x.x.x改为dns服务器,8.8.8.8等)

systemctl stop systemd-resolved 停止该进程

systemctl disable systemd-resolved 关闭开机自启动

客户端:

客户端我使用的kali,kali自带iodine工具。

iodine -f -P 123.com ns.xxx -M 200

-r:iodine有时会自动将DNS隧道切换为UDP隧道,该参数的作用是强制在任何情况下使用DNS隧道

-M:指定上行主机的大小。

-m:调节最大下行分片的大小。

-f:在前台运行

-T:指定DNS请求类型TYPE,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。

-O:指定数据编码规范。

-P:客户端和服务端之间用于验证身份的密码。

-L:指定是否开启懒惰模式,默认开启。

-I:指定两个请求之间的时间间隔。

值得注意的是:dns服务使用的是udp的53端口,而不是tcp的。

同时即使链接成功了也会产生编码错误,在客户端使用如下命令解决。

iodine -f -P 123.com ns.xxx -M 200 -O base64

image-20221228171835939

这边已经链接成功了,而且也给我们分配了一个虚拟ip,200.3

现在我们通过客户端ping一下服务端的虚拟ip,发现ping的通,则dns隧道建立成功。

image-20221228172735624

(就是延迟有点高的啊)

frp搭建隧道

先在服务器上打开frp

image-20221228173805409

随后在本地搭建frp客户端

image-20221228174532671

注意,这里的ip就不是公网上的了,而是dns隧道中服务器的虚拟ip,现在我们相当于在6005端口中又嵌套了一个socket隧道。(上面配置搞忘打一个中括号了,记得加上)

image-20221228175259660

直接访问公网的6005端口

image-20221228175505332

可以看到成功建立链接,就是有点小慢(毕竟是dns隧道。

为了做实验,我还专门吧服务器的其他端口用防火墙拦截了,只留下了一个dns的端口,结果还是成功的。(当然对面的服务器必须把你开socket代理的端口打开才可以哦,是tcp的,)

当然后续还有一些工具可以搭建dns隧道,后面我的博客中会陆续补充在工具分类里面。(dnscat2dns2tcp

各种工具的利用环境

1.外->内

iodine和dnscat2使用环境:目标是内网,并且只有dns出网的情况下,通过自己的公网服务器搭建到目标的dns隧道,从而通过公网服务器代理进入目标内网,遨游目标内网。

图片

2.内->外

dns2tcp使用的环境是:自己在一个内网里面,自己所处的环境不出网,但是dns可以出网,就可以用过dns2tcp搭建一个dns隧道,从而可以访问到互联网环境。

典型环境:在学校连接到wifi之后,必须要认证登陆,不然不能上网,但是浏览器又能加载出登陆界面,此情况就是dns出网,可以通过dns2tcp搭建dns隧道绕过认证登陆。

图片

(图是偷的外面的,有水印就别建议了)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。