Python 如何使用Scapy确定WPA加密?

Python 如何使用Scapy确定WPA加密?,python,security,wifi,scapy,wpa,Python,Security,Wifi,Scapy,Wpa,我正在做一个项目,用Scapy检测信标中的无线加密和ProbeResponse数据包 我使用了stackoverflow的另一个问题的解决方案 这是我当前的脚本: p = pkt[Dot11Elt] essid, channel = None, None cryptoSet = set() while isinstance(p, Dot11Elt): if p.ID == 0: essid = p.info.decode("utf-8", "replace")

我正在做一个项目,用Scapy检测信标中的无线加密和ProbeResponse数据包

我使用了stackoverflow的另一个问题的解决方案

这是我当前的脚本:

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和ID221的包时,我得到了一个错误

AttributeError: 'p' object has no attribute 'info'
所以我需要一个不同的方法来解决这个问题

我正在使用Python 3.5.3和Scapy 2.4.0.dev581。 因为我也需要RSSI。这在当前的开发版本中得到了解决


有没有办法解决这个问题?

您使用的代码假设所有dot11元素上都存在info标记。在大多数方案没有实施的情况下,这一点曾经是正确的。(已作为向后兼容功能添加回)。如今,scapy正在支持一些其他的(如WPA和微软的供应商专用),但它们并不支持。您链接的代码现在已过时

然而,在最新的scapy开发版本中,现在有一个特殊的功能将始终保持一致:
network\u 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中可用,因为它是唯一真正有意义的地方,因此您必须在该层上专门调用它(您需要先检查该层是否设置在数据包上)

请添加错误消息并查看,您是否尝试在ID=221后检查信息字段?如果你把它放在try/catch中,它返回一些结果,这意味着你有一些ID=221但没有信息字段的数据包。