DNS客户端

时间:2016-04-22 20:23:52

标签: c dns network-programming protocols

我正在为我的作业创建虚假的DNS响应。

我能够在DNS服务器的实际响应之前成功发送欺骗性响应(通过数据包捕获验证)

DNS响应的数据包捕获:

=======================================================================
MY FAKE DNS RESPONSE
--------------------
Wed Apr 20 22:04:25 2016    Ether-type: IP (0x0800) 
Source MAC Address:  00:0c:29:b6:95:c8  Destination MAC Address: 00:0c:29:0f:e9:96
Source IP Address: 192.168.88.132   Destination IP Address: 192.168.88.131 
UDP packet  Source Port: 53     Destn Port: 37837   UDP Length = 46
============
UDP PAYLOAD:
============
2d  97  81  80  00  01  00  01  00  00  00  00  02  69  6e      -............in
05  79  61  68  6f  6f  03  63  6f  6d  00  00  01  00  01      .yahoo.com.....
c0  0c  00  01  00  01  00  00  02  58  00  04  9b  21  11      .........X...!.
44      D........X...!.


=======================================================================
ACTUAL DNS RESPONSE
-------------------
Wed Apr 20 22:04:25 2016    Ether-type: IP (0x0800) 
Source MAC Address:  00:50:56:e9:cd:36  Destination MAC Address:  00:0c:29:0f:e9:96
Source IP Address: 192.168.88.2     Destination IP Address: 192.168.88.131 
UDP packet  Source Port: 53     Destn Port: 37837   UDP Length = 89
============
UDP PAYLOAD:
============
2d  97  81  80  00  01  00  03  00  00  00  00  02  69  6e      -............in
05  79  61  68  6f  6f  03  63  6f  6d  00  00  01  00  01      .yahoo.com.....
c0  0c  00  05  00  01  00  00  00  05  00  0f  06  66  64      .............fd
2d  66  70  32  03  77  67  31  01  62  c0  0f  c0  2a  00      -fp2.wg1.b...*.
01  00  01  00  00  00  05  00  04  62  8b  b7  18  c0  2a      .........b....*
00  01  00  01  00  00  00  05  00  04  62  8b  b4  95      ..........b...*


=======================================================================

正如您所看到的,我的假响应是在实际DNS响应之前到达的。 但由于某种原因,DNS客户端总是接受后来的(真正的)响应。

问题:

  1. 为什么我的DNS响应不被DNS客户端接受,即使它也是如此 在实际到来之前到达?
  2. 是因为错误的DNS响应数据包格式?
  3. 是因为假响应的IP地址与实际的IP地址不同吗?
  4. 是否有任何DNS客户端调试/日志 这可以帮助我找出DNS客户端不接受我的回复的原因吗?
  5. 还有其他原因吗?
  6. 调试输出来自Ubuntu 14.04

    我真的坚持这个问题3天了,我无法弄清楚原因。任何帮助表示赞赏:)

2 个答案:

答案 0 :(得分:1)

为了使您的假DNS响应正常工作,首先:UDP目标端口,DNS事务ID和请求的域名必须与客户端请求匹配。我假设你已经做好了。

但是,如Stian所述,DNS响应源IP地址必须与合法的DNS服务器IP地址匹配;如果没有,它将被客户端删除。 (AFAIK,源MAC地址不需要匹配。)

为了自己设置源IP地址,您需要创建RAW IP套接字而不是UDP套接字,并使用RAW IP数据包伪造完整的UDP数据包(假DNS响应)。您可以找到here代码段来创建这样的RAW IP套接字并从RAW伪造UDP数据包(包括UDP校验和)。

答案 1 :(得分:0)

所有套接字连接都有4个参数来识别它们。源IP,源端口,目的IP和目的端口。

在上面的示例中,虚假DNS UDP响应的源IP不正确,因此数据包永远不会到达套接字。如果源IP正确,则可能会阻止不匹配的MAC地址,因为它与ARP表(rpfilter)不匹配。