【转】用winpcap实现局域网DNS欺骗之二(DNS包的包结构)

来源:互联网 发布:安全教育网络班会主题 编辑:程序博客网 时间:2024/04/29 08:41

晕了,刚才写着写着死机了,没保存,郁闷

 

再写一次

 

          随便转载,转载请注明出处http://blog.csdn.net/leotangcw/

 

    欢迎大家和我交流Email:tangchengwen@163.com

 

现在我们来看看如何构造这个DNS包呢:

 

      要构造包首先要捕获包,因为包中的一些东西我们在构造的时候是需要用到的。那么如何捕获呢?这要看你的局域网使用的交换机种类,如果是一个HUB,就像我们现在寝室楼层的一样,那我们只要把网卡设置成混杂模式就可以捕获到所有包了,因为HUB只会做包广播。关于在这种情况下捕获,你可以参看我前面的文章一步一步尝试在MFC下开发基于winpcap的数据包捕获和分析软件.(开发总结,建议先看)如果是3层(网络层)交换机的话就麻烦一些因为他是通过IP转发的,数据包只会发送到特定的端口。这样你就需要做ARP+DNS欺骗。下回再说,这回先只讨论前一种情况。

 

     首先我们来看DNS的包结构,我们知道DNS可以通过TCP也可以通过UDP传输,不过实际使用中99%以上使用UDP所以下面只是对DUP的DNS做阐述。DNS包结构是: 以太网头+IP头+UDP头+DNS部分

 

从以太网头开始:B代表字节

 

目的MAC(6B)|源MAC(6B)|0x0800(2B表示上层是IP)

 

IP头:

 

协议版本和IP头长度(1B)|服务(1B)|IP包长度(2B,去以太网头的长度)|ID号(2B)|标识(1B)|偏移(1B)|TTL(1B)|0x11(上层协议UDP)|IP校验和(2B)|源IP(4B)|目的IP(4B)

 

UDP头:

 

源端口(2B)|目的端口(2B)|UDP包长度(2B,去以太网头和IP头)|UDP校验和(2B)

 

DNS部分:

 

ID号(2B很重要)|标识(2B)|问题数目(2B)|回答数目(2B)|权威回答数目(2B)|附加数目(2B)|问题字段(长度不定)|回答字段(长度不定)|权威字段(长度不定)|附加字段(长度不定)

 

问题和回答,权威,附加都是RR记录格式,格式如下:

 

名字(2B)|类型(2B)|类(2B)|存活时间(4B)|数据长度(2B)|IP地址(4B)

 

我们本着越简单越好的做法,构造尽量短的回复,所以回答个数为1,权威和附加都为0

 

如果是请求包,到问题字段就完了,如果是回答,还有构造回答字段。

 

下面开始构造伪造包:

 

    以太网部分:交换源和目的的MAC地址

 

  IP部分:计算修改包长度为你构造的假包IP部分长度,标识改为0x04(不分段),校验和改为你计算的IP首部校验和,交换源和目的IP

 

UDP部分:交换源和目的端口号,包长度改为你构造的假包UDP部分长度。校验和可以添0x0000或者自己算(是可选字段,不推荐自己算,首先计算费时间,影响发包速度,其次容易算错,我算了3天,老是错,原来要加一个UDP伪头,参考《TCP/IP祥解》)

 

DNS部分:问题数0x0001,回答数0x0001,权威0x0000,附加0x0000,问题字段直接拷贝,回答字段如下:名字0xc00c,类和类型都是0x0001,时间添长点,长0x0004,IP:你想转向的IP地址

 

到这里假的应答就伪造好了。

 

其他工作请听下回分解。吃饭过后再继续写。

 

用winpcap实现局域网DNS欺骗之三(代码部分及深入研究)http://blog.csdn.net/leotangcw/archive/2006/05/23/751839.aspx

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leotangcw/archive/2006/05/23/751534.aspx

原创粉丝点击