如何使用 scapy 从探测请求中提取供应商数据

How to extract vendor data using scapy from a probe request

所以这是我的脚本:

#!/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 中分析了探测请求,发现此类探测在 Dot11ELt 层中也有一个标记号 221,它指定了供应商。如果我只是将 p.ID == 0 语句更改为 p.ID == 221 那么它应该在技术上给我供应商信息,但脚本只是挂起并且永远不会继续执行脚本的其余部分。

如何从数据包中提取供应商信息?

我的 python 版本: 2.7.3(默认,2014 年 3 月 13 日,11:03:55)[GCC 4.7.2] 我的 linux 版本: 经销商 ID:Kali Description:Kali GNU/Linux 1.1.0 Release:1.1.0 Codename:moto Linux 版本 3.18.0-kali3-amd64 海合会版本 4.7.2 Debian 4.7.2-5) ) #1 SMP Debian 3.18.6-1~kali2 (2015-03-02)

一个探测请求数据包可能有几个 Dot11Elt 层,您需要遍历它们直到找到所需的层,如下所示:

dot11elt = p.getlayer(Dot11Elt)
while dot11elt and dot11elt.ID != 221:
    dot11elt = dot11elt.payload.getlayer(Dot11Elt)
if dot11elt:
    ...  # dot11elt.ID == 221: