DNS攻击详解

DNS ID Hackingwww.rising.com.cn 2002-12-11 14:09:00 信息源:www.xfocus.org 作者:quack(quack@hack.co.za)参

DNS ID Hacking

www.rising.com.cn 2002-12-11 14:09:00 信息源:www.xfocus.org 作者:quack(quack@hack.co.za)

参考资料:DNS ID Hacking by ADM crew

一、关于DNS ID Hacking的一些描述

你可能会对DNS ID Hackingspoofing的含义有些迷惑,它与一般直接攻击一样,只

不过利用的是DNS 协议上的漏洞,并且可能有较大的普遍性及伤害作用——好象没什 么DNS 服务器能够逃过它——甚至WINNT 。

1、DNS 协议机制简述

首先我们来看看DNS 是如何工作的,我将在这里说明这一协议中相对重要的一些部份。为了更好的叙述,我们先用一个实例来看一看一个DNS 请求的信息包是如何在网络里传送的吧。

1.1 :客户机(bla.bibi.com)发送一个请求要求解析域名"www.heike.com" ,bla.bibi.com

的DNS 是ns.bibi.com 这台机器,现在我们看看下图吧:

/---------------------------------

| 111.1.2.123 = bla.bibi.com |

| 111.1.2.222 = ns.bibi.com |

| 格式: |

| IP_ADDR:PORT->IP_ADDR:PORT |

| 示例: |

| 111.1.2.123:2999->111.1.2.222:53|

---------------------------------/

这图是我们要分析的情况的示意,应该很清楚了,好,那就看看gethostbyname 是

,

如何

工作的:

....

gethosbyname("www.heike.com");

....

[bla.bibi.com] [ns.bibi.com]

111.1.2.123:1999 --->[?www.heike.com]------> 111.1.2.222:53

这里我们可以看到这个名字请求从bla.bibi.com 的1999端口(随机选择) 发送到了dns

机器的53端口——DNS 的绑定端口。

dns.bibi.com 收到这个解析的请求后,就开始了它的工作了……

[ns.bibi.com] [ns.internic.net]

111.1.2.222:53 -------->[dns?www.heike.com]----> 198.41.0.4:53

它先问ns.internic.net 哪台机器是www.heike.com 的主名称服务器,如果没查到的话

它就把请求发往.com 域的权威服务器。在这里要先问ns.internic.net 的原因是,可 能这个域名在它的缓存里存在着——这可以节约时间。

[ns.internic.net] [ns.bibi.com] 198.41.0.4:53 ------>[ns for.com is 144.44.44.4]------> 111.1.2.222:53 这里ns.internic.net 就回答了ns.bibi.com ,.com 的权威DNS 的IP 在

144.44.44.4,我

们叫它ns.for.com 吧,然后ns.bibi.com 会问ns.for.com 关于www.heike.com 的地址, 仍然没有找到——于是又请求heike.com 的DNS 权威服务器的地址。

[ns.bibi.com] [ns.for.com]

,

111.1.2.222:53 ------>[?www.heike.com]-----> 144.44.44.4:53

ns.for.com 的应答。

[ns.for.com] [ns.bibi.com] 144.44.44.4:53 ------>[ns for heike.com is 31.33.7.4]---> 144.44.44.4:53 现在我们知道了管heike.com 域的权威服务器的IP 地址了,姑且称之为

ns.heike.com

吧,我们可以问它www.hieke.com 的IP 地址了;)

[ns.bibi.com] [ns.heike.com]

111.1.2.222:53 ----->[?www.heike.com]----> 31.33.7.4:53

现在我们得到了www.heike.com 的IP 喽!

[ns.heike.com] [ns.bibi.com] 31.33.7.4:53 ------->[www.heike.com == 31.33.7.44] ----> 111.1.2.222:53 ns.bibi.com 把它转发给刚才发送请求的机器bla.bibi.com

[ns.bibi.com] [bla.bibi.com] 111.1.2.222:53 ------->[www.heike.com == 31.33.7.44]----> 111.1.2.123:1999 呵呵,现在bla.bibi.com 就晓得www.heike.com 的IP 地址了 :)

好了,现在我们假想另一种情况吧,我们希望通过机器的IP 来得到它的域名,为了做

到这点,我们做的是所谓的" 指针查询" 。由于DNS 树中名字是从底向上写的,所以我们 要做如下的一个转换:

示例:

100.20.40.3将被表示为3.40.20.100.in-addr.arpa

,

这种方式仅用于DNS 的IP 解析请求。

现在来看看我们通过31.33.7.44(www.heike.com)的IP 来查询它的域名的过程吧,或者

说是通过44.7.33.31.in-addr.arpa 来查询它的域名的过程;)

....

gethostbyaddr("31.33.7.44");

....

[bla.bibi.com] [ns.bibi.com] 111.1.2.123:2600 ----->[?44.7.33.31.in-addr.arpa]-----> 111.1.2.222:53 我们发送请求到ns.bibi.com

[ns.bibi.com] [ns.internic.net] 111.1.2.222:53 ----->[?44.7.33.31.in-addr.arpa]------> 198.41.0.4:53 ns.internic.net 将会把认证该IP 的地址'31.in-addr.arpa' 返回给请求者

[ns.internic.net] [ns.bibi.com]

198.41.0.4:53 --> [DNS for 31.in-addr.arpa is 144.44.44.4] -> 111.1.2.222:53 现在ns.bibi.com 向144.44.44.4问同样的问题

[ns.bibi.com] [ns.for.com] 111.1.2.222:53 ----->[?44.7.33.31.in-addr.arpa]------> 144.44.44.4:53 如此循环,其实这种方式与gethostbyname 没有什么两样……

我希望你能理解上述的DNS 对话,现在我们开始进一步了解DNS 报文的格式吧。

1.2 : DNS报文

,

这里是DNS 报文的大致格式:

--------------------------- ---------------------------

| 标识 (最重要的 :) | 参数 |

--------------------------- ---------------------------

| 问题数 | 回答数 |

--------------------------- ---------------------------

| 管理机构数 | 附加信息数 |

--------------------------- ---------------------------

| |

问题

| |

-------------------------------------------------------

| |

回答

| |

-------------------------------------------------------

| |

附加信息(无关紧要)

| |

-------------------------------------------------------

1.3 :DNS 报文结构

标识(id)

这是用来鉴证每个DNS 报文的印记,由客户端设置,由服务器返回,它可以让客户匹

,

配请求与响应。后面我们将更详细地提到……

参数(flags)

参数域被分成好几个部份:

4 位 3 位, 总是0

| |

| |

[QR | opcode | AA| TC| RD| RA | zero | rcode ]

|

| |__|__|__| |______ 4 位

| |_ 1 位

|

1 位

QR = 如果QR 位设为0表示报为是查询,如果1则是响应

opcode = 通常是0,指标准查询,1是反向查询,2是服务器状态查询。 AA = 如果此位为1,表示服务器对问题部份的回答是权威性的。

TC = 截断,如果UDP 包超过512字节将被截流

RD = 表示希望递归,如果它设为1的话,表示递归查询。

RA = 如果设为1,表示递归可用。

Zero = 如它的名称一样,总是0

rcode = 就象errno 一样,0表示没有错误,3表示名字错误。

DNS 查询报文:

下面是DNS 报文查询的格式:

----------------------------------------------------------------------- | 查询名 | -----------------------------------------------------------------------

,

| 查询类型 | 查询类 | -------------------------------- -------------------------------------- 一个报文查询的结构是下面这样的

示例:

www.heike.com 是[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]

对IP 地址来说,也是同样的;)

44.33.88.123.in-addr.arpa 是:

[2|4|4|2|3|3|2|8|8|3|1|2|3|7|i|n|-|a|d|d|r|4|a|r|p|a|0]

还有一种压缩格式,但我们不需要用到,就略过了。

查询类型:

这里是一些我们最经常用到的查询类型——这些类型大约有20种不同的类型,我可懒得全部列出来了;)

名称 值

A | 1 | IP地址 (将域名解析为IP)

PTR | 12 | 指针 (将IP 解析为域名)

DNS 响应报文:

响应报文有个共同的格式,我们称之为资源记录——RR

下面是响应报文的格式(RR)

------------------------------------------------------------------------ | 域名 | ------------------------------------------------------------------------

,

| 类型 | 类 | ---------------------------------- ------------------------------------- | TTL (生存时间) | ------------------------------------------------------------------------ | 资源数据长度 | | |---------------------------- | | 资源数据 | ------------------------------------------------------------------------- 域名:

域名是与下面的资源数据对应的名字,它的格式同前面讲到的查询名一样,比如还是

www.heike.com 吧,它的域名是用下面方式表现的:[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] 类型:

类型标识了RR 类型代码号,它同前面讲到的查询类值一样。

类:

通常为1,表示因特网数据。

生存时间:

表示客户方将RR 放在高速缓存里的时间,RRs 的TTL 通常为2天。

资源数据长度:

标识资源数据的大小。

下面我们将用一个简单的例子来帮助大家理解:

这个例子展示了当ns.bibi.com 向ns.heike.com 询问www.heike.com 地址时,这

,

些数据报文的模样。

ns.bibi.com:53 ---> [?www.heike.com] ----> ns.heike.com:53 (Phear Heike ;) --------------------------------- -------------------------------------- | 标识(ID) = 1999 | QR = 0 opcode = 0 RD = 1 | --------------------------------- -------------------------------------- | 问题数 = htons(1) | 回答数 = 0 | --------------------------------- -------------------------------------- | 管理机构数 = 0 | 附加信息数 = 0 | --------------------------------- -------------------------------------- <问题部份>

------------------------------------------------------------------------ | 查询名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] | ------------------------------------------------------------------------ | 查询类型 = htons(1) | 查询类=htons(1) | --------------------------------- -------------------------------------- 上面是查询报文

现在我们来看看ns.heike.com 的回答

ns.heike.com:53 -->[IP of www.heike.com is 31.33.7.44] --> ns.bibi.com:53 --------------------------------- ---------------------------------------

| 标识(ID) = 1999 | QR=1 opcode=0 RD=1 AA =1 RA=1 | --------------------------------- ---------------------------------------

| 问题数 = htons(1) | 回答数 = htons(1) | --------------------------------- ---------------------------------------

,

| 管理机构数 = 0 | 附加信息数 = 0 | --------------------------------- ---------------------------------------

-------------------------------------------------------------------------

| 查询名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] | -------------------------------------------------------------------------

| 查询类型 = htons(1) | 查询类 = htons(1) | -------------------------------------------------------------------------

-------------------------------------------------------------------------

| 查询名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] | -------------------------------------------------------------------------

| 类型 = htons(1) | 类 = htons(1) | -------------------------------------------------------------------------

| time to live = 999999 | -------------------------------------------------------------------------

| 资源数据长度 = htons(4) | 资源数据=inet_addr("31.33.7.44") | -------------------------------------------------------------------------

OK,就这么多了;)

分析:

在应答中QR = 1 是因为它是应答;)

标签: