众所周知,DNS服务器分为根、顶级域、权威域三个部分,查询时,会从上往下进行查询,从根服务器查顶级域服务器的IP,再从顶级域查权威域的IP,最后从权威域服务器中查最终的IP,返回给本地DNS服务器中。用户机查询域名IP,会首先去本地DNS服务器,如果服务器中有,直接返回结果,否则,重复上述过程。
而常见的三种DNS攻击,就是针对用户机和本地DNS服务器的。分别为:攻击用户机主机、伪造响应欺骗用户、DNS缓存中毒攻击。三种攻击大致思想如下:

本篇将进行常规的本地DNS缓冲中毒的实验。
实验环境
实验大环境使用Ubuntu-Seed虚拟机,使用docker容器模拟出DNS服务器和用户机。首先创建对应的容器,注意,--privileged一定不能加,因为这会和bind9向冲突。
# 创建Local DNS Server
$ sudo docker run -it --name=dns --hostname=dns seedubuntu /bin/bash
# 创建User
$ sudo docker run -it --name=user --hostname=user seedubuntu /bin/bash
攻击机直接用虚拟机即可,三者的IP如下:
- Attacker:192.168.186.137
- Local DNS Server:172.17.0.2
- User:172.17.0.3
配置
首先配置服务器。对于本地 DNS 服务器,我们需要运行 DNS 服务器程序。最广泛使用的 DNS服务器软件称为 BIND(Berkeley Internet Name Domain)。bind9 从/etc/bind/named.conf 文件中获取其配置。这个文件是主要的配置文件,它通常包含几个”include”条目,即实际配置 存 储 在 那 些 include 文 件 中 。 其 中 一 个 include 文 件 称 为/etc/bind/named.conf.options。这是我们通常设置配置选项的文件。
首先设置转储文件,所谓转储,就是把服务器上的所有DNS缓冲转存进去,相当于备份。在/etc/bind/named.conf.options中设置dump-file:
options {
dump-file "/var/cache/bind/dump.db";
};
当需要转储或清空时,用下列命令即可:
# 转储
$ sudo rndc dumpdb -cache
# 清空
$ sudo rndc flush
接着需要关闭DNSSEC。引入DNSSEC 是为了防止对 DNS服务器的 spoofing攻击,所以要关闭。仍然在上面那个文件中进行:
options {
# dnssec-validation auto;
dnssec-enable no;
};
启动DNS服务:
$ sudo service bind9 restart
如有错误,查看错误日志:
$ sudo named -d 3 -f -g
配完服务器后,开始配用户机。在/etc/resolv.conf中配置,将上述服务器作为它唯一的DNS服务器:
