目录
- DHCP四个工作步骤
- 使用python Scapy库模拟DHCP包
- DHCP Discover包
- DHCP Request包
- 运行效果
- 总结
DHCP四个工作步骤
1、客户端通过广播发送DHCP Disccover报文寻找服务器端
2、服务器通过单播发送DHCP offer报文向客户提供IP地址等信息
3、客户端通过广播发送DHCP Request报文告知服务端本地选择使用哪个IP
4、服务器通过单播发送DHCP Ack报文告知客户端IP地址是合法可用的
使用python Scapy库模拟DHCP包
DHCP Discover包
rom scapy.all import * import random def Dhcp_offer(): mac=str(RandMAC()) //随机一个MAC Ether_Discover=Ether(src=mac,dst="ff:ff:ff:ff:ff:ff") //创建Ether广播包 目标地址全f IP_Discover=IP(src="0.0.0.0",dst="255.255.255.255") //创建IP广播包 目标全255 UDP_Discover=UDP(dport=67,sport=68) //DHCP使用UDP传输 服务端端口67 客户端68 print("随机mac地址为%s" %(mac)) a=mac.replace(":","") xid_random=random.randint(1,999999999) //DHCP包中XID(请求ID) BOOTP_Discover=BOOTP(xid=xid_random,chaddr=a) //chaddr=客户端mac DHCP_Discover=DHCP(options=[("message-type","discover"),"end"]) //模拟DHCP包 Discover=Ether_Discover/IP_Discover/UDP_Discover/BOOTP_Discover/DHCP_Discover sendp(Discover,iface='以太网',count=1) //发送 iface为发送网卡 count为数量
DHCP Request包
def Dhcp_Request(): def J(pkt): if DHCP in pkt: if pkt[DHCP].options[0][1]==2: //option为2 说明服务端回复 Ether_Request = Ether(src=pkt[Ether].dst, dst="ff:ff:ff:ff:ff:ff") IP_Request = IP(src="0.0.0.0", dst="255.255.255.255") UDP_REQUEST = UDP(sport=68, dport=67) BOOTP_Request = BOOTP(chaddr=pkt[BOOTP].chaddr, xid=pkt[BOOTP].xid) DHCP_Request = DHCP(options=[("message-type", 'request'), ("server_id", pkt[DHCP].options[1][1]), ("requested_addr", pkt[BOOTP].yiaddr), "end"]) Request = Ether_Request / IP_Request / UDP_REQUEST / BOOTP_Request / DHCP_Request sendp(Request, iface='以太网',count=1) print("正在分配ip%s" %(pkt[BOOTP].yiaddr)) if pkt[DHCP].options[0][1]==5: print("已经分配ip%s" %(pkt[BOOTP].yiaddr)) sniff(filter='src port 67', iface='以太网', prn=J,count=5) //监听收到的offer包 prn为处理包的函数
运行效果
此代码只是模拟了客户端,也可用通过Scapy模拟服务端
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持小闻网。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)