网络攻防技术-DNS欺骗实验(Local DNS Attack Lab、The Kaminsky Attack Lab)
1 作业题目
本实验的目标是让学生获得对DNS(域名系统)的各种攻击的第一手经验。DNS是互联网的电话簿;它将主机名转换为IP地址,反之亦然。这种转换是通过DNS解析实现的,这种解析发生在幕后。DNS欺骗攻击以各种方式操纵此解析过程,目的是将用户误导到其他目的地,这些目的地通常是恶意的。本实验室主要研究几种DNS欺骗攻击技术。学生将首先设置和配置DNS服务器,然后在实验室环境中的目标上尝试各种DNS欺骗攻击。
第一个大实验任务(本地DNS欺骗)中进行的攻击假设攻击者位于同一本地网络上,因此可以嗅探DNS数据包。这个假设是为了简化实验任务。第二个大实验任务为远程DNS攻击实验,攻击者在没有嗅探数据包的情况下发起远程欺骗攻击,远程攻击实验室比本地DNS欺骗实验更具挑战性。
2 实验步骤及结果
2.1 DNS _Local
2.1.1 环境搭建
构建并启动容器

LAN结构如下:

测试DNS配置的正确性
user主机,输入命令dig www.example.com,会直接发请求给local DNS server,其会把请求发给对应的官方的nameserver:

使用@,直接发给ns.attacker32.com

获得的结果与Attacker上zone文件相同:

2.1.2 The Attack Tasks
Task 1: Directly Spoofing Response to User
当用户在Web浏览器中输入一个网站的名称,用户的计算机将向本地DNS服务器发送DNS请求,以解析主机名的IP地址。攻击者可以嗅探DNS请求消息,然后立即创建一个虚假的DNS响应,并发送给用户的计算机。如果虚假的响应比真实的响应先到达,用户的计算机将接受虚假的响应。如下所示:

编写代码,将网卡名称改成自己的:

在攻击前,清除本地DNS服务器中的缓存。如果缓存中有答案,本地DNS服务器的回复将比伪造的回复更快,攻击将无法成功。

在attacker容器内运行攻击scapy代码,然后在user端进行dns请求,实际信息被篡改,即攻击成功:

Task 2: DNS Cache Poisoning Attack – Spoofing Answers
task1将攻击目标聚焦于user,需要总是等待user进行请求,效率并不高。task2将目标聚焦于DNS server,会是更高效的方式,即DNS缓存投毒:如果攻击者伪装从其他DNS server来的响应,该DNS Server就会把内容存储在缓存中,会保留相当长的一段时间。在该期间的请求都会直接返回缓存内的结果。我们只需spoof一次,影响就会持续直到下次缓存更新。
在攻击之前,使用rndc flush命令清空DNS服务器的缓存。修改之前的代码,这次捕获来自10.9.0.53的数据包,然后向其发送伪造的DNS报文。运行该脚本:

在用户容器运行dig www.example.com

查看DNS服务器中的DNS缓存

终止攻击脚本,然后继续在用户容器查询www.example.com的地址,DNS污染继续生效。

Task 3: Spoofing NS Records
相比较之前的攻击方式,这种攻击效果又近了一步。攻击者在DNS响应的Authority部分添加了伪造的NS记录。这样一来,本地DNS服务器会将攻击者控制的域名服务器(例如ns.attacker32.com)作为example.com域的权威域名服务器进行缓存。以后对example.com域内任何主机名的查询都将被发送到攻击者控制的域名服务器,污染的范围更广了。
同样,首先清除DNS服务器的缓存。
修改上面的代码如下,这次不返回DNS的A记录,而是返回一个NS记录,让本地DNS服务器去ns.attacker32.com查询example.com的子域名,也就是说污染了本地DNS服务器的缓存,修改了example.com权威域名服务器。运行这段代码

然后在用户容器中查询mail.example.com的IP地址,查询到如下IP地址:

DNS服务器中的DNS缓存:

在DNS服务器中,将cache dump下来并保存到文件中

为方便查看,将文件复制到虚拟机中打开:

可以看到ns记录被修改:

Task 4: Spoofing NS Records for Another Domain
在先前的攻击中,我们成功地污染了本地DNS服务器的缓存,使得ns.attacker32.com成为example.com域的名称服务器。受到这个成功的启发,我们希望将其影响扩展到其他域名。具体而言,在由对www.example.com的查询触发的伪造响应中,我们希望在Authority部分添加额外的条目(如下所示),以便ns.attacker32.com也被用作google.com的名称服务器。
如下,在task3.py基础上修改编写task4.py,增加NS记录,其他保持一致

重复同样的流程,查看DNS服务器的缓存,修改成功。

选择包并构造NS记录时,保证NS记录的rrname为条件语句:ns_name in pkt[DNS].qd.qname 的ns_name的同样层级的域名,即ns_name=='example.com'时,rrname为 google.com。即保证,将所有包含与ns记录对应的域名的包都抓到并构造响应的欺骗包。
Task 5: Spoofing Records in the Additional Section
按照要求修改攻击代码task5.py构造部分如下:

