什么定义Scapy发送/接收?

时间:2015-03-25 09:51:33

标签: python wifi scapy

我正在使用Scapy做一些Wi-Fi脚本,我希望做一个WPS请求。作为其中的一部分,我需要执行一系列数据包,如EAPOL(开始),然后从路由器接收EAP(请求,身份)数据包。

如果我使用适当的数据包执行SRP(EAPOL),Scapy将等待响应超时,因为身份请求似乎不是一个适当的响应'对于Scapy使用的任何定义的数据包。

或者我尝试在发送数据包后直接启动sniff(),但它似乎并没有及时启动来获取数据包。

独立的嗅探线程(在单独的控制台窗口中启动)确实会看到如下的AP响应。

RadioTap / Dot11 / LLC / SNAP / EAPOL EAP_PACKET / EAP / Padding

所以我的问题是

  • 什么定义了Scapy中的发送/接收对?为什么EAP数据包不适合接收?
  • 在没有看到EAP数据包后直接给出一个嗅探(),接收它的方法是什么?

干杯。

1 个答案:

答案 0 :(得分:2)

发送/接收对由图层实现的answers方法定义。

例如,以下是answers图层的IP方法:

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],则可以从套接字读取数据,否则超时传递。

timeout参数以秒为单位,因此我的所有示例都指定了1毫秒的超时。