Python-DHCP(scapy应用)
一、概述
DHCP协议位于应用层
- DHCP协议客户端与服务端协商
DHCP Client ---->dhcp discover(请求分配ip) DHCPServer
DHCP Client <----dhcp offer(发送ip池) DHCPServer
DHCP Client ---->dhcp request(发送选择好的ip) DHCPServer
DHCP Client <----dhcp ACK(发送确认包) DHCPServer
二、使用scapy库函数实现dhcp客户端
from scapy.all import *
from scapy.layers.inet import *
from scapy.layers.dhcp import *
import binascii
#1.构造数据包
xid_random=random.randint(1,900000000)
Random_Mac=str(RandMAC())
MAC_change=binascii.unhexlify(Random_Mac.replace(':',''))
print(Random_Mac)
Discover=Ether(src=Random_Mac,dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=MAC_change,xid=xid_random)/DHCP(options=[("message-type","discover"),"end"])
#2.发送数据包
sendp(Discover,iface='WLAN')
#3.接受并过滤服务器响应的dhcp offer包
def dect_dhcp(pkt):
if DHCP in pkt:
ls(pkt)
# 4.发送Dhcp request包
if pkt[DHCP].options[0][1]==2:
E_request=Ether(src=pkt[Ether].dst,dst="ff:ff:ff:ff:ff:ff")
I_request=IP(src="0.0.0.0",dst="255.255.255.255")
U_request=UDP(sport=68,dport=67)
B_request=BOOTP(chaddr=pkt[BOOTP].chaddr,xid=pkt[BOOTP].xid) D_request=DHCP(options=[("message-type","request"),("server_id",pkt[DHCP].options[1][1]),("requested_addr",pkt[BOOTP].yiaddr),"end"])
Request=E_request/I_request/U_request/B_request/D_request
sendp(Request,iface='WLAN')
print("正在分配")
if pkt[DHCP].options[0][1]==5:
print("已经分配")
SNIFF=sniff(filter="src port 67",iface='WLAN',prn=dect_dhcp,count=10)
三、使用scapy库函数实现dhcp服务端
四、注意事项
如果pycharm报错:
Sniffing and sending packets is not available at layer 2: winpcap is not installed. You may use conf.L3socket orconf.L3socket6 to access layer 3
该网址下载Winpacp即可