清除缓存,Attacker运行代码,user端 dig www.example.com。DNS缓存记录如下:

可以看到,第二、三条记录都没有保存下来。这是因为在 DNS 中,超出域的附加记录是指在 DNS 查询中包含的与请求的域不相关的额外记录。通常,DNS 查询只应包含与请求的域相关的记录,例如域名的主机记录(A 记录)、邮件交换记录(MX 记录)等。超出域的附加记录(Out-of-zone Additional Records)指的就是DNS响应中返回的一些不属于当前查询域名区的额外记录。
与普通附加记录的区别是:普通附加记录都是与查询域相关的记录,如域名的NS、MX等记录。
超出域附加记录是不属于当前查询域名区的其他记录,如父域名或子域名的记录等。
一些常见的超出域附加记录类型包括:
·父域名的NS记录:查询子域时返回父域的NS记录
·子域名的NS记录:查询父域时返回子域的NS记录
·nameserver所在区域的SOA记录:返回nameserver权威区域的SOA记录
当 DNS 服务器收到一个查询请求时,它通常只会关注与请求的域相关的记录,并且会忽略超出域的附加记录。这意味着超出域的附加记录不会被处理,也不会返回给查询的客户端。DNS 服务器的这种行为是为了提高查询效率和安全性。如果 DNS 服务器处理超出域的附加记录,并将其返回给查询的客户端,那么恶意用户可能会滥用这些记录来进行攻击,例如进行 DNS 劫持、欺骗等。
2.2 DNS_Remote
The Kaminsky Attack
与上述相同,在Labsetup目录下启动环境,网络拓扑环境如下:

前述已经完成在同一LAN下的DNS攻击,在同一个LAN下是可以直接看到query包。远程攻击缓存投毒的困难主要在于,响应包的事务id必须与请求包相匹配,而请求包的id通常是随机生成的,不在同一子网无法捕捉包看id,而自己暴力手段猜测id会败在缓存机制下,因为当我们成功之前,正确包已经到达被缓存,在time out 之前,dns server不会再向外查询。
Kaminsky提出的方案(主动构造对应域名的requests,同时大量不同id响应包响应dns server的请求以欺骗完成缓存中毒攻击)巧妙地避开了缓存机制的限制,不需要等到缓存过期就可以持续猜测。
去询问类似abcde.example.com、12345.example.com等等这些大概率就完全不存在的example.com的子域名,由于LDNS并没有这些域名的缓存,就会发起查询,假设ns.example.com是example.com的权威DNS,LDNS就会去ns.example.com询问,每发一个这样的包,LDNS都会去问一次,攻击者也就有一次猜测的机会。
直到猜测成功,欺骗的数据包中的假的权威DNS服务器就会覆盖ns.example.com合法的DNS服务器,这是Kaminsky attack最巧妙的一点。
Task 2: Construct DNS request
如下,伪造从user端发送dns查询给local dns server,最终目的为让local dns server向其他dns server发起dns 查询。因此查询字段为xx.example.com,且不在缓存中。

经wirshark抓包可以看到,local dns server 10.9.0.53向别的dns server发起查询。

Task 3: Spoof DNS Replies
编写欺骗程序,目的是向local dns server返回xxx.example.com的response,并欺骗其ns为攻击者的。代码如下:

其中,ns为攻击者的dns server,目标ip为local dns server的,源端口为53,我们需要伪造真正example.com给local dns server的response,因此,src ip为某example.com权威域名服务器的。而在实验环境配置时,我们已经将local dns server的源端口号固定为33333,因此dport =33333。以下为dig example.com ns查到的多个权威域名服务器的name server(2 个)以及ip:

通过wireshark抓包看到我们的response成功到达local dns server:

Task 4: Launch the Kaminsky Attack
1.使用scapy生成构造dns请求包,代码gen_dns_request.py,将包保存到ip_req.bin

2. 使用scapy构造dns回复包(具体思路见task3),代码gen_dns_response.py,将包保存到ip_resp.bin

3. 使用socket发送请求与响应包实施攻击
编写代码attack.c:
a.读取包:

b.随机化example.com的子域名,发送请求包的同时,构造大量id响应包:

c.利用原始套接字发起攻击的C语言程序源代码如下,随机化子域名*****.example.com,然后暴力破解transid。

4. 编译运行文件,过一段时间后查看本地DNS服务器的缓存,成功篡改了example.com的权威域名服务器

Task 5: Result Verification
1.启动wireshark,向local dns server(已经被缓存)发起查询

2.启动wireshark抓包,然后直接向attacker的dns server发起dig查询:

对比1.2.结果,二者路径完全一致,即都是在ns.attacker32.com里设置的example.com zone规则,www.example.com为1.2.3.5。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号