我正在一个项目中使用Scapy检测Beacon和ProbeResponse数据包中的无线加密。
我对stackoverflow How to use Scapy to determine Wireless Encryption Type?使用了另一个问题的解决方案
这是我当前的脚本:
p = pkt[Dot11Elt]
essid, channel = None, None
cryptoSet = set()
while isinstance(p, Dot11Elt):
if p.ID == 0:
essid = p.info.decode("utf-8", "replace")
elif p.ID == 3:
channel = ord(p.info)
elif p.ID == 48:
cryptoSet.add("WPA2")
elif p.ID == 221 and p.info.startswith(b"\x00\x50\xf2\x01\x01\x00"):
cryptoSet.add("WPA")
p = p.payload
if not cryptoSet:
cap = pkt.sprintf("{Dot11Beacon:%Dot11Beacon.cap%}"
"{Dot11ProbeResp:%Dot11ProbeResp.cap%}").split('+')
if "privacy" in cap:
cryptoSet.add("WEP")
else:
cryptoSet.add("OPN")
crypto = "/".join(cryptoSet)
该脚本检测SSID,频道,WPA2,WEP和OPN。 但是,当我收到带有WPA和ID 221的数据包时,我得到一个错误。
AttributeError: 'p' object has no attribute 'info'
所以我需要一种不同的方法来解决这个问题。
我正在使用Python 3.5.3和Scapy 2.4.0.dev581。 开发人员,因为我也需要RSSI。在当前的开发版本中已解决此问题。
有什么办法解决这个问题吗?
答案 0 :(得分:0)
您使用的代码假定info标记存在于所有dot11元素上。当大多数未实现时,这是正确的。如今,scapy支持的功能更多(例如WPA Microsoft特定于Microsoft的供应商),而目前尚不支持。您链接的代码现已过时
然而,在(非常)最新的scapy开发版本中,现在有一个始终保持一致的特殊功能:network_stats
,用于实现您显示的代码:
data = b'\x00\x00\x12\x00.H\x00\x00\x00\x02\x8f\t\xa0\x00\x01\x01\x00\x00\x80\x00\x00\x00\xff\xff\xff\xff\xff\xffDH\xc1\xb7\xf0uDH\xc1\xb7\xf0u\x10\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x90\x01\x11\x00\x00\x06SSID76\x01\n\x82\x84\x0c\x12\x18$0H`l\x03\x01\x080\x18\x01\x00\x00\x0f\xac\x04\x02\x00\x00\x0f\xac\x04\x00\x0f\xac\x02\x01\x00\x00\x0f\xac\x02\x0c\x00'
pkt = RadioTap(data)
nstats = pkt[Dot11Beacon].network_stats()
assert nstats == {
'channel': 8,
'crypto': {'WPA2'},
'rates': [130, 132, 12, 18, 24, 36, 48, 72, 96, 108],
'ssid': 'SSID76'
}
仅在Dot11Beacon中可用,因为它是唯一真正有意义的地方,因此您必须在此层上专门调用它(您需要首先检查该层是否设置在数据包上)