实验环境:
服务器ip:192.168.86.139
Victim ip: 192.168.86.137
Attacker ip:192.168.86.138
准备工作:
安装bind9服务器:
在bind9官网 下载bind9,在此下载的是bind9.10.4
解压文件tar -xzvf bin9.10.4.tar.gz
cd bin9.10.4,并./configure –prefix=/usr/local/bind-9.9.0 –enable-threads –disable-openssl-version-check –sysconfdir=/etc –with-libtool –without-openssl
由于没有安装openssl,所以在最后的选项中加入–without-openssl
make & make install
ln –sv /usr/local/bind-9.9.0 /usr/local/bind 软连接
在服务器中开启 sudo rndc flush // 刷新cache
sudo rndc dumpdb -cache // 将cache dump到dump.db
开启bind9服务:sudo service bind9 start
用户机器配置:
vi /etc/resolv.conf,修改nameserve 192.168.86.138(DNS服务器地址)
在ubuntu中,/etc/resolv.conf可能被DHCP客户端更改,所以需要将DHCP关闭,具体做法如下:settings->network->options->IPV4 Settings,设置method为Automatically DHCP addresses only, 并在DNS servers处填写为DNS服务器地址
- 查看用户机是否将dns服务器配置成功:打开wireshark,并在该机器中ping www.google.com,在wireshark的筛选规则中填写dns,查看抓包情况:
实验步骤:
实验一:Kaminsky攻击
攻击准备:
确认攻击机器的连接方式是NAT
由于DNS的服务器端口可能不确定,在此将服DNS服务器的端口设置为33333,具体设置如下:vi /etc/bind/named.conf.options,添加query-source port 33333;
将DNS服务器的DNSSEC策略关闭,具体设置如下:vi /etc/bind/named.conf.options,找到dnssec-validation auto;,将其注释掉,并添加dnssec-enable no;
刷新dns cache,并从其dns服务:
1 | sudo rndc flush |
实验原理:
(1)攻击者向被攻击的本地缓存DNS发送一个域名的DNS 查询请求,该查询请求中的域名主机使用随机序列和目标域名的组合。
例如www123456.test.com,其中ns2.test.com为目标域名,www123456是随机生成的。很显然,这个查询的域名主机记录在test.com的权威DNS中是不存在的。正常test.com的权威DNS要返回NXDOMIAN(代表域名不存在)。换句话说就是本地缓存DNS中肯定没有www123456.test.com的缓存记录,本地缓存DNS接收到这个域名查询请求后肯定是要出去迭代请求的。
(2)攻击者伪造test.com的权威DNS应答数据包中,应答资源记录部分与正确应答包中部分是与正常结果一样的,比如test.com的DNS的IP地址、UDP端口号、应答结果是NXDOMAIN。
但是,在应答报文中的授权资源记录部分,攻击者伪造一个test.com的NS记录为ns2.test.com,且该记录对应的A记录IP是2.2.2.2(可能是一个钓鱼网站的IP)。那么该资源记录信息将也被写入本地缓存DNS的Cache 中,在Cache 保持时间内,对test.com名字服务器所管辖的所有域名的查询都将被发送到攻击者自己控制的IP(2.2.2.2)中。
具体攻击过程:
找到example.com域名服务器的ip地址
在攻击者机器上ping www.example.com,用wireshark抓包有如下这个数据包,该数据包是从199.43.133.53的ip地址回复的example.com包的查询。所以需要伪造的ip地址为199.43.133.53。
构造回复包
在此主要介绍构造DNS域的包的过程。
DNS包的结果如上图所示:在此介绍构造每一个域的过程。
DNS头有16个字节,分别是标识ID,标志,问题数,资源数,授权资源记录数,额外资源记录数,结果如下所示:
1 | struct dnsheader { |
其中标志ID为DNS报文的ID,对于相关联的请求报文和应答报文,这个字段是相同的,由此可以区分DNS应答报文是哪个请求报文的响应。由于不知道dns请求199.43.133.53时的ID号,所以在此将id号从3000到3100,每个id号都构造一个包。’
对于flags来说,根据wireshark抓包可知,大小为0x8400
随后的8个字节,由wireshark抓包可得,这四个域都为1。
随后就是将查询问题的内容给加进去,由于源程序给了构造查询问题的步骤,所以,现在直接将其构造的内容加进去即可。
Dns查询域名的结果的构造,如下图所示,该域主要是回答了www.example.com的ip地址和以及类型和类,该出类型为A,表示是由域名获得该域名的IP地址,类为IN,表示表示为Internet名字空间。所以在构造该域的时候可以将ip地址改了,我在该实验中将ip地址改为了1.2.3.4
- 接下来是要构造域名服务器,也是要构造的重点,由wireshark抓包得:
该域主要有Name,Type,Class,TTL,Data length和NS构成,其中Type为NS表示为Name Server,即域名服务器,TTL为该记录的有效时间, Name表示主域名。所以我在此构造将Name Server改为了ns.dnslabattacker.net。
- 接下来就是一些额外的信息,由wireshark抓包如下图所示:
写具体的程序进行攻击
1 | // ----udp.c------ |
在Attacker机器中构造查询信息,随机生成xxxx.example.com的域名,其中xxxx是随机生成的,该目的就是生成不存在的域名,然后while循环,向域名服务器发送查询xxxx.example.com域名的请求,紧接着发送伪造的回复的包。
sudo rndc dumpdb -cache之后查看/etc/bind/dump.db文件的结果如下:
实验二:结果的确认
使用假域名
配置攻击者机器为dns服务器,配置过程和上一个dns服务器过程一致。
在Apollo服务器上配置ns.dnslabattacker.net的解析。
具体配置如下:
首先在/etc/bind/name.conf.default-zones中配置zone信息:
1 | zone “ns.dnslabattacker.net” |
表明具体的解析文件在/etc/bind/db.attacker中,该文件具体内容如下:
1 | ; |
其中192.168.86.138为攻击者机器的地址。
给db.attacker文件加权限chmod 644 db.attacker
- 在攻击者机器上配置example.com域名的解析,首先在/etc/bind/name/conf中添加如下信息:
1 | zone “example.com” { |
然后再创建/etc/bind/example.com.db文件,内容如下
1 | $TTL 3D |
给example.com.db文件加权限,chmod 644 example.com.db。
- 在victim机器中dig www.example.com,结果如下,解析了exmaple.com的ip地址为1.2.3.4,域名服务器为ns.dnslabattacker.net
在victim中ping www.example.com,结果如下:
其访问的是1.2.3.4的ip地址。