Как использовать Scapy для определения шифрования WPA? - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю над проектом по обнаружению беспроводного шифрования в пакетах Beacon и ProbeResponse с помощью Scapy.

Я использовал решение другого вопроса о 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.Это решено в текущей версии разработчика.

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 18 декабря 2018

Код, который вы используете, предполагает наличие информационного тега для всех элементов dot11.Это было правдой, когда большинство из них не были реализованы.В настоящее время scapy поддерживает еще несколько (например, WPA 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, так как это единственное место, где это действительно имеет смысл, поэтому вам нужно вызывать его конкретно на этом слое (вам нужно проверить, что слой установлен на пакете вначале)

...