61阅读

dns欺骗-DNS欺骗技术揭秘

发布时间:2017-09-03 所属栏目:安全教程

一 : DNS欺骗技术揭秘

概述:什么是DNS欺骗?

DNS欺骗是一门改变DNS原始指向IP的艺术。为了更好的理解,让我们先来看一个例子。如果你想用浏览器去google搜索一些信息,毫无疑问的你会在地址栏里输入

www.61k.com

的网址然后回车。

那么在这背后又有什么事情正在进行着呢?一般而言,你的浏览器将会向DNS服务器发送一个请求,从而要求得到与www.61k.com匹配的IP地址,DNS服务器则会告诉你的浏览器google的IP地址,接着你的浏览器会连接并显示主页内容。哦,等一下,你打开的网页说google因无钱支付网站费用而转让给CSite的消息。你可能会非常吃惊,并打电话告诉你的好朋友。当然你的朋友一定会笑你疯掉了,因为你的朋友是可以登陆google并进行搜索的。还确信正在和你通信的IP地址是友好的吗?说不定你已成圈中之羊。当你在浏览器地址里输入http:// 66.249.89.99并回车时,你又会发现,其实www.61k.com健在。

其实刚刚就是DNS劫持攻击时目击者可能看到的情形。

Quote:

试想如果跳转的页面被无声无息地挂着马又会多糟糕

非常急切地相要知道着其中地玄机吧?是不是DNS服务器给了我们一个错误地IP地址?可能是吧。至少,这是我们脑中最符合逻辑地答案。

按此在新窗口打开图片

事实上,有两种方法可以实现DNS劫持攻击。让我们来看看第一种,“DNS ID欺骗”技术。

A)DNS 高速缓冲存储器麻痹(DNS Cache Poisoning)

可以想象,DNS服务器不可能将所有现存的域名或IP地址存储在本身的存储空间里。这就是为什么DNS服务器有一个高速缓冲存储器(cache),它使得服务器可以存储DNS记录一一段时间。

事实上,一台DNS服务器只会记录本身所属域中的授权的主机,如果它想要知道其它的,在自身域以外主机的信息,就必须向信息持有者(另一台DNS服务器)发送请求,同时,为了不每次都发送请求,这台DNS服务器会将另一台DNS服务器返回的信息又记录下来。

那么现在,我们就来看看是怎么麻痹DNS的缓存的。

攻击者有自己的域(attacker.net)和一个已被攻陷的DNS服务器(ns.attacker.net)。注意!我说的是被攻陷的DNS服务器,因为攻击者已经自定义了他自己的DNS服务器的记录,比如,记录可以是

www.61k.com81.81.81.81

1)攻击者向你的DNS服务器发送请求查询

www.61k.com

2)你的DNS服务器不知道这台主机的IP地址,因为他不属于本身域,所有你的DNS服务器就会问此主机的所属域的DNS服务器。

3)这时被黑DNS服务器就会回复你的DNS服务器,在此同时它也会给出它所有的记录(包括连接

www.61k.com

的记录)

注意,这个过程叫做zone transfer.

按此在新窗口打开图片

4)这是你的DNS服务器还没有被麻痹。攻击者得到了自己的IP地址,但是他的目标不是得到自己网络服务器的地址,而是逼迫zone transfer进行以使你的DNS服务器麻痹直到其缓存不会被清楚或更新。

按此在新窗口打开图片

5)现在如果你再问你的DNS服务器关于

www.61k.com

的IP地址,它会告诉你172.50.50.50,这也正是攻击者的服务器所在!现在,攻击者就能为所欲为,例如挂马什么的……当然这也对google造成了相当的损失!

B)DNS ID欺骗(DNS ID Spoofing)

我们可以看到,当主机X要与主机Y联系是需要近来的IP地址。然而在绝大多数情况下,X只有Y的名字,这样,DNS协议就是来解决名字到IP地址的问题的。

因此,X就会向它所在域的DNS服务器询问Y的IP地址。其间,主机X分配一个随即数,这个数也将会出现在从DNS服务器返回的信息里。当X收到回复后,X会对比两个数字,如果一致,则收到信息被视为有效。

