Как извлечь данные о поставщике с помощью scapy из зондирующего запроса

Итак, это мой сценарий:

#!/usr/bin/env python
import sys
from scapy.all import *
from subprocess import *

call(["clear"])

print "Probe Investigator"
print "-----------------------------------------------------"

intf = raw_input("Enter the Name of the interface to sniff: ")
print ("\n")
clients = []
uni = 0
mach = []

def phandle(p):
    if p.haslayer(Dot11ProbeReq):
        mac = p.addr2
        if p.haslayer(Dot11Elt):
            if p.ID == 0:
                ssid = p.info
                if ssid not in clients and ssid != "":
                    clients.append(ssid)
                    print len(clients),mac+"--Probing-->"+ssid
                    if mac not in mach:
                        mach.append(mac)
                        global uni
                        uni+=1              
                    else:   
                        return

sniff(iface=intf,prn=phandle, store=0)
print ("\n")
print "Unique MACs: ",uni

Как вы можете видеть, я фильтрую пробные запросы, а также фильтрую, чтобы увидеть, не являются ли запросы широковещательными, а предназначены для определенных SSID. Я проанализировал запросы тестов в wireshark и увидел, что такие запросы также имеют тег № 221 на уровне Dot11ELt, который указывает поставщика. Если я просто изменю оператор p.ID == 0 на p.ID == 221, то технически он должен дать мне информацию о поставщике, но вместо этого сценарий просто зависнет и никогда не будет двигаться дальше с остальной частью сценария.

Как извлечь информацию о поставщике из пакета?

Моя версия Python: 2.7.3 (по умолчанию, 13 марта 2014 г., 11:03:55) [GCC 4.7.2] Моя версия Linux: ID дистрибьютора: Kali Описание: Kali GNU/Linux 1.1.0 Выпуск: 1.1.0 Кодовое имя: moto Версия Linux 3.18.0-kali3-amd64 gcc версия 4.7.2 Debian 4.7.2-5) ) #1 SMP Debian 3.18. 6-1~кали2 (2015-03-02)


person Siddharth Dubey    schedule 01.05.2015    source источник


Ответы (1)


Пакет тестового запроса может иметь несколько слоев Dot11Elt, и вам нужно перебирать их, пока не найдете нужный, следующим образом:

dot11elt = p.getlayer(Dot11Elt)
while dot11elt and dot11elt.ID != 221:
    dot11elt = dot11elt.payload.getlayer(Dot11Elt)
if dot11elt:
    ...  # dot11elt.ID == 221:
person Yoel    schedule 01.05.2015
comment
Хорошо, теперь я могу добраться до информационного уровня, НО он закодирован в шестнадцатеричном формате, но это не так. Как бы я это решил? - person Siddharth Dubey; 02.05.2015
comment
Что вы получили и что ожидали получить? Как wireshark анализировал те же самые данные? - person Yoel; 02.05.2015
comment
Что ж, в wireshark идентификатор тега 221 показывает Apple или Broadcom в качестве производителя, тогда как, если я смотрю на тот же пакет в scapy dot11elt с тегом 221, или поставщик показывает мне закодированные данные. - person Siddharth Dubey; 03.05.2015
comment
scapy не будет анализировать этот информационный элемент за вас. Вам нужно разобрать его самостоятельно. Публичный список OUI IEEE доступен по адресу стандарты-oui.ieee.org/oui.txt. - person Yoel; 03.05.2015
comment
Хорошо, спасибо, думаю, Wireshark делает то же самое. Большое спасибо за разъяснение этого для меня. - person Siddharth Dubey; 03.05.2015