Python实现DHCP请求

Python实现DHCP请求,第1张

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模拟服务端

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/567559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存