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 是因为它是应答;)