0

我正在开发一个项目,用 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"\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。这在当前的开发版本中得到了解决。

任何想法如何解决这一问题?

4

1 回答 1

1

您使用的代码假定 info 标记存在于所有 dot11 元素上。当其中大多数未实施时,这曾经是正确的。(被添加回来作为向后兼容功能)。如今,scapy 正在支持更多(例如 Microsoft 供应商特定的 WPA),但它们不支持。您链接的代码现已过时

然而,在(非常)最新的 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 中可用,因为它是唯一真正有意义的地方,因此您必须在该层上专门调用它(​​您需要先检查该层是否设置在数据包上)

于 2018-12-18T11:47:26.370 回答