邪恶八进制信息安全团队技术讨论组's Archiver

flux 2007-4-4 15:59

[翻译]DNS(域名服务器)欺骗技术

文章作者:Spacefox, Secure Sphere Crew
译文作者:Conan, OS3 (Open Source Software Society) / CICC Singapore(Center of International Cooperation for Computerization in Singapore)
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

概述:什么是DNS欺骗?
DNS欺骗是一门改变DNS原始指向IP的艺术。为了更好的理解,让我们先来看一个例子。如果你想用浏览器去google搜索一些信息,毫无疑问的你会在地址栏里输入 [url=http://www.google.com/]www.google.com[/url]的网址然后回车。

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

其实刚刚就是DNS劫持攻击时目击者可能看到的情形。
[quote] 试想如果跳转的页面被无声无息地挂着马又会多糟糕 [/quote]
非常急切地相要知道着其中地玄机吧?是不是DNS服务器给了我们一个错误地IP地址?可能是吧。至少,这是我们脑中最符合逻辑地答案。
[img]http://www.conan1412.os3.sg/conan/cblog/wp-includes/images/smilies/icon_biggrin.gif[/img]
事实上,有两种方法可以实现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服务器的记录,比如,记录可以是[url]www.google.com=81.81.81.81[/url]

1)攻击者向你的DNS服务器发送请求查询[url=http://www.attacker.net/]www.attacker.net[/url]
[attach]5658[/attach]

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

3)这时被黑DNS服务器就会回复你的DNS服务器,在此同时它也会给出它所有的记录(包括连接[url=http://www.google.com/]www.google.com[/url]的记录)
注意,这个过程叫做zone transfer.
[attach]5660[/attach]
4)这是你的DNS服务器还没有被麻痹。攻击者得到了自己的IP地址,但是他的目标不是得到自己网络服务器的地址,而是逼迫zone transfer进行以使你的DNS服务器麻痹直到其缓存不会被清楚或更新。
[attach]5661[/attach]

5)现在如果你再问你的DNS服务器关于[url]www.google.com[/url]的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欺骗的防护)
[attach]5662[/attach]
[attach]5663[/attach]
但是,这样的攻击是被局限的。在我以上的例子中,攻击者用嗅探器拦获ID,回复构造过的包给受害主机。

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

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

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

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