那这样一个模型是否安全呢?并非十分安全。任何人都可以组织一次攻击来获得这个ID。举例说如果你用LAN,别人就可以利用嗅探器捕获你的请求ID,然后根据这个ID伪造一个回复信息……但是信息里含有攻击者所选的IP地址。然后,不加识别的,X会吧攻击者提供的IP地址当作Y的。

顺便提一句,DNS协议的提出请求是依赖于UDP的(只有在zone transfer时才用TCP),这也就意味着发送一个伪造的包是极其简单的,因为没有SYN/ACK号(不像TCP,UDP没有提供一个小型防IP欺骗的防护)

按此在新窗口打开图片

按此在新窗口打开图片

但是,这样的攻击是被局限的。在我以上的例子中,攻击者用嗅探器拦获ID,回复构造过的包给受害主机。

换句话说,即使攻击者拦截了请求,数据包还是会传去DNS服务器,而DNS服务器也照样会回复(除非攻击者拦截并阻止对网关的请求或实施arp缓存麻痹才可能在转换网络中攻击)。

这就意味着攻击者必须在真DNS服务器前回复,即为了攻击成功,攻击者必须和被攻击者同一个LAN,只有这样他才可以获得快速的ping并且捕获对方的数据包。

实践举例(仅作测试目的)

看怎么劫持我们本地网络连接:

1、麻痹被攻击者的arp缓存(具体的工具和说明可以在

http://www.arp-sk.org

上找到)

2、此时,目标主机的出口数据包将会重定向到你的主机上,但是还必须转发给真正的网关。我们可以用类似Winroute Pro的工具来实现。

3、为了实施DNS ID欺骗我们用valgasu开发的工具

WinDNSSpoof

(在使用这个工具前请先安装Winpcap,见

http://winpcap.polito.it



命令行下输入类似的命令:

wds -n

www.61k.com

-i 123.123.123.123 -g 00-C0-26-DD-59-CF –v

这个命令会使目标主机的

www.61k.com

指向123.123.123.123。

其中00-C0-26-DD-59-CF是网关或DNS服务器的MAC地址。

Tips: 在Windows NT内核下,查询远程IP的MAC地址可以在CMD里用nbtstat -A xxx.xxx.xxx.xxx命令

警告:记住!在未授权的情况下使用这些手段是被禁止的!

C)借助生日悖论的精确攻击

什么是“生日悖论”?

“生日悖论”得名于一个能产生奇怪现象的数学模型,即如果有23人在一起,那么很有可能其中的两人有相同的生日。其实要理解也不是那么困难。

假设现在你在一个派对问某人他的生日,那么他跟你不同生日的几率就是364/365=0.997,则相同的概率就是1-364/365=0.003。

现在,如果你再问另外一个人,他的生日不同于前一人且不同于你的概率就是(364/365)*(363/365)=0.992,所以我们至少可以推得我们中两人有相同生日的概率为1-0.992=0.008。

如果我们继续这样的推算,很快就能算得23人中有两人的生日相同的概率高达50%。我们可以通过以下的C代码看出概率是如何趋近于1的。

 

Copy code

#define POSSIBILITIES 365.0

void main (void)

