2015-03-25 77 views
2

我正在與Scapy做一些Wi-Fi腳本,我希望做一個WPS請求。作爲其中的一部分,我需要執行一系列數據包,例如EAPOL(啓動),然後從路由器接收EAP(請求,身份)數據包。什麼定義Scapy發送/接收?

如果我用適當的數據包做SRP(EAPOL)Scapy會超時等待響應,因爲看起來身份請求不適合Scapy使用的任何定義的數據包的「響應」。

或者我試圖在發送數據包後直接啓動sniff(),但它似乎沒有及時啓動數據包。

一個獨立的嗅探線程(在單獨的控制檯窗口中啓動)不會看到如下的AP響應。

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

所以我的問題是

  • 什麼定義發送/接收一對Scapy的?爲什麼EAP數據包不適合接收?
  • 在沒有看到EAP數據包後直接給出sniff()調用,接收它的適當方式是什麼?

乾杯。

回答

2

發送/接收對由層實現的answers方法定義。

例如,這裏是爲IPanswers方法:

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毫秒的超時時間。