我正在进行一个项目,用Scapy检测Beacon和ProbeResponse数据包中的无线加密。
我在stackoverflow上使用了另一个问题的解决方案如何使用Scapy来确定无线加密类型?
这是我当前的脚本:
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"x00x50xf2x01x01x00"):
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。Dev,因为我也需要RSSI。这在当前的开发版本中得到了解决。
有什么办法解决这个问题吗?
您使用的代码假设info标记存在于所有dot11元素上当它们中的大多数都没有实现时,这曾经是正确的(作为向后兼容性功能重新添加(。如今,scapy正在支持更多的功能(例如WPA-Microsoft供应商特定的(,但这些功能没有。您链接的代码现在已过时
然而,在(非常(最新的scapy开发版本中,现在有一个特殊的函数将始终保持一致:network_stats
,它实现了您显示的代码:
data = b'x00x00x12x00.Hx00x00x00x02x8ftxa0x00x01x01x00x00x80x00x00x00xffxffxffxffxffxffDHxc1xb7xf0uDHxc1xb7xf0ux10xb7x00x00x00x00x00x00x00x00x90x01x11x00x00x06SSID76x01nx82x84x0cx12x18$0H`lx03x01x080x18x01x00x00x0fxacx04x02x00x00x0fxacx04x00x0fxacx02x01x00x00x0fxacx02x0cx00'
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中可用,因为它是唯一真正有意义的地方,所以你必须在这个层上专门调用它(你需要首先检查数据包上设置的层(