什么定义了 Scapy 发送/接收?
What defines Scapy send / receive?
我正在用 Scapy 做一些 Wi-Fi 脚本,我想做一个 WPS 请求。作为其中的一部分,我需要执行一系列数据包,例如 EAPOL(开始),然后从路由器接收 EAP(请求,身份)数据包。
如果我使用适当的数据包执行 SRP(EAPOL),Scapy 将超时等待响应,因为对于 Scapy 使用的任何定义,身份请求似乎都不适合 'response' 数据包。
或者我试图在发送数据包后直接启动 sniff(),但是它似乎没有及时启动来接收数据包。
一个独立的嗅探线程(在一个单独的控制台中启动window)确实看到了如下的 AP 响应。
RadioTap / Dot11 / LLC / SNAP / EAPOL EAP_PACKET / EAP / Padding
所以我的问题是
- 什么定义了 Scapy 中的发送/接收对?为什么 EAP 数据包不是适当的接收?
- 如果在没有看到 EAP 数据包后直接调用 sniff(),接收它的合适方法是什么?
干杯。
send/receive对由层实现的answers
方法定义。
例如,这里是 IP
层的 answers
方法:
def answers(self, other):
if not isinstance(other,IP):
return 0
if conf.checkIPaddr and (self.dst != other.src):
return 0
if ( (self.proto == socket.IPPROTO_ICMP) and
(isinstance(self.payload, ICMP)) and
(self.payload.type in [3,4,5,11,12]) ):
# ICMP error message
return self.payload.payload.answers(other)
else:
if ( (conf.checkIPaddr and (self.src != other.dst)) or
(self.proto != other.proto) ):
return 0
return self.payload.answers(other.payload)
您想做的是开发自己的 answers(request, potential_response)
函数并接收原始数据包。然后,您使用 answers
函数来决定哪个原始数据包是答案。
要接收原始数据包,您可以使用sniff
函数:
sniff(count=1,timeout=0.001)
尽管如您所见,它的缺点是不一定及时开始。所以,你想看看 sniff
的实现方式。在内部,它使用 conf.L2listen
,您也可以使用它。
因此,在发送请求之前,执行 s=conf.L2listen()
,然后执行 s.recv(65536)
以接收数据包。您可以使用 sel = select([s],[],[],0.001)
等待一定时间让数据包到达。如果s in sel[0]
,则可以从socket中读取数据,否则超时。
超时参数以秒为单位,所以我所有的示例都指定了 1 毫秒的超时。
我正在用 Scapy 做一些 Wi-Fi 脚本,我想做一个 WPS 请求。作为其中的一部分,我需要执行一系列数据包,例如 EAPOL(开始),然后从路由器接收 EAP(请求,身份)数据包。
如果我使用适当的数据包执行 SRP(EAPOL),Scapy 将超时等待响应,因为对于 Scapy 使用的任何定义,身份请求似乎都不适合 'response' 数据包。
或者我试图在发送数据包后直接启动 sniff(),但是它似乎没有及时启动来接收数据包。
一个独立的嗅探线程(在一个单独的控制台中启动window)确实看到了如下的 AP 响应。
RadioTap / Dot11 / LLC / SNAP / EAPOL EAP_PACKET / EAP / Padding
所以我的问题是
- 什么定义了 Scapy 中的发送/接收对?为什么 EAP 数据包不是适当的接收?
- 如果在没有看到 EAP 数据包后直接调用 sniff(),接收它的合适方法是什么?
干杯。
send/receive对由层实现的answers
方法定义。
例如,这里是 IP
层的 answers
方法:
def answers(self, other):
if not isinstance(other,IP):
return 0
if conf.checkIPaddr and (self.dst != other.src):
return 0
if ( (self.proto == socket.IPPROTO_ICMP) and
(isinstance(self.payload, ICMP)) and
(self.payload.type in [3,4,5,11,12]) ):
# ICMP error message
return self.payload.payload.answers(other)
else:
if ( (conf.checkIPaddr and (self.src != other.dst)) or
(self.proto != other.proto) ):
return 0
return self.payload.answers(other.payload)
您想做的是开发自己的 answers(request, potential_response)
函数并接收原始数据包。然后,您使用 answers
函数来决定哪个原始数据包是答案。
要接收原始数据包,您可以使用sniff
函数:
sniff(count=1,timeout=0.001)
尽管如您所见,它的缺点是不一定及时开始。所以,你想看看 sniff
的实现方式。在内部,它使用 conf.L2listen
,您也可以使用它。
因此,在发送请求之前,执行 s=conf.L2listen()
,然后执行 s.recv(65536)
以接收数据包。您可以使用 sel = select([s],[],[],0.001)
等待一定时间让数据包到达。如果s in sel[0]
,则可以从socket中读取数据,否则超时。
超时参数以秒为单位,所以我所有的示例都指定了 1 毫秒的超时。