如何使用 Scapy 确定 WPA 加密?
How to use Scapy to determine WPA Encryption?
我正在做一个项目,用 Scapy 检测 Beacon 和 ProbeResponse 数据包中的无线加密。
我在Whosebug上用了另一个问题的解决方案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。这在当前开发版本中已解决。
有什么解决办法吗?
您使用的代码假定信息标记存在于所有 dot11 元素上。 当大多数未实现时,这曾经是正确的。(作为向后兼容性功能添加回来)。如今,scapy 支持更多(例如 WPA Microsoft vendor-specific),但不支持。您链接的代码现已过时
但是在(非常)最新的 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[=10=]H`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 中可用,因为它是唯一真正有意义的地方所以你必须专门在这一层调用它(你需要先检查该层是否设置在数据包上)
我正在做一个项目,用 Scapy 检测 Beacon 和 ProbeResponse 数据包中的无线加密。
我在Whosebug上用了另一个问题的解决方案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。这在当前开发版本中已解决。
有什么解决办法吗?
您使用的代码假定信息标记存在于所有 dot11 元素上。 当大多数未实现时,这曾经是正确的。(作为向后兼容性功能添加回来)。如今,scapy 支持更多(例如 WPA Microsoft vendor-specific),但不支持。您链接的代码现已过时
但是在(非常)最新的 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[=10=]H`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 中可用,因为它是唯一真正有意义的地方所以你必须专门在这一层调用它(你需要先检查该层是否设置在数据包上)