基于802.11协议的wifi探针的研究与学习
来源:互联网 发布:咸鱼质量问题淘宝介入 编辑:程序博客网 时间:2024/06/07 05:18
基于wifi探针的研究与学习
1.关于802.11协议帧的解析
Management frame(管理帧:Type=00)
- 0000 Association request(关联请求)
- 0001 Association response(关联响应)
- 0010 Reassociation request(重新关联请求)
- 0011 Reassociation response(重新关联响应)
- 0100 Probe request(探测请求)
- 0101 Probe response(探测响应)
- 1000 Beacon(信标)
- 1001 ATIM(通知传输指示消息)
- 1010 Disassociation(取消关联)
- 1011 Authentication(身份验证)
- 1100 Deauthentication(解除身份验证)
- 1101~1111 Reserved(保留,未使用)
Control frame(控制帧:Type=01)
- 1010 Power Save(PS)- Poll(省电-轮询)
- 1011 RTS(请求发送)
- 1100 CTS(清除发送)
- 1101 ACK(确认)
- 1110 CF-End(无竞争周期结束)
- 1111 CF-End(无竞争周期结束)+CF-ACK(无竞争周期确认)
Data frame(数据帧:Type=10)
- 0000 Data(数据)
- 0001 Data+CF-ACK
- 0010 Data+CF-Poll
- 0011 Data+CF-ACK+CF-Poll
- 0100 Null data(无数据:未传送数据)
- 0101 CF-ACK(未传送数据)
- 0110 CF-Poll(未传送数据)
- 0111 Data+CF-ACK+CF-Poll
- 1000 Qos Data c
- 1000~1111 Reserved(保留,未使用)
- 1001 Qos Data + CF-ACK c
- 1010 Qos Data + CF-Poll c
- 1011 Qos Data + CF-ACK+ CF-Poll c
- 1100 QoS Null(未传送数据)c
- 1101 QoS CF-ACK(未传送数据)c
- 1110 QoS CF-Poll(未传送数据)c
- 1111 QoS CF-ACK+ CF-Poll(未传送数据)c
2.关于网卡的监听模式
网卡的监听模式,很多网卡设备并不支持。因此我们需要一张支持监听模式的网卡设备。
Linux下使用iw list命令查看自己网卡是否支持监听模式,如果不支持自行准备一张支持monitor模式的网卡
如果支持,使用ifconfig查看当前设备数,找到支持monitor模式的网卡使用命令:
1.关闭网卡 ifconfig wlan1 down 2.设置监听模式 iwconfig wlan1 mode monitor 3.开启网卡 ifconfig wlan1 up
至此网卡监听模式开启
3.关于如何用Python实现监听并获取到所需信息
关于实现probe帧的监听,需要用到一下模块。
1.scapy模块 2.Manuf模块 (通过Wireshark’s OUI database来进行mac地址匹配) 3.Pcapy模块 4.multiprocessing模块
其余模块可有可无。
关于安装模块就不细说了。有一点需要讲一下,关于manuf模块的安装。通过pip install manuf
安装成功后,其实是无法调用成功的。
Import manuf.manuf
后会报错(会说manuf没有这个文件或者文件夹),是模块自身的缺陷导致manuf的缺失,需要手动下载manuf模块并找到manuf OUI database文件手动添加到python site-packet/manuf
文件下。
并在文件夹下的manuf.py的86行修改为io.open(path.join(path.dirname(file),manuf_name),’r’,encode(‘utf-8’))
即可成功调用manuf.macparser()
安装完成后即可开始监听。
根据前边对帧的了解,我们知道probe request帧是手机,电脑,平板等设备发出的请求帧,这个帧属于管理帧的分组。
通过分析请求帧我们可知道,请求帧的subtype == 0x04
,其中包括mac地址信息。设备搜索热点时发送的探求信号,在一些新设备中,为了隐藏自己的真实mac地址,采用的是发送伪mac地址的探求信号,所以在探求帧中是无法获取真实的mac地址。一些老设备中没有此类功能,所以可以采集到真实的mac地址。
响应帧subtype==0x05
,同样包含mac地址信息。同样如此,基站向伪mac地址回应设备,所以统一无法获得真实的mac地址信息。
Probe Request(探测请求)帧
在设备接入基站的过程中,需要进行关联请求也可称为认证,在此过程中,设备所发射的帧中所包含的mac头地址中真实的mac地址,因此我们可以在此过程中获取真实的mac信息。
通过分析请求帧我们可知道,请求帧的subtype == 0x00
,其中包括mac地址信息。同样还存在一个关联响应帧,subtype==0x01
.
Association Request(关联请求)帧
到此为止我们可以获取到的信息有限mac为主
缺失RSSI
RSSI基本概念
RSSI:Received Signal Strength Indication接收的信号强度指示,无线发送层的可选部分,用来判定链接质量,以及是否增大广播发送强度。RSSI经研究不属于802.11g协议帧的内容。但是802.11给出了RSSI的描述。
RSSI是进过物理层是加入帧中的。
802.11将PHY进一步划分为两个组成元件:
1.物理层收敛程序(Physical Layer ConvergenceProcedure,简称PLCP)负责将MAC帧对映到传输介质;
2.实际搭配介质Physical Medium Dependent,简称PMD),负责传送这些帧。
MSDU(MAC层业务数据单元。这是最原始的待发数据信息)经过封装变成MPDU(MAC层协议数据单元),MPDU传到PLCP子层变成PSDU(PLCP子层业务数据单元),PSUD经过封装变成PPDU(PLCP子层协议数据单元)。
可看出RadioTap帧中的成员信息
附录
参考资料
究竟什么是RSSI
贴上部分源码
from scapy.all import *import manuf.manuf as manufdef PacketHandler(pkt): addr,addrT,addrD,target=None,None,None,None if pkt.haslayer(Dot11AssoReq): #Dot11AssoReq为关联请求帧 addrT=pkt.getlayer(Dot11).addr1 addrD=pkt.getlayer(Dot11).addr2 target=pkt.getlayer(Dot11AssoReq).info or b'Unkonwn' addr=[addrT,addrD] manuf = parser.get_all(addr[1]) or 'Unkonwn' # 获取mac地址的信息 pass elif pkt.haslayer(Dot11ProbeReq): #Dot11probeReq为探求帧 addrT=pkt.getlayer(Dot11).addr1 addrD=pkt.getlayer(Dot11).addr2 target=pkt.getlayer(Dot11ProbeReq).info or b'Unkonwn' addr = [addrT, addrD] if addr: if addr not in ap_list: ap_list.append(addr) manuf = parser.get_all(addr[1]) or 'Unkonwn' # 获取mac地址的信息 passparser=manuf.MacParser()sniff(iface="wlan0", prn=PacketHandler)