DNS服务器配置

DNS域传送漏洞早有耳闻,但在实际的场景中没有碰到过,也不知道如何寻找该漏洞,以及该漏洞产生的原因及修复方法。因此就该漏洞特搭建一个DNS服务器以学习该漏洞出现的原因,修复方法及寻找方式,顺便学习下DNS服务器的搭建及配置。

Linux中常用的有两个DNS服务器软件,一个是Bind,另一个就是DNSMasq。Window Server在安装DC时需要创建DNS服务器,具体如何使用请大家自行百度,本文不会设置Windows中DNS服务器的配置。
Bind与DNSMasq是linux系统下的两个比较主流的DNS服务管理软件。其中DNSmasq与Bind相比比较轻量,适合小型的局域网中使用,Bind比较适合大型公司中DNS服务器的搭建,其配置相对比较复杂,但是功能强大。

环境介绍

  • Kali-Rolling
  • DNSMasq 2.77

DNS相关知识

DNS主要负责将域名解析成IP地址,也能够将IP地址解析成主机名。

DNS中的域

在DNS中是分域的,一个完整的域名域名查询需要查询不同的域,如www.baidu.com。需要查询”.”域(根域),然后根域的DNS服务器返回com域的地址,之后com域的DNS服务器返回baidu.com域的DNS地址。最后baidu.com域的DNS服务器返回www.baidu.com主机的地址。可以看到一个域就是地址范围。

DNS的查询

DNS主要利用域名查找主机名,但是DNS服务器是分层级的。上层的DNS会知道下层DNS服务器,但是不会知道下下层的DNS。因此在进行DNS查询时有两种方式,一种是递归式,一种是迭代式。

递归式查询

递归式查询是指DNS服务器负责帮忙进行查询,即当该DNS服务器收到DNS查询请求后,会帮忙向其它DNS服务器查询该请求,当接受到响应之后,再j将响应返回给查询者。比较适合端的查询,有点类似于代理。

迭代式查询

迭代式查询除了能够明确知道主机名之外,不会负责帮忙查询,只会讲其知道的域的地址返回给查询者,然后让查询者自己去进行查询。比较适合做骨干节点的DNS服务器。

DNSMasq

DNSMasq是一款轻量级的DHCP和DNS缓存服务器。根据不同的配置,其既可以实现DNS服务器的功能,也可以实现DHCP的功能

安装

直接使用apt-get install dnsmasq部署安装。

基本配置

DNSMasq在进行DNS查询时解析的顺序为先解析/etc/hosts文件,然后解析dnsmasq.d目录下的配置文件,最后才解析dnsmasq.conf文件。且hosts文件和dnsmasq.d目录中的文件会覆盖掉dnsmasq.conf文件中的配置。通过dnsmasq.conf文件中的配置也可以对DNSMasq精确控制DNS的解析。
关于DNSMasq配置网上有大量的文章可以参考,本文主要从当中找到几个比较主要的配置进行讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 定义DNSMasq从哪里获取上游DNS服务器的地址,默认是从/etc/resolv.conf中获取(该文件默认只能配置3个nameserver,可以通过指定resolv-file的形式绕过该限制)。
resolv-file=
# 不读取resolv-file来确定上游文件服务器的路径
no-resolv
# 严格按照resolv-file中指定的nameserver顺序进行域名解析
stric-order
# 不加载本地的/etc/hosts
no-hosts
# 读取额外的hosts文件路径,可以多次指定。如果是目录,则读取目录中的文件
addn-hosts=
# 记录DNS查询日志,如果指定log-quries=extra,那么在每行的开始处都有额外的信息
log-quries
# 设置日志记录器,即日志记录的位置。默认为:Daemon,'-' 为stdout
log-facility=facility or file_path
# 如果反向查找的是私有地址如192.168.x.x,。则仅从hosts文件查找,不再转发到上游服务器
bogus-priv
# 对于任何解析到该IP的域名,将响应NXDOMAIN使其解析失效,可以多次指定(用来防止无效域名被劫持到广告页面)
bogus-nxdomain=
# 忽略指定地址的A记录查询回复,如果某个域名在上游服务器中查询的地址在ignore-address中,则忽略。
ignore-address=<ipaddr>
# 拒绝解析包含私有IP地址的域名(防止DNS劫持攻击?)
stop-dns-rebind
rebind-localhost-ok
# 有选择的忽略域名的rebind行为
rebind-domain-ok=<url>
# 为某一域名指定查询的DNS服务器
server=/test.com/x.x.x.x
# 将任何域名解析成固定IP
address=/domain/ipaddr
# 监听的地址或接口
listen-address=x.x.x.x

设置权威DNS服务器

DNSMasq也可以作为权威服务器使用。在配置权威服务器时需要借助外部的DNS服务器。

  1. 开启DNSmasq作为权威服务器的配置
    编辑/etc/dnsmasq.conf文件,添加如下两行:
    interface是DNSMasq服务器监听的网络接口,该接口需要有一个公网IP地址。

    1
    2
    3
    4
    # 开启DNSMasq作为权威服务器的功能,配置其域名与接口
    auth-server=our.domain.com,interface
    # 配置DNSMasq作为权威服务器响应的DNS域
    auth-zone=our.domain.com
  2. 配置外部DNS服务器指向该服务器

    1
    2
    our.domain.com A xx.xx.xx.xx
    our.domain.com NS our.domain.com
  3. 开启域传送
    编辑/etc/dnsmasq.conf文件:
    可以利用auth-peer设置防止开启了域传送功能的主机向任意主机发送域名信息
    DNSMasq不支持作为从DNS服务器,即不支持使用DNS域传送技术从其它DNS服务器上获取DNS信息

    1
    2
    3
    4
    # 开启DNS 域传送功能(根据测试该值可以为空,如果开启了该功能即使不设置auth-peer便会存在域传送漏洞)
    auth-sec-servers=
    # 配置可以进行域传送的主机IP
    auth-peer=xx.xx.xx.xx

Bind

Bind与DNSMasq相比比较重量,且其配置也比较复杂,但其胜在功能强大。

安装

apt-get install bind9

配置

bind服务器的主配置文件为/etc/bind/named.conf,DNS服务器的程序启动时会读取该文件。named.conf会包含三个文件/etc/bind/named.conf.options/etc/bind/named.conf.local/etc/bind/named.conf.default-zones

配置文件的作用

每个配置文件的作用没有硬性的规定,只不过是在配置中根据习惯在不同的文件中配置不同的选项。本文只设计一些比较主要的配置,详细信息可测参考参考文档2。

named.conf.options

DNS服务器中options选项所在的配置文件。该配置文件中的参数会影响到DNS服务器的运行行为。该文件中的常见配置如下:

1
2
3
4
5
6
options {
forwarders { // 如果该DNS服务器无法解析DNS请求,会将请求转发至转发器中配置的DNS服务器。多个地址使用分号分隔。
8.8.8.8;
};
forward only; // 将DNS服务器配置为仅转发服务器(递归型)。默认是forward first,即转发优先,转发失败才通过本地解析。
};

named.conf.local

该文件主要用于配置DNS服务器负责解析的域,域名的正向解析,反向解析都会在该文件中进行配置。该文件一般会通过包含其它文件的方式进行配置。

  • 正向解析配置
    name.conf.local文件的配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 定义了DNS服务器正向解析的域
    zone "mediahost.cn" IN{ // zone 后接的域表示自定义的域名,IN是internet的简称,可以省略。
    // 主DNS的配置
    type master; // 定义该域的类型(master/slave/stub/hint/forward)中的一种
    file "/etc/bind/db.mediahost.cn"; //定义该域的区域数据文件
    // 从 DNS的配置
    // type slave;
    // masters {xxx.xxx.xxx.xxx;};
    // file "/file/path"; 可选,将区域文件数据备份至该文件当中
    allow-transfer {192.168.0.1}; // 配置允许域传送的主机
    };

默认allow-transfer的值为any,即任意的主机均可从该主机上执行区域传送

db.mediahost.cn文件的配置:
// 主要定义了域中各个域名的解析地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$TTL 604800 // 表示缓存时间,即查询该域中记录时肯定答案的缓存时间长度。
$ORIGIN mediahost.cn. // 表示定义的`$ORIGIN`的起点值为根域符号,后面可以使用`@`符号来引用该值
@ IN SOA mediahost.cn. admin.mediahost.cn. ( // SOA记录,每个区域文件中的第一个资源记录定义行都要是SOA记录,表明该DNS为主DNS。格式为:根域 IN SOA 解析域(zone中的值) 邮件地址("@"有特殊含义,利用"."代替)
; 这里面的配置与slave DNS服务器的数据获取相关,slave DNS根据这里面的配置获取主DNS中的数据
1 ; serial num slave DNS根据该值判断主DNS中数据是否发生变化
3h ; refresh time slave DNS的刷新时间,即多久slave DNS同步一次数据
1h ; retry time slave DNS同步失败后等候的时间
1w ; expire time 记录逾期时间,slave DNS更新失败后,多久后放弃
1h ) ; negative time slave DNS 最小默认TTL值,前面没有定义的话,以该值为准。

mediahost.cn. IN NS www.mediahost.cn. // NS记录,表明域mediahost.cn.中的DNS服务器为www.meidhost.cn.(指明域的DNS主机)
mediahost.cn. IN NS salve.mediahost.cn. // 从DNS服务器的NS记录

www.mediahost.cn. IN A 192.168.0.121 // A 记录,定义主机对应的IP
slave.mediahost.cn. IN A 192.168.0.129 // 从DNS服务器对应的IP
a.mediahost.cn. IN A 192.168.0.123
b.mediahost.cn. IN A 192.168.0.124
c.mediahost.cn. IN A 192.168.0.125
d.mediahost.cn. IN A 192.168.0.126

www1.mediahost.cn IN CNAME a.mediahost.cn // CNAME记录,存储的是canonical name的别名。即www1.mediahost.cn是a.mediahost.cn的别名,当解析www1.mediahost.cn域名时会解析至a.mediahost.cn这个域名上。

  • 反向解析配置
    /etc/name.conf中配置zone *.in-addr.arpa,其中*是点分十进制IP的反写(例如127.0.0.1反写后为1.0.0.127),可以反写IP后的任意一段长度,长度位数不同,在区域文件中需要补全的数值就不同。
1
2
3
4
zone  "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.0.168.192"; // 指定反向记录文件位置
};

db.0.168.192文件的配置:

1
2
3
4
5
6
7
8
9
10
$TTL 1D; // 定义超时时间

@ IN SOA 121 admin.mediahost.cn. (1 3h 1h 1w 1h ); // SOA(Start of Authority)记录,注意反向域名解析中也需要配置该条记录
IN NS www.medihost.cn. // 指定域名服务器(注意前面的空格)

121 IN PTR www.meiahost.cn. // 反向域名记录,省略了zone中的一些记录(写全会解析不出来)。
123 IN PTR a.meiahost.cn.
124 IN PTR b.meiahost.cn.
125 IN PTR c.meiahost.cn.
126 IN PTR d.meiahost.cn.

域传送漏洞的查找

域传送漏洞只会存在权威DNS服务器上,属于配置不当造成的一种漏洞。由上面的配置步骤可以看到,如果dnsmasq作为权威DNS服务器配置了auth-sec-servers=选项,Bind服务器未设置allow-transfer选项,均会引起域传送漏洞。

nslookup

  1. 利用nslookup命令进入nslookup交互式shell
  2. 利用server nameserver命令指定DNS服务器
  3. 利用ls domain命令查询域传送
    Kali中的nslookup未实现ls命令,而win10中的则可以
    windows中的bat脚本:echo ls %1 | nslookup - %2,%1:表示域名;%2:表示nameserver的IP地址。

nmap

nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain=domain -p XX -Pn namerserve_ip

dig

dig @nameserver axfr domain
@nameserer:表示域名服务器
axfr:表示域传送指令
domain:表示要查询的域名

参考文档

  1. DNSMasq详解及配置
  2. DNS & bind从基础到深入