SEED:DNS
一 DNS概述
为什么需要DNS?
网络中的计算机使用IP地址进行标识,如果你想连接一台网络中的计算机,你必须知道它的IP地址。
然而记住一串点分二进制的表示是困难的,因为它们没有什么实际意义,因此在公开的网络中,服务器使用对外公开的域名进行标识。
DNS:Domain Name System域名系统将域名转换为IP地址。
DNS如何构建?
DNS被设计成树状结构,就像这样:
- Root根服务器:
- TLS顶级域名服务器:
- NS权威域名服务器:
另外还有本地DNS服务器,这个DNS服务器帮助主机对DNS进行查询,包括迭代查询和递归查询:
DNS如何使用?
进行DNS查询非常简单,因为本地DNS服务器会帮助主机完成这个工作。
因此,本地DNS服务器可以收集用户访问网站的信息。
DNS缓存和Hosts文件
DNS的安全问题
DNS被要求一个快的速度,DNS解析的速度越快,那么浏览器访问网页的速度也就越快,因此DNS使用明文。这样DNS就会出现问题:受到恶意的DNS回复。现在的DNS系统使用DNS缓存和随机化的DNS端口和序列号。
DNS本地攻击实验&&DNS远程攻击实验
二、 实验步骤及结果
DNS本地攻击实验
1. 实验环境
1) 拓扑结构:
关于攻击机(10.9.0.1):
共享文件夹和主机模式。关于本地DNS服务器(10.9.0.53):
本地DNS服务器上运行Bind 9 DNS server程序,Bin9从./etc/bind/named.conf中获取配置信息。named.conf文件一般使用include包含其他配置文件named.conf文件。包括named.conf.options文件,用于定义dns工作方式;named.conf.local文件用于本地域管理,named.conf.default-zones定义了一些默认的域名解析区域:
本地dns服务器已经关闭随机源端口号(固定的源端口为“33333”),关闭DNSSEC,这可以让实验更加简单。另外,如果需要清除本地DNS缓存和保存DNS缓存可以使用下面命令:
- 测试DNS设置
下面是攻击者的域名服务器的DNS记录,可以看到这个服务器管理attacker32.com域同时伪造了example.com域的信息:
获取ns.attacker32.com的IP地址
查询结果为:10.9.0.153,DNS查询到攻击者DNS服务器中的域信息。获取www.example.com的IP地址
dig www.example.com:
查询结果为:93.184.216.34。在本地DNS服务器中,查询example.com域名会被指向正确的权威服务器而不会受到攻击者的DNS服务器影响。
dig @ns.attacker32.com www.example.com:
查询结果为:1.2.3.5。如果对权威服务器指定为攻击者的DNS服务器,那么将会查询到上面写入的恶意域信息。
- 直接欺骗对用户的响应
当用户在Web浏览器中输入域名回车后,用户计算机发起对本地域名服务器的DNS请求,以获取目标主机的IP地址。攻击者可以嗅探DNS请求,并伪造恶意的DNS回复误导用户连接恶意的主机。
现在编写程序实现上面的功能,使用scapy伪造本地DNS服务器的DNS回复即可(下面程序同时实现更改A记录和NS记录):
运行程序,发现A记录已经将www.example.com的IP地址映射为10.9.0.5了。同时用户查询也为错误IP。
- DNS缓存投毒攻击-伪造DNS回复
使用DNS回复欺骗用户并不是一种持久的方案,因为对于用户的每次请求,都需要伪造DNS回复。更好的方案是向本地DNS投毒,这样在缓存记录生效的时间内,都能对使用该本地域名服务器的用户造成攻击。
下面编写代码实现这个功能:
与上面代码相同。
运行程序,看到已经发送NS记录了:
将本地DNS缓存保存到文件,发现已经被缓存投毒:
- 伪造NS记录
如果只是针对于一个域名解析进行投毒,这显然是不够的。如果能够对本地服务器的NS投毒,那么访问所有子域名都将会中毒。
编写代码:
更改上面代码,删除A记录,保留NS记录即可。
运行程序,发现已经污染NS记录,现在对example.com的请求都会被定向到攻击者的域名解析器:
- 伪造DNS附加记录
在上面代码additional部分添加记录即可,但是不会起作用。
因为DNS有附加域名的检查机制,因此在附加中填入恶意信息都将不被接受。
DNS远程攻击实验
7. 实验环境
1) 拓扑结构
- Kaminsky攻击
DNS查询过程:
Kaminsky攻击过程:
一般的远程对本地DNS服务器的攻击,会对会话ID进行爆破,但是由于缓存机制存在,爆破的机会很少。Kaminsky解决了这个问题,当发起多个不存在域名的DNS请求时,由于不存在缓存,因此本地DNS服务器都会对TLD进行询问,当我们发送足够多的不存在域名,我们就能够获取足够多的猜测机会,从而破解出会话ID,更改NS记录,实现攻击。
- 构造DNS请求
编写代码。通过scapy发送一个DNS请求即可,同时保存这个包到bin文件即可:
运行程序,在warshark中可以看到这个DNS请求,同时它还造成本地DNS服务器响应,说明包构造成功。
使用共享文件夹中的display程序查看生成包:
- 伪造DNS回复
编写程序。通过scapy伪造一个回应包即可,在进行kaminsky攻击时需要将源IP替换为TLD服务器的地址:“199.43.135.53”,保留NS记录即可:
运行程序,在warshark中查看到DNS响应包:
查看包,通过display程序查看包如下:
- 实施kaminsky攻击
编写代码。首先加载上面两个task保存在两个bin文件的数据包。生成前面5位随机的域名,发送这个DNS请求,同时伪造DNS响应包欺骗本地DNS服务器,导致example.com的权威服务器被污染。
运行程序,查看本地DNS服务器中example.com的NS记录。发现已经成功被程序修改为攻击者的域名服务器了: