Seed Labs: Local DNS Attack Lab

  网络与计算机安全课程的实验,使用的是美国雪城大学的开放实验平台:Seed Project。

实验原理与目的

  DNS(域名系统)是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便地访问互联网,而不用去记住能够被机器直接读取的IP数串。本次实验涉及三种DNS攻击类型,分别是(1)修改用户机器中的hosts文件,从而实现DNS攻击(2)DNS欺骗,攻击者冒充域名服务器向发送DNS查询的机器发送欺骗DNS响应。(3)缓存污染,利用控制DNS缓存服务器,把原本准备访问某网站的用户在不知不觉中带到黑客指向的其他网站上。实验目的是了解上述3种DNS攻击的原理,以及DNS攻击是如何实现的,然后学会防范这样的攻击。

实验配置

  按照实验指导手册,从SeedProject的网站上下载Ubuntu12.04的镜像,它已经帮我们装好了实验必须的环境以及一些需要用到的软件。该系统默认的用户名是seed,密码是dees。

  实验资料下载地址:
  http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Networking/DNS_Local/

  然后,配置3台虚拟机,1台作为DNS服务器,1台作为用户机,另1台作为攻击者,3台机器通过设置NAT网络来实现网络互访。一般情况下,可直接复制虚拟机镜像生成三台虚拟机,不过有可能会出错。另外,3台虚拟机同时打开需要较大的内存,主机内存4G的会很卡,8G的完全没问题。实验示意图如下:

11-0

Vmware配置

  SeedProject提供的是VirtualBox,但是在这里不建议使用,开源的还是会遇到一些莫名其妙的问题,浪费很多时间在虚拟机环境的配置上不划算。我们应该聚焦实验,所以选择更方便更简单的VMware。

  点击菜单栏-》编辑-》编辑虚拟网络,将下面的子网IP修改成192.168.0.0,子网掩码设置成255.255.255.0,找到VMnet8 NAT,编辑它,将网关修改成192.168.0.2,保存即可。

  为方便操作经常需要在虚拟机和主机之间复制内容,所以需要安装Wmvare Tools。点击顶部菜单栏的虚拟机,选择重新安装VMware Tools,将打开的VMware文件复制到桌面上并解压,然后打开终端,使用命令进行安装:

1
2
$ cd /home/你的用户名/Desktop/VMwareTools版本号.../
$ ./vmware-install.pl

  然后一步步安装说明进行操作即可,安装完成后可能需要重启虚拟机。

DNS服务器配置

  IP和DNS基本配置:

  • IP地址:192.168.0.10
  • 子网掩码:255.255.255.0
  • 网关:192.168.0.2
  • DNS服务器:114.114.114.114

(1)在DNS服务器上安装BIND9,BIND是一个开源的DNS服务器程序。

1
2
$ sudo apt-get update
$ sudo apt-get install bind9

(2)创建named.conf.options文件。DNS服务器需要读取/etc/bind/named.conf配置文件才能启动。这个配置文件通常包含一个叫/etc/bind/named.conf.options的选项文件,我们添加以下内容用于后续的DNS缓存污染实验:

1
2
3
options {
dump-file "/var/cache/bind/dump.db";
};

文件/var/cache/bind/dump.db用于转储DNS服务器的缓存。假定我们在服务器中拥有一个域名: example.com,因此我们需要配置关于该域名的一些信息。为避免输入所带来的错误,它建议我们从SeedProject网站下载相应的文件放置到/etc/bind/目录下。

(3)启动DNS服务器。

  上述步骤完成后,我们的DNS服务器基本就配置完成了,然后我们使用如下命令将其启动:

1
2
3
$ sudo /etc/init.d/bind9 restart
or
$ sudo service bind9 restart
用户机配置

  IP和DNS基本配置:

  • IP地址:192.168.0.100
  • 子网掩码:255.255.255.0
  • 网关:192.168.0.2
  • DNS服务器:192.168.0.10
攻击者配置

  IP和DNS基本配置:

  • IP地址:192.168.0.200
  • 子网掩码:255.255.255.0
  • 网关:192.168.0.2
  • DNS服务器:114.114.114.114

实验过程

修改host文件的攻击

  该攻击实验假定我们已经获取了受害者机器的账号密码,因此,我们在攻击者机器上通过ssh连接到用户机器,然后修改其/etc/hosts文件,添加如下一行:

1
1.2.3.4 www.example.com

  然后使用ping 得到如下图的结果,可以看到该域名对应的IP地址已经变更为1.2.3.4。因为如果用户机器中的hosts文件中存在该域名的条目,那么将直接解析该域名为条目中对应的IP地址,而不询问任何DNS服务器。攻击完成后,用户再使用ping时即可看到www。Example的地址已经变成1.2.3.4,如下图:

11-1

  注意,这里使用nslookup进行查看时是不能看到攻击效果的,因为nslookup不会先查本地的hosts文件,而是直接向DNS服务器发送一个DNS查询请求。

欺骗DNS响应

  当用户在Web浏览器中输入网站域名时,用户计算机将向DNS服务器发出DNS请求以解析IP地址的主机名称。位于同一局域网的攻击者可以监听到这个DNS请求,然后在DNS服务器返回DNS响应之前伪造一个虚假的DNS响应发送给DNS请求者。当然,DNS响应需要满足以下要求才会被DNS请求者接受:

  1. 源IP地址必须与DNS服务器的IP地址相匹配。
  2. 目标IP地址必须与用户机器的IP地址相匹配。
  3. 源端口号(UDP端口)必须与DNS请求发送到的端口号(通常为端口53)相匹配。
  4. 目标端口号必须与发送DNS请求的端口号相匹配。
  5. UDP校验和必须正确计算。
  6. 交易ID必须与DNS请求中的交易ID匹配。
  7. 响应的问题部分中的域名必须与请求的问题部分中的域名相匹配。
  8. 响应部分中的域名必须与DNS请求的问题部分中的域名匹配。
  9. 用户的计算机必须收到攻击者的DNS答复,才能收到合法的DNS响应。

  Netwox工具105提供了一个实用程序来进行这样的嗅探和响应。攻击者使用Netwox工具来监听来自用户机的数据包,并生成一个虚假的DNS响应包给DNS请求者,即用户机。实验原理示意图如下:

11-2

  Netwox命令如下:

1
sudo netwox 105 --hostname "www.example.com" --hostnameip 192.168.0.200 --authns "ns.example.com" --authnsip 192.168.0.200 --filter "src host 192.168.0.100"

  配置好以后开始监听,同时,打开wireshark以便后续分析攻击结果,当监听到DNS请求时,可以在窗口看到生成的DNS响应信息,如下图:

11-3

  同时,在客户机也可以看到查到的地址已经变成了攻击者的IP地址,证明攻击成功。如下图:

11-4

  查看wireshark的抓包信息,可以看到我们通过生成的欺骗DNS响应的内容如下,完全符合要求,所以会被DNS请求者接收,从而实现DNS欺骗。

11-5

DNS服务器缓存污染

  上面的DNS欺骗攻击在每次用户的机器发出www.example.com的DNS查询,攻击者的机器都必须发出一个欺骗性的DNS响应,这样效率很低,为了达到持久的效果,我们可以进行针对DNS服务器进行攻击。

  当一个DNS服务器接收到一个查询时,如果它可以解析则直接解析并响应,当主机名不在它的域中,它将要求其他的DNS服务器去解析主机名。当其他的DNS服务器将解析结果返回给该服务器后,它将把解析结果存储在缓存中,所以下一次不需要询问其他的DNS服务器。如果攻击者可以伪造来自其他DNS服务器的响应,那么该DNS服务器会接手伪造的DNS响应,并在一定时间内将欺骗响应保留在其缓存中。下一次,当用户的机器想要解析相同的主机名时,该DNS服务器会使用缓存中的欺骗性响应来回复。这样,攻击者只需要欺骗一次,并且影响将持续到缓存的信息到期。攻击示意图如下:

11-6

  为避免我们要攻击的DNS服务器已经有缓存,攻击之前,我们要确保DNS服务器的缓存为空,可以使用以下命令刷新缓存:

1
$ sudo rndc flush

  攻击者使用Netwox工具来监听来自DNS服务器机的数据包,然后生成一个假的DNS响应给我们的DNS服务器。Netwox的命令如下:

1
sudo netwox 105 --hostname "www.fanzhenyu.me" --hostnameip 192.168.0.200 --authns "ns.fanzhenyu.me" --authnsip 192.168.0.200 --ttl 600 --filter "src host 192.168.0.10" --spoofip "raw"

11-7

  然后,在用户机使用如下命令发起DNS查询请求:

1
$ nslookup www.fanzhenyu.me

  攻击结果如下图,与没有攻击对比,缓存污染后DNS请求的响应已经是被污染的IP地址:

11-8

  同时,可以使用如下命令转储和查看DNS服务器的缓存,

1
2
$ sudo rndc dumpdb -cache
$ sudo cat /var/cache/bind/dump.db

  结果如下图,可以看到缓存已被污染。

11-9

坚持原创技术分享,您的支持将鼓励我继续创作!