0%

DNS服务以及DNS域传送漏洞

前言

​ 疫情影响,宅在家里,开学推迟,要上网课,有课名叫,网络攻防,要上实验,网上靶机,可是靶机,实在不行,自己搭建,两眼蒙蔽,从头做起,选择放弃。(哭)

​ 这次要做的实验内容和DNS域传送漏洞有关,其实也是用工具进行信息收集,之前忽略了信息收集这块,觉得不太重要,但是现在回头来看,这是最重要的一部分,自己也回头补补。DNS域名查询也很重要,要不渗透前都不知道目标是谁。

DNS服务:因特网的目录服务

​ 之前看过《计算机网络:自顶向下方法》这本书对DNS的讲解,确实不错,但是当时读的有些晦涩难懂,现在回头去看有些地方确实重新理解到了。现在重新理解回忆一波DNS。

DNS定义

​ 在因特网的主机中,有一种标识方式就是用它的主机名(hostname),例如:www.baidu.comwww.4399.com等,但是主机名并没有透漏多少在因特网中的位置信息,实际上在因特网上的主机通信是用IP地址来进行的。人们喜欢用主机名的标识方式使用,而路由器喜欢定长,有层次结构的IP地址。为了折中,就产生了DNS(Domain Name System)域名系统,用于进行主机名到IP地址转换的目录结构。

​ DNS是:

  1. 一个由分层的DNS服务器实现的分布式数据库。
  2. 一个使得主机能查询分布式数据库的应用层协议。

​ DNS服务器通常是运行BIND软件的UNIX机器,DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议,使用TCP53端口和UDP53端口。(DNS只有两种报文,查询/回答报文)

DNS工作过程

例如用户在浏览器中请求URL:www.example.com/index.html则会发生以下过程:

  1. 浏览器从上述URL中抽取主机名www.example.com并交给同一机器上运行的DNS客户端
  2. DNS客户端向DNS服务器发送一个包含主机名的请求
  3. DNS客户端最终会收到一份回答报文,其中含有对应与该主机名的IP地址
  4. 浏览器收到来自DNS客户端的该IP地,它能向位于该IP地址的80端口的HTTP服务器进程HTTP请求

DNS的其他服务

  • 主机别名:有复杂主机名的主机可以拥有一个或多个别名,例如一台规范主机名为relay1.west-coast.enterprise.com可能有两个别名enterprise.com或者www.enterprise.com。应用程序可以调用主机别名来获得规范主机名和IP地址
  • 邮件服务器别名:例如example@gmail.com,中邮件服务器别名为gmail.com比它的规范主机名好记的多
  • 负载分配:用于冗余的服务器或者具有CDN的服务器上。要访问的站点被分布在多台服务器上,具有不同的IP地址,因此一个IP地址集合与同一个规范主机名所联系。当客户对其发送一个DNS请求时候,DNS服务器用IP地址的整个集合进行响应,但在每个回答中循环这些地址次序。

DNS组织方式

DNS结构

​ 从DNS的工作方式来看,DNS不可能是单一集中的数据库,而是使用大量的DNS服务器,以层次方式组织。大致来说DNS有三种基本类型:根DNS服务器,顶级域(TLD),DNS服务器,权威服务器。

3cJecF.png

​ 如果你的请求没有命中本地DNS服务器缓存,那么这个缓存服务器就会自己进行一次标准查询,然后再把结果缓存起来,简单来说就是从根服务器开始一级一级的问。我们以前经常谈到根服务器的重要性其实就体现在这里了,它保留了对所有域名的起始解释权。

​ 根服务器拥有一切域名的起始解释权,但是如果你去问根服务器它是不会直接告诉你最终答案的。因为如果它要存储所有的记录,那它也太累了,这个负载和开销是惊人的。那它会告诉你什么呢?它会告诉你应该去问谁,也就是它授权下一级服务器来解答你的问题。拟人化这个过程:

  1. 我(本地DNS服务器): root, root 告诉我, example.com 怎么走?
  2. root: 呵呵,你可以去问.com的dns服务器,地址是xxxxxx
  3. 我: .com, .com 告诉我,example.com 怎么走?
  4. .com: 呵呵,你可以去问example.com的dns服务器(dnspod之类的),地址是xxxxxx
  5. 我: dnspod, dnspod 告诉我,example.com 怎么走?
  6. dnspod: 拿着 xxxxxx,走你

​ 这个例子假设TLD服务器直到用于主机的权威DNS服务器的IP地址,一般来说,这种假设不总是正确,相反,TLD服务器只知道某个中间的DNS服务器,该中间的DNS服务器依次才知道用于该主机的权威DNS服务器。上述例子利用了递归查询和迭代查询,从自己主机到本地DNS服务器查询是递归的,本地DNS服务器查询是迭代的。

DNS缓存

​ 实际中,为了改善时延和减少因特网中DNS报文数量,DNS广泛采用了缓存技术。在一个请求链中,某个DNS服务器在收到DNS回答报文时,它能将映射缓存到服务器中,缓存并不是永久的,DNS服务器在一段时间后将丢弃缓存的信息。本地DNS服务器也能够缓存TLD服务器的IP地址,因此允许本地服务器DNS查询绕过查询链中的根DNS服务器。

DNS记录

​ 一条DNS记录就是一个映射关系,它的大致结构是(Name,Value,Type,TTL)其中TTL是该记录的生存时间。

其中Type类型有多种:

(1) A:地址记录(Address),返回域名指向的IP地址。

(2) NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。

(3)MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。

(4)CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的主机别名。

(5)PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名,详见下文。

在DNS数据库中插入记录

​ 如果你刚刚创建了一个新公司,那么你必定要做的第一件事就是在注册登记机构注册域名newcompany.com,则需要向该机构提供你的基本和辅助权威DNS服务器的名字和IP地址,例如为:dns1.newcompany.com和dns2.newcompany.com以及212.212.212.1和212.212.212.2。对这两个权威DNS服务器的每一个,该机构都要确保将一个类型为NS和一个类型为A的记录输入TLD com服务器,特别是对于用于newcompany.com的基本权威服务器。

(newcompany.com, dns1.newcompany.com, NS)

(dns1.newcompany.com, 212.212.212.1, A)

​ 那么此时有个新用户想要访问你的公司主页www.newcompany.com,那么用户的DNS客户端先向本地的DNS服务器发送请求,本地的DNS服务器向TLD com服务器发送请求(如果本地DNS服务器没有缓存TLD com服务器的地址,那么它会先向根DNS服务器发送请求TLD com服务器的地址),TLD com服务器向本地DNS服务器回答上述的两条DNS记录,本地DNS服务器则会根据上述两条记录向公司的权威DNS服务器发送DNS请求报文,而权威DNS服务器会回答一个具有类型为A的DNS记录的DNS报文,里面含有你要请求的站点的IP地址,例如:212.212.71.4,本地的DNS服务器会把这条DNS记录发给用户的DNS客户端并且在服务器中缓存一段时间,用户则会对这个IP地址发起一个TCP连接,并在该连接上发送一个HTTP请求。

参考文章:

  1. https://segmentfault.com/a/1190000002578457
  2. http://www.ruanyifeng.com/blog/2016/06/dns.html

DNS域传送漏洞

漏洞原理

​ DNS作为重要的互联网基础设施,难免成为黑客的重点攻击目标,服务的稳定性尤为重要。DNS服务器分为:主服务器、备份服务器和缓存服务器。在主备服务器之间同步数据库,需要使用“DNS域传送”。域传送是指后备服务器从主服务器拷贝数据,并用得到的数据更新自身数据库。

​ 若DNS服务器配置不当,可能导致匿名用户获取某个域的所有记录。造成整个网络的拓扑结构泄露给潜在的攻击者,包括一些安全性较低的内部主机,如测试服务器。凭借这份网络蓝图,攻击者可以节省很少的扫描时间。

漏洞利用

域传送关键配置项为:配置位置在/etc/named.conf文件中

allow-transfer {ipaddress;}; 通过ip限制可进行域传送的服务器

allow-transfer { key transfer; }; 通过key限制可进行域传送的服务器

测试版本为BIND 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.6,默认安装完毕后,配置项没有allow-transfer 项。如果直接使用默认配置文件进行配置的话(不手动添加allow-transfer项),就会存在dns 域传送漏洞。

3gA8nU.png

可以看到此时DNS服务器域传输失败,说明不存在漏洞。

3gAcAH.png

注释掉这一行,开启任意DNS域传送。

3gA4jf.png

此时可以看到服务器所有的子域名。

漏洞修复

解决域传送问题非常简单,只需要在相应的zone、options中添加allow-transfer限制可以进行同步的服务器就可以了,可以有两种方式:限制IP、使用key认证。