我决定试着用scapy来申请一个IP。我能够发送一个发现,并在变量ansD中收到一个报价。不幸的是,我在访问包含提供的IP地址的字段时遇到了问题,该IP地址应该是ansDBOOTP.yiaddr。它告诉我该字段不存在。我看了看周围,看到了类似的问题,但似乎不能理解为什么我可以访问正常的数据包字段,但无法使用BOOTP字段。
receivedIP = 0
conf.checkIPaddr = False
fam,hw = get_if_raw_hwaddr(conf.iface)
dhcp_discover = Ether(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=hw)/DHCP(options=[("message-type","discover"),"end"])
ansD,unans = srp(dhcp_discover, multi=True)
if True:
dhcp_request=Ether(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=hw,yiaddr=ansD[BOOTP].yiaddr)/DHCP(options=[("message-type","request"),"end"])
ansR, unans = srp(dhcp_request,multi=True)对象错误'list‘对象没有属性'yiaddr’
发布于 2020-10-07 22:26:22
我在发帖后不到两秒就发现了这一点,但希望这能在未来对其他人有所帮助。
我使用了srp()而不是srp1(),前者返回多个数据包,因此我需要为要查看ansD.yiaddr的特定数据包建立索引。此后,我将代码改为使用srp1,因为这是一个只希望从DHCP服务器得到一个特定"Offer“回复的DHCP请求。修复了下面的代码
import sys
from scapy.all import *
receivedIP = 0
conf.checkIPaddr = False
fam,hw = get_if_raw_hwaddr(conf.iface)
dhcp_discover=Ether(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=hw)/DHCP(options=[("message-type","discover"),"end"])
ansD = srp1(dhcp_discover, multi=True)
if True:
//Request using the IP the server offered us in ansD[BOOTP].yiaddr
dhcp_request = Ether(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=hw,yiaddr=ansD[BOOTP].yiaddr)/DHCP(options=[("message-type","request"),"end"])
ansR, unans = srp(dhcp_request,multi=True)
ansR.summary()https://stackoverflow.com/questions/64245832
复制相似问题