Chinaunix首页 | 论坛 | 博客
  • 博客访问: 483916
  • 博文数量: 1496
  • 博客积分: 79800
  • 博客等级: 大将
  • 技术积分: 9940
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 13:22
文章分类

全部博文(1496)

文章存档

2011年(1)

2008年(1495)

我的朋友

分类:

2008-09-09 13:23:50


  一、关于DNS ID Hacking的一些描述 
  
  你可能会对DNS ID Hacking\spoofing的含义有些迷惑,它与一般直接攻击一样,只不过利用的是DNS上的漏洞,并且可能有较大的普遍性及伤害作用——好象没什么DNS能够逃过它——甚至WINNT。 
  
  1、DNS机制简述 
  
  首先我们来看看DNS是如何工作的,我将在这里说明这一中相对重要的一些部份。为了更好的叙述,我们先用一个实例来看一看一个DNS请求的信息包是如何在网络里传送的吧。 
  
  1.1 : 客户机(bla.bibi.com)发送一个请求要求解析域名"",bla.bibi.com的DNS是ns.bibi.com这台机器,现在我们看看下图吧: 
   
  这图是我们要分析的情况的示意,应该很清楚了,好,那就看看gethostbyname是如何工作的: 
  
  .... 
   gethosbyname(""); 
  .... 
  
  [bla.bibi.com]               [ns.bibi.com] 
  111.1.2.123:1999 --->[?]------> 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?]----> 198.41.0.4:53 
  
  它先问ns.internic.net哪台机器是的主名称,如果没查到的话它就把请求发往.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关于的地址,仍然没有找到——于是又请求heike.com的DNS权威服务器的地址。 
  
  [ns.bibi.com]               [ns.for.com] 
  111.1.2.222:53 ------>[?]-----> 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吧,我们可以问它的IP地址了;) 
  
  [ns.bibi.com]               [ns.heike.com] 
  111.1.2.222:53 ----->[?]----> 31.33.7.4:53 
  
  现在我们得到了的IP喽! 
  
  [ns.heike.com]                      [ns.bibi.com] 
  31.33.7.4:53 ------->[ == 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 ------->[ == 31.33.7.44]----> 111.1.2.123:1999 
  
  呵呵,现在bla.bibi.com就晓得的IP地址了 :) 
  
  好了,现在我们假想另一种情况吧,我们希望通过机器的IP来得到它的域名,为了做到这点,我们做的是所谓的"指针查询"。由于DNS树中名字是从底向上写的,所以我们要做如下的一个转换: 
  
  示例: 
  
  100.20.40.3将被表示为3.40.20.100.in-addr.arpa 
  
  这种方式仅用于DNS的IP解析请求。 
  
  现在来看看我们通过31.33.7.44()的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) 
  
  参数域被分成好几个部份 : 
   
  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报文查询的格式 : 
  
   
  一个报文查询的结构是下面这样的 
  
  示例: 
  
  是[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) 
   
  域名 : 
  
  域名是与下面的资源数据对应的名字,它的格式同前面讲到的查询名一样,比如还是吧,它的域名是用下面方式表现的:[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询问地址时,这些数据报文的模样。 
  
  ns.bibi.com:53 ---> [?] ----> ns.heike.com:53 (Phear Heike ;) 
   
  上面是查询报文 
  
  现在我们来看看ns.heike.com的回答 
  
  ns.heike.com:53 -->[IP of is 31.33.7.44] --> ns.bibi.com:53 
  
  OK,就这么多了;) 
  
  分析 : 
  
  在应答中QR = 1 是因为它是应答;) 
  AA = 1 因为名称服务器是权威服务器 
  RA = 1 是因为递归是可用的 
  
  好了,我希望你能理解上面所说的一切,下面要进行的攻击里要用到上面的理论的。 
  
  二、DNS ID的攻击及欺骗 
  
  
【责编:admin】

--------------------next---------------------

阅读(138) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~