访问高级DHCP请求中的字段

问题描述

我正在学习不同的网络协议,并决定尝试使用Scapy请求IP。我可以发送发现并在变量ansD中接收报价。不幸的是,我无法访问包含提供的IP地址的字段,该地址应该为ansD [BOOTP] .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",dport=67)/BOOTP(chaddr=hw,yiaddr=ansD[BOOTP].yiaddr)/DHCP(options=[("message-type","request"),"end"])
ansR,unans = srp(dhcp_request,multi=True)

对象错误“列表”对象没有属性“ yiaddr”

抱歉,这是一个愚蠢的问题,我是网络新手,还是python / scapy的新手

解决方法

发布后两秒钟我就知道了,但希望以后对其他人有帮助。

我使用srp()而不是srp1(),前者返回多个数据包,因此我需要索引要查看的特定数据包ansD [0] [BOOTP] .yiaddr。此后,我将代码更改为使用srp1,因为这是一个DHCP请求,期望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",dport=67)/BOOTP(chaddr=hw,yiaddr=ansD[BOOTP].yiaddr)/DHCP(options=[("message-type","request"),"end"])
    ansR,unans = srp(dhcp_request,multi=True)
    ansR.summary()