python - 访问 scapy 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",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)
对象错误“列表”对象没有属性“yiaddr”
解决方案
我在发布后不到两秒钟就想通了,但希望这对将来的其他人有所帮助。
我使用 srp() 而不是 srp1(),前者返回多个数据包,所以我需要索引我想查看的特定数据包 ansD[0][BOOTP].yiaddr 。此后,我将代码更改为使用 srp1 ,因为这是一个 DHCP 请求,只期望来自 DHCP 服务器的一个特定的“Offer”回复。下面的固定代码
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()
推荐阅读
- python - 如何用新标签替换 tkinter 标签?
- python - python中列表的全局()函数
- c# - 将动作 html 路由到我的控制器
- tsql - 存储过程中的动态 SQL
- flutter - 如何在 Flutter Web 中导航到其他屏幕
- java - 有没有办法在运行时忽略杰克逊字段而不使用@JsonIgnore
- kotlin - 是否有相当于 ?: java 运算符的 kotlin?
- javascript - Javascript:无法复制数组并使它们保持独立
- python - 替代标准差来表示信号的躁动
- c++ - 在 C++ 中使用具有默认模板参数的模板类时出现“模板参数太少错误”