DNS隧道基础
1 | DNS隧道,是隧道技术中的一种。当我们的HTTP、HTTPS这样的上层协议、正反向端口转发都失败的时候,可以尝试使用DNS隧道。DNS隧道很难防范,因为平时的业务也好,使用也罢,难免会用到DNS协议进行解析,所以防火墙大多对DNS的流量是放行状态。这时候,如果我们在不出网机器构造一个恶意的域名(***.xxx.ga),本地的DNS服务器无法给出回答时,就会以迭代查询的方式通过互联网定位到所查询域的权威DNS服务器。最后,这条DNS请求会落到我们提前搭建好的恶意DNS服务器上,于是乎,我们的不出网主机就和恶意DNS服务器交流上了。 |
搭建DNS隧道的工具目前有iodine,dnscat,dns2tcp等。
基础知识
DNS的集中资源记录类型
1 | 1.主机记录(A记录) |
DNS协议解析过程
dns协议解析过程分为两种,迭代查询和递归查询。
迭代查询:
1 | 本地域名服务器像根域名服务器发送请求报文,根域名服务器直接给出ip地址或者告诉本地域名服务器下一步应该去向另一个域名服务器A进行查询。同理,A域名服务器直接给出ip地址或者告诉本地域名服务器下一步应该去查询B域名服务器。过程以此类推,知道找到ip地址为止。 |
递归查询:
1 | 客户机向本地域名服务器查询,如果本地域名服务器的缓存中没有需要查询的ip地址,那么本地域名服务器会以客户机的身份(代替本机查询),向根域名服务器发送请求报文。 |
DNS隧道
DNS隧道是隐蔽信道的一种,通过将其他协议封装在DNS协议中进行通信。封装由客户端完成,将DNS流量还原成正常的流量由服务器完成。DNS隧道攻击利用了防火墙放行DNS单特点以及协议解析流程来实现的。
而DNS隧道也要分为两种,一种是直连型,一种是域名型DNS隧道(中继)。
1 | 直连型DNS隧道: |
1 | 域名型DNS隧道(中继): |
1 | DNS隧道建立的过程: |
1 | DNS Beacon原理: |
发送端将隐蔽数据信息切分并且编码后封装到DNS报文域名中进行传输,每一级域名长度为63,域名总长度不超过253,接收端收到DNS报文后提取域名中的隐蔽信息字段进行解码重组还原得到IP报文。主要的工具有DNSCat,Iodine等
实践
需要一个域名和一个公网服务器。
iodine DNS隧道搭建
值得一提到是iodine(碘)的原子序数为53,这恰好是DNS端口号,故取名为iodine。
apt install iodine
命令会同时安装服务端与客户端。
1 | dnspod:https://www.dnspod.cn,在dnspod中添加刚申请的域名,然后dnspod会给出两条dns服务器地址。 |
等了一天DNS生效,继续配置。
dnspod得到域名的管理权之后,在里面添加两条解析记录。
1 | 第一条A类记录,告诉域名系统,"www.xxx"的IP地址是"121.xxx.xxx.xxx"。 |
但是更改之后,也不会马上生效,需要等待一段时间,等各地的运营商的缓存刷新才可以。
服务端:
在公网服务器上部署iodine服务端。(需要root权限运行)
1 | iodined -f -c -P 123.com 192.168.200.1 ns.xxx -DD |
其中ns.xxx就是在腾讯dns设置的ns记录那个
这里的192.168.200.1为自定义局域网虚拟IP地址,建议不要与现有网段冲突。
执行完该命令之后会新生成一个dns0虚拟网卡,ip地址就是刚才命令中输入的ip地址(192.168.200.1)。
1 | **ubuntu默认53端口是打开的,通过下面命令关闭掉53端口** |
客户端:
1 | 客户端我使用的kali,kali自带iodine工具。 |
值得注意的是:dns服务使用的是udp的53端口,而不是tcp的。
同时即使链接成功了也会产生编码错误,在客户端使用如下命令解决。
iodine -f -P 123.com ns.xxx -M 200 -O base64
这边已经链接成功了,而且也给我们分配了一个虚拟ip,200.3
现在我们通过客户端ping一下服务端的虚拟ip,发现ping的通,则dns隧道建立成功。
(就是延迟有点高的啊)
frp搭建隧道
先在服务器上打开frp
随后在本地搭建frp客户端
注意,这里的ip就不是公网上的了,而是dns隧道中服务器的虚拟ip,现在我们相当于在6005端口中又嵌套了一个socket隧道。(上面配置搞忘打一个中括号了,记得加上)
直接访问公网的6005端口
可以看到成功建立链接,就是有点小慢(毕竟是dns隧道。
为了做实验,我还专门吧服务器的其他端口用防火墙拦截了,只留下了一个dns的端口,结果还是成功的。(当然对面的服务器必须把你开socket代理的端口打开才可以哦,是tcp的,)
当然后续还有一些工具可以搭建dns隧道,后面我的博客中会陆续补充在工具分类里面。(dnscat2、dns2tcp)
各种工具的利用环境
1.外->内
iodine和dnscat2使用环境:目标是内网,并且只有dns出网的情况下,通过自己的公网服务器搭建到目标的dns隧道,从而通过公网服务器代理进入目标内网,遨游目标内网。
2.内->外
dns2tcp使用的环境是:自己在一个内网里面,自己所处的环境不出网,但是dns可以出网,就可以用过dns2tcp搭建一个dns隧道,从而可以访问到互联网环境。
典型环境:在学校连接到wifi之后,必须要认证登陆,不然不能上网,但是浏览器又能加载出登陆界面,此情况就是dns出网,可以通过dns2tcp搭建dns隧道绕过认证登陆。
(图是偷的外面的,有水印就别建议了)