{

float chances;

int i, j;

for (i = 1; i

没法编译的朋友可以看下面的结果:

People

2

9

16

23

30

37

44

65

79

Chances

0.0027

0.0946

0.2836

0.5073

0.7063

0.8487

0.9329

0.9977

0.9999

没法编译的朋友可以看下面的结果:

生日悖论普遍的应用于检测哈希函数:N-位长度的哈希表可能发生碰撞测试次数不是2N次而是只有2N/2次。这一结论被应用到破解密码学散列函数的生日攻击中

生日问题所隐含的理论已经在[Schnabel 1938]名字叫做capture-recapture的统计试验得到应用,来估计湖里鱼的数量。

好,下面我们还是回到我的攻击测试上来,在上述的最为普遍的DNS欺骗攻击中,是在窃听(嗅探)网络以便得到来自X的ID号码,然后回复以相同的ID只是含有攻击者提供的IP。

就像我之前说的,这种攻击需要嗅探网络中的X生成的DNS数据。那这是不是意味着攻击者不能不用嗅探器实施攻击呢?

试着“猜猜”ID怎么样?

为什么不呢,但是ID号是用两字节构成的,这意味着有65535个可能的值!也就是说攻击者如果想要成功攻击的话,他要构造出65535个不同ID号的伪造回复,这样里面至少有且仅有一个包是可用的。

如果这样的攻击的话,我们需要相当好的带宽,而且最重要的是我们不知道何时发送伪造的回复。他就必须先知道对方有个请求,然后紧接着及时地(在真的来自DNS服务器的回复之前)发送回复。

让我们来从另一个角度看问题,我们知道是有可能性去直接麻痹DNS服务器的。回忆一下,攻击者是想DNS服务器询问解析

www.61k.com

,多亏有从ns.attacker.net来的恶意记录zone transfer,攻击者才可以麻痹DNS服务器的高速缓存器。值得重提的是,这种攻击的局限在于攻击者必须在运行自己带有恶意记录的DNS服务器。

这样的分析之下,如果攻击者没有办法嗅探你的网络数据或者没有自己的服务器,是不是就是说你就远离DNS劫持技术了?

答案是,完全不是这样。

我之前提到过,DNS协议是用UDP回复,UDP是非连接状态的协议,是没有像TCP三次握手的过程的。所以,这也就使得可以非常容易地用你选的任意IP发送UDP包。所以为什么攻击者在可以从任意DNS服务器发送伪造包的情况下要辛辛苦苦地架设起自己地DNS服务器呢?他可以直接询问受害者的DNS服务器解析

www.61k.com

,然后立即发送含伪造IP的包给

www.61k.com

的域名服务器。

好,这样时间刚好,这样是可行的,所以问题就只有受害者的DNS服务器将要向ns.google.com发送一次请求来得到

www.61k.com

的IP,同时有一个请求的ID号。所以又一次的,攻击者就必须发送65535个含ns.google.com的伪造包来做为受害者域名服务器的源地址。至少有一个包是吻合的。所以看来这个可能会成功。

下面就是最有趣的部分了……如果攻击者向受害者的DNS服务器发送了100份请求来解析

www.61k.com

会发生什么呢?那么ns.victim.com也将会向ns.google.com发送100份请求,那然后如果我们发送100个从 ns.google.com到ns.victim.com的伪造回复会怎样呢?如果你已经理解了刚刚提到的生日悖论原理,你就应该懂得相比之下冲撞(猜对)的概率已经有了可观的提高。

按此在新窗口打开图片

按此在新窗口打开图片

除此之外,还有个必须注意的小细节——源端口!

试想,ns.victim.com将要向ns.google.com发送请求,UDP头就应该像这样:

Copy code

Source address : ns.victim.com

Destination address : ns.google.com

Source port : 1256 (choosed randomly and > 1024)

Destination port : 53 (DNS port)

Data : What is the IP of www.61k.com

很明显,攻击者必须ns.victim.com的源端口作为目标端口发送伪造的DNS回复,包的内容就像:

Copy code

Source address : ns.google.com

Destination address : ns.victim.com

Source port : 53

Destination port : 1256

Data : The IP of www.61k.comis 81.81.81.81

所以如果我们没有嗅探又要怎样猜测源端口呢?“不幸”的是,对大多数DNS服务器来说,源端口是不会为每个客户端而改变的,因此攻击者可以很简单地通过看 ns.victim.com的目前源端口来得到。比方说,如果他有一个域名服务器,他只要请求DNS查找他的域的一个站名,得到的返回查询包就会包含现在在的被ns.victim.com用来发送DNS请求的源端口。

好,现在我知道如何得到源端口了,你可能会对攻击的成功率好奇。这也是我正要讲的。我们的C代码也有所改动:

Copy code

#define POSSIBILITIES 65535.0

void main (void)

{

float chances;

int i, j;

for (i = 0; i

结果如下:

Queries

50

100

150

200

250

300

350

400

500

550

650

750

Chances

0.0185

0.0728

0.1569

0.2621

0.3785

0.4961

0.6069

0.7048

0.8517

0.9008

0.9604

0.9865

我们可以看到,650个构造回复有0.960411的概率成功,近乎100%!

欲知更多详细信息,我建议阅读以下文章:

http://www.kb.cert.org/vuls/id/457875

http://www.61k.comguest/17905

D)总结

在这篇文章里,我用

www.61k.com

做例子,并不是因为我真的对其的重定向攻击感兴趣。这个问题在你访问你的银行账户,在线购书网站甚至是网页电子邮件时尤为重要。

而对于网站管理者来说,可行的防范措施有:

对高速缓存器加以限制,保证不保留额外的记录。

不要用或依赖DNS构架安全体系。

使用SSL之类的加密技术,所以即使被攻击,难度也会加大。

二 : DNS欺骗的原理 DNS防御实战演练

1.1 域名系统(Domain Name System)

DNS即Domain Name System 的缩写,域名系统以分布式数据库的形式将域名和IP地址相互映射。DNS协议即域名解析协议,简单的说:DNS是用来解析域名的。有了DNS我们就不用再记住烦人的IP地址,用相对好记的域名就可以对服务器进行访问,即使服务器更换了IP地址,我们依旧可以通过域名访问该服务器,这样能够使我们更方便的访问互联网。

为了方便理解DNS的工作原理,我简单做了一幅图:

假如我们要访问 www.baidu.com ,首先要向本地DNS服务器发出DNS请求,查询 www.baidu.com 的IP地址,如果本地DNS服务器没有在自己的DNS缓存表中发现该网址的记录,就会向根服务器发起查询,根服务器收到请求后,将com域服务器的地址返回给本地DNS服务器,本地DNS服务器则继续向com域发出查询请求,域服务器将 baidu.com 授权域名服务器的地址返回给本地DNS服务器,本地DNS服务器继续向 baidu.com 发起查询,得到 www.baidu.com 的IP地址。

本地DNS服务器得到 www.baidu.com 对应的IP地址后以dns应答包的方式传递给用户,并且在本地建立DNS缓存表。

Windows下查看和刷清空DNS缓存表的命令: ipconfig /displaydns    ipconfig /flushdns

1.2 DNS欺骗原理

尽管DNS在互联网中扮演着如此重要的角色,但是在设计DNS协议时,设计者没有考虑到一些安全问题,导致了DNS的安全隐患与缺陷。

DNS欺骗就是利用了DNS协议设计时的一个非常严重的安全缺陷。

首先欺骗者向目标机器发送构造好的ARP应答数据包,ARP欺骗成功后,嗅探到对方发出的DNS请求数据包,分析数据包取得ID和端口号后,向目标发送自己构造好的一个DNS返回包,对方收到DNS应答包后,发现ID和端口号全部正确,即把返回数据包中的域名和对应的IP地址保存进DNS缓存表中,而后来的当真实的DNS应答包返回时则被丢弃。

假设嗅探到目标靶机发出的DNS请求包有以下内容:

Source address : 192.168.1.57
Destination address : ns.baidu.com
Source port : 1234
Destination port : 53 (DNS port)
Data :
www.baidu.com

我们伪造的DNS应答包如下:


Source address : ns.baidu.com
Destination address : 192.168.1.57
Source port : 53 (DNS port)
Destination port : 1234
Data :
www.baidu.com 192.168.1.59

目标靶机收到应答包后把域名以及对应IP保存在了DNS缓存表中,这样www.baidu.com的地址就被指向到了192.168.1.59上。

2.1 实战DNS欺骗

同ARP欺骗一样,DNS欺骗也可以被称为DNS毒化,属于中间人攻击,我还是用虚拟机来模拟DNS欺骗攻击

用到的工具是Ettercap

首先来看目标靶机,

很明显现在www.baidu.com指向到的IP地址是正确的,

接着我们用ettercap来进行DNS欺骗,首先找到etter.dns这个配置文件并且编辑

添加一条A记录,将 www.baidu.com 指向到本机IP

保存并且退出,使用ettercap开始欺骗:

接着我们在到受到攻击的主机上看一下:

可以看到,目标主机对域名www.baidu.com的访问已经被指向到192.168.1.59

在浏览器中访问该域名便访问到事先搭建好的一台WEB服务器

以上就是一次成功的DNS欺骗

DNS欺骗的危害是巨大的,我不说大家也都懂得,常见被利用来钓鱼、挂马之类的

2.2 DNS欺骗的防范

DNS欺骗是很难进行有效防御的,因为大多情况下都是被攻击之后才会发现,对于避免DNS欺骗所造成危害,本菜鸟提出以下建议

1.因为DNS欺骗前提也需要ARP欺骗成功。所以首先做好对ARP欺骗攻击的防范。

2.不要依赖于DNS,尽管这样会很不方便,可以使用hosts文件来实现相同的功能,Hosts文件位置:

windows xp/2003/vista/2008/7 系统的HOSTS文件位置 c:windowssystem32driversetc 用记事本打开即可进行修改。

3.使用安全检测软件定期检查系统是否遭受攻击

4.使用DNSSEC。

最近小编整理了许多关于DNS欺骗的文章,希望大家多多阅读,多多学习。

三 : DNS欺骗技术教程

定义: DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。 原理:如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。 现在的Internet上存在的DNS服务器有绝大多数都是用bind来架设的,使用的bind版本主要为bind 4.9.5 P1以前版本和bind 8.2.2-P5以前版本.这些bind有个共同的特点,就是BIND会缓存(Cache)所有已经查询过的结果,这个问题就引起了下面的几个问题的存在.
1>.DNS欺骗
在DNS的缓存还没有过期之前,如果在DNS的缓存中已经存在的记录,一旦有客户查询,DNS服务器将会直接返回缓存中的记录.
下面我们来看一个例子:
一台运行着unix的Internet主机,并且提供rlogin服务,它的IP地址为123.45.67.89,它使用的DNS服务器(即/etc/resolv.conf中指向的DNS服务器)的IP地址为98.76.54.32,某个客户端(IP地址为38.222.74.2)试图连接到unix主机的rlogin端口,假设unix主机的/etc/hosts.equiv文件中使用的是dns名称来允许目标主机的访问,那么unix主机会向IP为98.76.54.32的DNS服务器发出一个PTR记录的查询:
123.45.67.89 -> 98.76.54.32 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.74.222.38.in-addr.arpa PTR
IP为98.76.54.32的DNS服务器中没有这个反向查询域的信息,经过一番查询,这个DNS服务器找到38.222.74.2和38.222.74.10为74.222.38.in-addr.arpa.的权威DNS服务器,所以它会向38.222.74.2发出PTR查询: 98.76.54.32 -> 38.222.74.2 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.74.222.38.in-addr.arpa PTR
请注意,38.222.74.2是我们的客户端IP,也就是说这台机子是完全掌握在我们手中的.我们可以更改它的DNS记录,让它返回我们所需要的结果: 38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 2 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: trusted.host.com A 38.222.74.2
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
当98.76.54.32的DNS服务器收到这个应答后,会把结果转发给123.45.67.98,就是那台有rlogin服务的unix主机(也是我们的目标 :) ),并且98.76.54.32这台DNS服务器会把这次的查询结果缓存起来. 这时unix主机就认为IP地址为38.222.74.2的主机名为trusted.host.com,然后unix主机查询本地的/etc/hosts.equiv文件,看这台主机是否被允许使用rlogin服务,很显然,我们的欺骗达到了.
在unix的环境中,有另外一种技术来防止这种欺骗的发生,就是查询PTR记录后,也查询PTR返回的主机名的A记录,然后比较两个IP地址是否相同:
123.45.67.89 -> 98.76.54.32 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: trusted.host.com A
很不幸,在98.76.54.32的DNS服务器不会去查询这个记录,而会直接返回在查询2.74.222.38.in-addr.arpa时得到的并且存在缓存中的信息:
98.76.54.32 -> 123.45.67.89 [Query]
NQY: 1 NAN: 1 NNS: 2 NAD: 2
QY: trusted.host.com A
AN: trusted.host.com A 38.222.74.2
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
那么现在unix主机就认为38.222.74.2就是真正的trusted.host.com了,我们的目的达到了!
这种IP欺骗的条件是:你必须有一台Internet上的授权的DNS服务器,并且你能控制这台服务器,至少要能修改这台服务器的DNS记录,我们的欺骗才能进行. 2>.拒绝服务攻击 Denial of service
还是上面的例子,如果我们更改位于38.222.74.2的记录,然后对位于98.76.54.32的DNS服务器发出2.74.222.38.in-addr.arpa的查询,并使得查询结果如下:
因为74.222.38.in-addr.arpa完全由我们控制,所以我们能很方便的修改这些信息来实现我们的目的.
38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 2 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: www.company.com A 0.0.0.1
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
这样一来,使用98.76.54.32这台DNS服务器的用户就不能访问www.company.com了,因为这个IP根本就不存在!
3>.偷取服务 Theft of services
还是上面的例子,只是更改的查询结果如下:
38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 3 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: www.company.com CNAME www.competitor.com
AN: company.com MX 0 mail.competitor.com
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10 这样一来,一个本想访问http://www.competitor.com的用户会被带到另外一个地方,甚至是敌对的公司的竹叶(想想把华为和北电联起来是什么样的感觉. :) ).并且发给company.com的邮件会被发送给mail.compertitor.com.(越来越觉得在网络上的日子不踏实! xxbin这样想).
4>.限制
对这些攻击,也有一定的限制.
首先,攻击者不能替换缓存中已经存在的记录.比如说,如果在98.76.54.32这个DNS服务器上已经有一条www.company.com的CNAME记录,那么攻击者试图替换为www.competitor.com将不会成功.然而,一些记录可以累加,比如A记录,如果在DNS的缓存中已经存在一条www.company.com的A记录为1.2.3.4,而攻击者却欺骗DNS服务器说www.company.com的A记录为4.3.2.1,那么www.company.com将会有两个A记录,客户端查询时会随机返回其中一个.(呵呵,这不是loading balance么?)
其次,DNS服务器有个缓存刷新时间问题,如果www.netbuddy.org的TTL为7200,那么DNS服务器仅仅会把www.netbuddy.org的信息缓存7200秒或者说两个小时.如果攻击者放入一条TLL为604800的A记录,那么这条记录将会在缓存中保存一周时间,过了默认的两天后,这个DNS服务器就会到处"分发"攻击者假造的记录.
下面是常用的几种可以累加和不能累加的记录:
A can add
NS can add
MX can add
PTR cannot add

四 : DNS欺骗

定义: DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。

原理:如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。

现在的Internet上存在的DNS服务器有绝大多数都是用bind来架设的,使用的bind版本主要为bind 4.9.5 P1以前版本和bind 8.2.2-P5以前版本.这些bind有个共同的特点,就是BIND会缓存(Cache)所有已经查询过的结果,这个问题就引起了下面的几个问题的存在.
1>.DNS欺骗
在DNS的缓存还没有过期之前,如果在DNS的缓存中已经存在的记录,一旦有客户查询,DNS服务器将会直接返回缓存中的记录.
下面我们来看一个例子:
一台运行着unix的Internet主机,并且提供rlogin服务,它的IP地址为123.45.67.89,它使用的DNS服务器(即/etc/resolv.conf中指向的DNS服务器)的IP地址为98.76.54.32,某个客户端(IP地址为38.222.74.2)试图连接到unix主机的rlogin端口,假设unix主机的/etc/hosts.equiv文件中使用的是dns名称来允许目标主机的访问,那么unix主机会向IP为98.76.54.32的DNS服务器发出一个PTR记录的查询:
123.45.67.89 -> 98.76.54.32 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.74.222.38.in-addr.arpa PTR
IP为98.76.54.32的DNS服务器中没有这个反向查询域的信息,经过一番查询,这个DNS服务器找到38.222.74.2和38.222.74.10为74.222.38.in-addr.arpa.的权威DNS服务器,所以它会向38.222.74.2发出PTR查询:

98.76.54.32 -> 38.222.74.2 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.74.222.38.in-addr.arpa PTR
请注意,38.222.74.2是我们的客户端IP,也就是说这台机子是完全掌握在我们手中的.我们可以更改它的DNS记录,让它返回我们所需要的结果:

38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 2 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: trusted.host.com A 38.222.74.2
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
当98.76.54.32的DNS服务器收到这个应答后,会把结果转发给123.45.67.98,就是那台有rlogin服务的unix主机(也是我们的目标 :) ),并且98.76.54.32这台DNS服务器会把这次的查询结果缓存起来.

这时unix主机就认为IP地址为38.222.74.2的主机名为trusted.host.com,然后unix主机查询本地的/etc/hosts.equiv文件,看这台主机是否被允许使用rlogin服务,很显然,我们的欺骗达到了.
在unix的环境中,有另外一种技术来防止这种欺骗的发生,就是查询PTR记录后,也查询PTR返回的主机名的A记录,然后比较两个IP地址是否相同:
123.45.67.89 -> 98.76.54.32 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: trusted.host.com A
很不幸,在98.76.54.32的DNS服务器不会去查询这个记录,而会直接返回在查询2.74.222.38.in-addr.arpa时得到的并且存在缓存中的信息:
98.76.54.32 -> 123.45.67.89 [Query]
NQY: 1 NAN: 1 NNS: 2 NAD: 2
QY: trusted.host.com A
AN: trusted.host.com A 38.222.74.2
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
那么现在unix主机就认为38.222.74.2就是真正的trusted.host.com了,我们的目的达到了!
这种IP欺骗的条件是:你必须有一台Internet上的授权的DNS服务器,并且你能控制这台服务器,至少要能修改这台服务器的DNS记录,我们的欺骗才能进行.

2>.拒绝服务攻击 Denial of service
还是上面的例子,如果我们更改位于38.222.74.2的记录,然后对位于98.76.54.32的DNS服务器发出2.74.222.38.in-addr.arpa的查询,并使得查询结果如下:
因为74.222.38.in-addr.arpa完全由我们控制,所以我们能很方便的修改这些信息来实现我们的目的.
38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 2 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: www.company.com A 0.0.0.1
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10
这样一来,使用98.76.54.32这台DNS服务器的用户就不能访问www.company.com了,因为这个IP根本就不存在!
3>.偷取服务 Theft of services
还是上面的例子,只是更改的查询结果如下:
38.222.74.2 -> 98.76.54.32 [Answer]
NQY: 1 NAN: 3 NNS: 2 NAD: 2
QY: 2.74.222.38.in-addr.arpa PTR
AN: 2.74.222.38.in-addr.arpa PTR trusted.host.com
AN: www.company.com CNAME www.competitor.com
AN: company.com MX 0 mail.competitor.com
NS: 74.222.38.in-addr.arpa NS ns.sventech.com
NS: 74.222.38.in-addr.arpa NS ns1.sventech.com
AD: ns.sventech.com A 38.222.74.2
AD: ns1.sventech.com A 38.222.74.10

这样一来,一个本想访问http://www.competitor.com的用户会被带到另外一个地方,甚至是敌对的公司的竹叶(想想把华为和北电联起来是什么样的感觉. :) ).并且发给company.com的邮件会被发送给mail.compertitor.com.(越来越觉得在网络上的日子不踏实! xxbin这样想).
4>.限制
对这些攻击,也有一定的限制.
首先,攻击者不能替换缓存中已经存在的记录.比如说,如果在98.76.54.32这个DNS服务器上已经有一条www.company.com的CNAME记录,那么攻击者试图替换为www.competitor.com将不会成功.然而,一些记录可以累加,比如A记录,如果在DNS的缓存中已经存在一条www.company.com的A记录为1.2.3.4,而攻击者却欺骗DNS服务器说www.company.com的A记录为4.3.2.1,那么www.company.com将会有两个A记录,客户端查询时会随机返回其中一个.(呵呵,这不是loading balance么?)
其次,DNS服务器有个缓存刷新时间问题,如果www.netbuddy.org的TTL为7200,那么DNS服务器仅仅会把www.netbuddy.org的信息缓存7200秒或者说两个小时.如果攻击者放入一条TLL为604800的A记录,那么这条记录将会在缓存中保存一周时间,过了默认的两天后,这个DNS服务器就会到处"分发"攻击者假造的记录.
下面是常用的几种可以累加和不能累加的记录:
A can add
NS can add
MX can add
PTR cannot add

五 : 局域网DNS欺骗

原理介绍域名系统(DNS)是1种用于TCP/IP应用程序的分布式数据库,提供主机名字和IP地址之间的转换信息,通常网络用户通过UDP和DNS服务器进行交换,服务器通常会在53号端口监听域名查询的请求。在DNS数据报中有个字段为id,windows下是根据这个id是否匹配来判断是否是自己发出的域名查询结果。欺骗原理:Client<-----------response-----------|.......................DNSServerClient|<--------[a.b.c=0.0.0.0]----YourComputer这里讨论的是局域网内的欺骗,本地的主机或者DNS服务器中至少有一台是与自己的主机在同1个局域网内。首先我们以客户端的名义向网关发送ARP响应数据报,不过其中将源MAC地址改为我们自己主机的MAC地址;同时以网关的名义向客户端主机发送ARP响应数据报,同样将源MAC地址改为我们自己主机的MAC地址。这样以来,网关看来客户端的MAC地址就是我们主机的MAC地址;客户端也认为网关的MAC地址为我们主机的MAC地址。由于在局域网内数据报的传送是建立在MAC地址之上了,所以网关和客户端之间的数据流通必须先通过本地主机。

  在监视网关和客户端主机之间的数据报时,如果发现了客户端发送的DNS查询数据报(目的端口为53),那么我们可以提前将自己构造的DNS响应数据报发送到客户端。注意,我们必须提取有客户端发送来的DNS查询数据报的ID信息,因为客户端是通过它来进行匹配认证的,这就是1个我们可以利用的DNS漏洞。这样客户端会先收到我们发送的DNS响应数据报并访问我们自定义的网站,虽然客户端也会收到DNS服务器的响应报文,不过已经来不及了。

工具、环境

windows系统、visualstudio集成开发环境、wpdpack4.1

核心代码

1.DNS相关

  //将网卡设置为混杂模式

 PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS);

  //设置网络适配器的内核缓存; 

  PacketSetBuff(lpadapter,500*1024);

