DNS欺骗实验2

The Kaminsky Attack Lab

Lab Environment Setup

搭建实验环境,实验网络结构如下:

网络接口:br-7af3568e2bbc

Testing the DNS Setup

进入user,执行指令dig ns.attacker32.com :

符合预期。

符合预期。

The Attack Tasks

我们使用域名www.example.com作为攻击目标。

www.example.com的真实IP地址是93.184.216.34,它的名称服务器由互联网名称和号码分配公司(ICANN)管理。当用户对此名称运行dig命令或在浏览器中键入该名称时,用户的机器将向其本地DNS服务器发送一个DNS查询,该服务器最终将从example.com的nameserver请求IP地址。

攻击的目标是启动DNS缓存中毒攻击本地DNS服务器,这样当用户运行挖掘命令找出www.example.com的IP地址,本地DNS服务器最终将去攻击者的名称服务器ns.attacker32.com IP地址。

How Kaminsky attack works

当Apollo等待来自example.com的nameserver的DNS回复时,攻击者可以向Apollo发送伪造的回复,假装这些回复来自example.com的namesever。如果伪造的回复先到达,Apollo将接受。这次攻击将会成功。

当攻击者和DNS服务器不在同一局域网上时,缓存中毒攻击就会变得更加困难。困难的主要原因是DNS响应包中的事务ID必须与查询包中的事务ID相匹配。由于查询中的事务ID通常是随机生成的,由于没有看到查询包,所以攻击者不容易知道正确的ID。

攻击者可以猜测事务ID。由于ID的大小只有16位,如果攻击者可以在攻击窗口内伪造K个响应(即在合法响应到达之前),但如果攻击者没有足够幸运地在真正的响应包到达之前做出正确的猜测,那么正确的信息将被DNS服务器缓存一段时间。这种缓存效应使得攻击者无法就相同名称生成另一个响应,因为在缓存超时之前,DNS服务器不会发送该名称的另一个DNS查询。要对同一名称建立另一个响应,攻击者必须等待对该名称的另一个DNS查询,这意味着他/她必须等待缓存超时。等待时间可以是数小时或天。

Dan Kaminsky 想出来一种方法击败缓存效应:

  1. 攻击者查询example.com中不存在的名称
  2. 由于映射在Apollo的DNS缓存中不可用,Apollo向example.com域的名称服务器发送一个DNS查询。
  3. 当Apollo等待回复时,攻击者用一连串欺骗的DNS响应淹没了Apollo,每个都尝试了不同的事务ID。在响应中,攻击者不仅为twysw.example.com提供了一个IP解析,还提供了一个“权威命名服务器”记录,指示ns.attacker32.com为example.com的namesever。
  4. 即使欺骗的DNS响应失败(例如事务ID不匹配或太晚)也不重要,因为下次攻击者将查询不同的名称。
  5. 如果攻击成功,在Apollo的DNS缓存中,example.com的namesever将被攻击者的namesever ns.attacker32.com所取代。

Task 2: Construct DNS request

目的:在example.com域中构造了一个随机主机名的DNS请求。

为了完成攻击,攻击者需要触发目标DNS服务器发送DNS查询

编写代码task1.py:

清除目标namesever缓存:

运行代码:

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

Task 3: Spoof DNS Replies

目的:从example.com的namesever构建了一个欺骗的DNS回复。

首先找出example.com的合法namesevers(不止一个),我们从上一个task中知道了,其中一个namesever为192.36.148.17。

编写代码task2.py:

在实验环境配置时,我们已经将local dns server的源端口号固定为33333,因此dport =33333。

清除缓存:

运行代码:

Wireshark抓包:

response成功到达local dns server。

Task 4: Launch the Kaminsky Attack

目的:发动Kaminsky攻击。

编写代码gen_dns_request.py:

该代码构造一个DNS查询请求,并将其保存为一个二进制文件。

编写代码gen_dns_response.py:

该代码构造一个DNS响应包,并将其保存为一个二进制文件。

编写代码attack.c:

代码从二进制文件中读取IP数据包(一个请求和一个响应),然后生成随机的域名,并对这些请求和响应进行发送。

执行代码:

查看受害DNS服务器缓存:

A49B9D1CACE1061475883A588D90A955

修改成功。

Task 5: Result Verification

目的:验证攻击造成的影响。

在usr执行以下指令:

ACE1FC0742877596A694678729A903B4

两者一致,说明攻击成功。

posted @ 2024-10-30 17:46  wajiez  阅读(128)  评论(0)    收藏  举报