1、麻痹被攻击者的ARP缓存(具体的工具和说明可以在[url=http://www.arp-sk.org/]http://www.arp-sk.org[/url]上找到)

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

3、为了实施DNS ID欺骗我们用valgasu开发的工具[url=http://www.securesphere.net/download/windnsspoof.zip]WinDNSSpoof[/url](在使用这个工具前请先安装Winpcap,见[url=http://winpcap.polito.it/]http://winpcap.polito.it[/url])

命令行下输入类似的命令:
wds -n [url]www.google.com[/url] -i 123.123.123.123 -g 00-C0-26-DD-59-CF –v

这个命令会使目标主机的[url=http://www.google.com/]www.google.com[/url]指向123.123.123.123。

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

[blockquote]Tips: 在Windows NT内核下,查询远程IP的MAC地址可以在CMD里用nbtstat  -A xxx.xxx.xxx.xxx命令
[/blockquote][u]警告:[/u]记住!在未授权的情况下使用这些手段是被禁止的!

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的。
[code]
#define POSSIBILITIES 365.0
void main (void)
{
float chances;
int i, j;
for (i = 1; i < 100; i++)
{
for (j = 1, chances = 1; j < i; j++)
  chances *= (float)((POSSIBILITIES - j) / POSSIBILITIES);
printf("For %d people, chances are %f\n", i, 1-chances);
}
}
[/code]
没法编译的朋友可以看下面的结果:
[table=100%][tr][td]People
[/td][td]2
[/td][td]9
[/td][td]16
[/td][td]23
[/td][td]30
[/td][td]37
[/td][td]44
[/td][td]65
[/td][td]79
[/td][/tr][tr][td]Chances
[/td][td]0.0027
[/td][td]0.0946
[/td][td]0.2836
[/td][td]0.5073
[/td][td]0.7063
[/td][td]0.8487
[/td][td]0.9329
[/td][td]0.9977
[/td][td]0.9999
[/td][/tr][/table]
没法编译的朋友可以看下面的结果:
[attach]5664[/attach]
生日悖论普遍的应用于检测哈希函数:N-位长度的哈希表可能发生碰撞测试次数不是2N次而是只有2N/2次。这一结论被应用到破解密码学散列函数的生日攻击中

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

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

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

试着“猜猜”ID怎么样?

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

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

让我们来从另一个角度看问题,我们知道是有可能性去直接麻痹DNS服务器的。回忆一下,攻击者是想DNS服务器询问解析[url]www.attacker.net[/url],多亏有从ns.attacker.net来的恶意记录zone transfer,攻击者才可以麻痹DNS服务器的高速缓存器。值得重提的是,这种攻击的局限在于攻击者必须在运行自己带有恶意记录的DNS服务器。

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

答案是,完全不是这样。

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

好,这样时间刚好,这样是可行的,所以问题就只有受害者的DNS服务器将要向ns.google.com发送一次请求来得到[url]www.google.com[/url]的IP,同时有一个请求的ID号。所以又一次的,攻击者就必须发送65535个含ns.google.com的伪造包来做为受害者域名服务器的源地址。至少有一个包是吻合的。所以看来这个可能会成功。

下面就是最有趣的部分了……如果攻击者向受害者的DNS服务器发送了100份请求来解析[url]www.google.com[/url]会发生什么呢?那么ns.victim.com也将会向ns.google.com发送100份请求,那然后如果我们发送100个从ns.google.com到ns.victim.com的伪造回复会怎样呢?如果你已经理解了刚刚提到的生日悖论原理,你就应该懂得相比之下冲撞(猜对)的概率已经有了可观的提高。
[attach]5665[/attach]
[attach]5666[/attach]
除此之外,还有个必须注意的小细节——源端口!

试想,ns.victim.com将要向ns.google.com发送请求,UDP头就应该像这样:
[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 [url]www.google.com?[/url]
[/code]
很明显,攻击者必须ns.victim.com的源端口作为目标端口发送伪造的DNS回复,包的内容就像:
[code]
Source address : ns.google.com
Destination address : ns.victim.com
Source port : 53
Destination port : 1256
Data : The IP of [url]www.google.com[/url] is 81.81.81.81
[/code]
所以如果我们没有嗅探又要怎样猜测源端口呢?“不幸”的是,对大多数DNS服务器来说,源端口是不会为每个客户端而改变的,因此攻击者可以很简单地通过看ns.victim.com的目前源端口来得到。比方说,如果他有一个域名服务器,他只要请求DNS查找他的域的一个站名,得到的返回查询包就会包含现在在的被ns.victim.com用来发送DNS请求的源端口。
好,现在我知道如何得到源端口了,你可能会对攻击的成功率好奇。这也是我正要讲的。我们的C代码也有所改动:
[code]
#define POSSIBILITIES 65535.0
void main (void)
{
float chances;
int i, j;
for (i = 0; i < 800; i+=50)
{
for (j = 1, chances = 1; j < i; j++)
  chances *= (float)((POSSIBILITIES - j) / POSSIBILITIES);
printf("For %d fake replies, chances are %f\n", i, 1-chances);
}
}
[/code]
结果如下:
[table=100%][tr][td]Queries
[/td][td]50
[/td][td]100
[/td][td]150
[/td][td]200
[/td][td]250
[/td][td]300
[/td][td]350
[/td][td]400
[/td][td]500
[/td][td]550
[/td][td]650
[/td][td]750
[/td][/tr][tr][td]Chances
[/td][td]0.0185
[/td][td]0.0728
[/td][td]0.1569
[/td][td]0.2621
[/td][td]0.3785
[/td][td]0.4961
[/td][td]0.6069
[/td][td]0.7048
[/td][td]0.8517
[/td][td]0.9008
[/td][td]0.9604
[/td][td]0.9865
[/td][/tr][/table]
我们可以看到,650个构造回复有0.960411的概率成功,近乎100%!
欲知更多详细信息,我建议阅读以下文章:
[url=http://www.kb.cert.org/vuls/id/457875]http://www.kb.cert.org/vuls/id/457875[/url]
[url=http://www.securityfocus.com/guest/17905]http://www.securityfocus.com/guest/17905[/url]

D)总结

在这篇文章里,我用[url]www.google.com[/url]做例子,并不是因为我真的对其的重定向攻击感兴趣。这个问题在你访问你的银行账户,在线购书网站甚至是网页电子邮件时尤为重要。

而对于网站管理者来说,可行的防范措施有:
[list][li]对高速缓存器加以限制,保证不保留额外的记录。[/li]
[li]不要用或依赖DNS构架安全体系。[/li]
[li]使用SSL之类的加密技术,所以即使被攻击,难度也会加大(见Man in the Middle中的文章)
[/li][/list]如有任何想法、评论或批评,欢迎电邮致:
[table=100%][tr][td][email]spacefox@securesphere.net[/email]

Spacefox,
[url=http://www.securesphere.net/]SecureSphereCrew,[/url][/td][td][email]zzjqf17@hotmail.com[/email]

Conan,
[url=http://cblog.conan1412.os3.sg/]CBlog,[/url][/td][/tr][/table]
2007 April

fr.qaker 2007-4-11 12:54

这篇文章应该是转载的,那么请给出转载地址
如果是你自己翻译的,你应该给出原文来源

呵呵,尤其是这样一篇没有翻译完全的文章哦

pixy 2007-4-11 17:26

[quote]fr.qaker [/quote]
好久都没看到项目主管了...

应该说这篇文章很不错,也很简单...易懂..

主要是主题信息来源没发清楚,请补充!

看到fr.qaker 来了,顶一个.

flux 2007-4-11 20:20

[quote]引用第1楼fr.qaker于2007-04-11 12:54发表的 :
这篇文章应该是转载的,那么请给出转载地址
如果是你自己翻译的,你应该给出原文来源

呵呵,尤其是这样一篇没有翻译完全的文章哦[/quote]

谢谢指正,

文章作者:Spacefox,

fr.qaker 2007-4-12 23:52

看了一下原文,第三部分是说关于如果提高攻击的精确性的,运用了一个概率学上的问题,就是同一天生日的概率。

简单介绍下同一天生日的问题:
大家会发现,班上 50个同学,通常都能发现某两个同学是同一天生日,然后惊呼“好巧”

其实,这个在概率上是一个经典的问题,经过计算,得到23个人有50%的概率发现一对同一天生的,44个人能达到93%

然后,这一部分介绍了这个概率学原理如何运用到攻击中
因为ID空间为65535大小,因为无法猜测实际ID,所以需要全面覆盖,但是覆盖空间为65535次,需要大量的时间和宽带,这样不现实

作者在文章通过提高发送次数和猜测次数的方法,就是发送100个请求,这样就有100个随机的ID,然后伪造100个返回,其中也有100个随机的ID,这样请求和返回中,发生同样ID的概率为7.28%,那么多少够呢?750个,98.65%的概率。也就是说,修改原来的,1次发送,65535次猜测,变成750次发送,750次猜测。总数据从65536降到1500,但是成功率依然有98.65%

简单的一个证明方法,利用随机数生成750个1-65535的数,放入数组A,再生成750个,放入数组B,然后查找看看,A和B是否共同拥有某一个数,或多个数。这个概率是98.65%

第四部分就是总结了

-------------------------------------------------------------------
简单介绍了一下未完成的部分,满足大家的求知欲望

期待Conan的进一步完善
---------------------------------------------------------------------
ps:私人问一下,conan是不是就是flux呢,呵呵

jaywalk0926 2007-4-13 12:37

CONAN不是FLUX,是CONAN授权给FLUX转载到这的.

flux 2007-4-13 18:12

===========

全部翻译已完成。

===========

[quote]ps:私人问一下,conan是不是就是flux呢,呵呵[/quote]
[quote]CONAN不是FLUX,是CONAN授权给FLUX转载到这的.[/quote]

曾经不是,现在是。
仅表示对遇车祸生死未卜兄弟的惦念……

===========

PS.由于我在这个论坛的权限比较低,所以帖子的图片没法上传,只能引用外部网络资源。还麻烦管理者帮助上传。

fr.qaker 2007-4-13 21:55

哇,欢迎flux加入,欢迎他的好文章:)

这已经不当当是个翻译了哦,flux兄弟把文章吃透了,还给出了更简洁的描述

tanaer 2007-4-16 16:42

  nbtstat 有时候找不到网关MAC的.



arp -d
ping 网关IP
arp -a

这样绝对找的到.

flux 2007-7-17 00:49

[quote]引用第9楼落叶于2007-07-15 16:41发表的 :
我觉得其中还是有点错别字和用词不当的现象。[/quote]
不好意思,最近在做新的project,所以没有时间来论坛。
看来我的华语是差了,还希望您能多多指正,以免我步入歧途,谢谢!

hackmcs 2007-12-7 15:40

那么在这背后又有什么事情正在进行着呢?一般而言,你的浏览器将会向DNS服务器发送一个请求,从而要求得到与[url]www.google.com[/url]相匹配的IP地址,DNS服务器则会告诉你的浏览器google的IP地址,接着你的浏览器会连接并显示主页内容。

大多数情况DNS解析应该是“缓存-HOST文件-向DNS服务器发送请求”的步骤吧?
小弟出来乍到,还请各位大哥多多照顾![s:269]

heekey 2008-2-3 20:32

这种ARP欺骗
和路由器的IP地址池没有关系么》
那上怎么解决那里的对应问题?

wukaikey 2008-4-6 17:44

arp工具拦截数据包,然后修改数据包里面的目标地址,把目标地址指向到你想指定的计算机上,不就完成了DNS欺骗吗?

cchhd 2008-4-7 13:52

[quote]原帖由 [i]tanaer[/i] 于 2007-4-16 16:42 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=84452&ptid=27932][img]images/common/back.gif[/img][/url]
  nbtstat 有时候找不到网关MAC的.



arp -d
ping 网关IP
arp -a

这样绝对找的到. [/quote]

直接ping ip
然后 arp -a
就可以了吧?

antonia 2008-4-12 19:34

[quote]原帖由 [i]tanaer[/i] 于 2007-4-16 16:42 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=84452&ptid=27932][img]images/common/back.gif[/img][/url]
  nbtstat 有时候找不到网关MAC的.



arp -d
ping 网关IP
arp -a

这样绝对找的到. [/quote]

支持对文章的完善  
不断的对知识的准确性进行更新
会不断取得进步

xets 2008-4-23 14:41

有问题问,

这里能否写的更清楚点:
{
所以如果我们没有嗅探又要怎样猜测源端口呢?“不幸”的是,对大多数DNS服务器来说,源端口是不会为每个客户端而改变的,因此攻击者可以很简单地通过看ns.victim.com的目前源端口来得到。比方说,如果他有一个域名服务器,他只要请求DNS查找他的域的一个站名,得到的返回查询包就会包含现在在的被ns.victim.com用来发送DNS请求的源端口。
}
假设一般的工作站向它所属的DNS查询一个[url]www.xxx.com[/url]的域名信息,DNS服务器没有记录,那DNS服务器就会向别的DNS服务器查询,查询时用的源端口怎么得到的呢?DNS服务器返回给查询工作站的信息里面MS没有吧?

zerosoul 2008-5-9 13:09

[quote]原帖由 [i]cchhd[/i] 于 2008-4-7 13:52 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=140975&ptid=27932][img]images/common/back.gif[/img][/url]


直接ping ip
然后 arp -a
就可以了吧? [/quote]
arp -d是先清除本机的arp表,这样再ping ip,然后arp -a的时候就只有一条记录,便于查看。

yinchong 2008-5-28 11:17

DNS欺骗搞那麻烦做什么啊
直接ARP拦截修改目标地址,把目标地址改成自己的地址不就成功了DNS欺骗吗?

泡泡 2008-6-14 05:02

[quote]原帖由 [i]cchhd[/i] 于 2008-4-7 13:52 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=140975&ptid=27932][img]images/common/back.gif[/img][/url]


直接ping ip
然后 arp -a
就可以了吧? [/quote]


这样如果在同一个子网``

页: [1]
© 1999-2008 EvilOctal Security Team