//设置等待时间

  PacketSetReadTimeout(lpadapter,1);

//接收网络数据

  PacketReceivePacket(lpadapter,lppacketr,TRUE);

  //计算校验和

  checksum((USHORT*)temp,sizeof(PSD)+sizeof(UDPHDR)+sizeof(DNS)+ulen+sizeof(QUERY)+sizeof(RESPONSE));

  //初始化1个PACKET结构,发送DNS响应数据报

  PacketInitPacket(lppackets,sendbuf,sizeof(ETHDR)+sizeof(IPHDR)+sizeof(UDPHDR)+sizeof(DNS)+ulen+4+sizeof(RESPONSE));

2.ARP欺骗相关

//初始化ARP响应数据报

PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));

  //发送ARP欺骗的响应数据报

  PacketSendPacket(lpadapter,lppackets,TRUE);

  //获取网络适配器的属性

  GetAdaptersInfo(padapterinfo,&adapterinfosize);

  //发送ARP请求数据报,请求网络主机的MAC地址

  SendARP(destip,0,pulmac,&ullen);

3.一些核心的数据结构

主要包括DNS请求、响应、ARP报文、网络适配器信息结构,具体可查看相关材料,这里不列出。

本文标题:dns欺骗-DNS欺骗技术揭秘
本文地址: http://www.61k.com/1090792.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1