前年十月安卓的功能做的差不多了,领导安排做 openwrt 上的 WiFi 探针功能,真是什么都不懂,先学 Linux,再看C语言,接着弄虚拟机编译 openwrt 固件,刷机,了解 WiFi 探针信息,了解 802.11 协议,最后发现我们那块 MTK7268 + MTK7612e 的板子根本不能做 WiFi 探针,根本没有进入混杂模式的功能,但是整个过程还是挺有意义的吧,真的各种方法都试过了,找博客,查论文,挺有意义的,现在想想还是写篇博客记录一下吧。

什么是WiFi探针

WiFi探针是一种数据采集功能,拥有无线功能的设备,在探寻周围存在的路由器时,会将自己的一些信息发送出去,这就包括了设备唯一物理地址(mac地址),WiFi探针的存在的目的就是收集这些散布在空间的信息。

这里就存在一个问题,如果有非法分子广泛的使用WiFi探针,它是可以得到大量的唯一的物理地址,加上最近特别火的WiFi某某钥匙之流,窃取用户隐私信息,将手机的物理地址和用户身份信息对应起来,一旦这种对应的数据达到一定数量级,可以做很多违法行为。

例如有的不法分子将WiFi探针放在一些公共场所,只要你路过相应范围,手机的 mac 地址被捕获,不法分子就能知道你的位置,利用多次的数据可以进行时空分析,利用同一时间出现的一系列 mac 地址可以进行伴随分析,公众的隐私完完全全暴露在不法分子眼中,而且这样的案例很多就在我们身边大量使用,防不胜防!

技术本是无罪的,比如我们这个项目WiFi探针的功能就是来探测违法分子的,这大概也是这功能真正能用在有益于大众的地方。

WiFi探针的工作原理

  • 简单叙述

在移动终端接入 WiFi 网络的时候,需要发送Probe request (say hello)探针数据包,而这些数据包中包含了该终端之前接入过的 SSID 名称以及终端的 MAC 地址信息,这种探测模式一般称为主动发现模式。WiFi 通信过程经常会使用 WPA 和 WPA2 的加密方式,以保证终端和 AP 之间的数据包传输的机密性,防止被第三方窃听。然而在终端接入 AP 之前,终端需要去发现 AP 的存在,两者需要发送一些数据包来标识自身的存在,而前期的交互信息是明文,而且包含了终端的 MAC 地址信息和之前接入过的SSID 信息。

在这里插入图片描述

MAC 地址信息可以唯一的标识一台终端设备,不同的厂商拥有自己的 MAC 地址段,可以通过 MAC 地址直接查询该 MAC 地址对应的终端设备厂商信息。因此,在手机识别的过程中,MAC 地址可以作为其唯一性的标识,不同的两个手机 MAC地址是不同的。

  • 原理探讨

要深入了解WiFi探针技术,首先先认识WiFi使用的网络协议,WiFi采用的是IEEE802.11协议集,此协议集包含许多子协议。其中按照时间顺序发展,主要有:

(1)802.11a,(2)802.11b, (3)802.11g(4)802.11n。

在网络通信中,数据被封装成了帧,帧就是指通信中的一个数据块。但是帧在数据链路层传输的时候是有固定格式的,不是随便的封装和打包就可以传输,大小有限制,最小46字节,最大1500字节所以我们必须按照这个规则来封装。

下面是 802.11的帧结构:

在这里插入图片描述

下面是字段描述

在这里插入图片描述

从上面的结构可以知道,前俩个字节为:帧控制字段。 控制字段的前2bit节为:协议类型,目前此值为:0。

  • 帧的类型
    • 控制帧:Control Frame,例如RTS帧、CTS帧、ACK帧)用于竞争期间的握手通信和正向确认、结束非竞争期等;
    • 管理帧:(Management Frame,例如Beacon帧、Probe Request帧)主要用于STA与AP之间协商、关系的控制,如关联、认证、同步等;
    • 数据帧:(Data Frame,承载数据的载体)用于在竞争期和非竞争期传输数据。

下面详细介绍一下各个帧的格式

帧的格式

  1. 管理帧

    BeaconFrame:信标帧,是相当重要的维护机制,主要来宣告某个AP网络的存在。定期发送的信标,可让移动WiFi设备得知该网络的存在,从而调整加入该网络所必要的参数。在基础网络里,AP必须负责发送Beacon帧,Beacon帧所及范围即为基本服务区域。 在基础型网络里,所有沟通都必须通过接入点,因此WiFi设备不能距离太远,否则无法接收到信标。下图是帧格式:

    在这里插入图片描述

  2. 管理帧

    探测请求帧,WiFi设备将会利用Probe Request帧,扫描所在区域内目前有哪些802.11网络。下图是帧格式:

    在这里插入图片描述

  3. 数据帧:

    Data数据帧,当接入点要送出一个帧给WiFi设备但是不必确认之前所传送的信息时,就会使用标准的数据帧。标准的数据帧并不会征询对方是否有数据待传,因此不允许接收端传送任何数据。无竞争周期所使用的纯数据(Data-Only)帧和无竞争周期所使用的数据帧完全相同。看了以上的网络知识,我们现在说说WiFi探针是怎么工作的,还是先看张图: 就像图中描述的一样,我们的WiFi探针其实就是一个AP,它定时的向自己的四周广播发送Beacon帧,用来通知附近的WiFi设备,AP是存在的,(好比它一直在向周围喊着,我在这里,大家快来连接我啊)。 我们的WiFi设备,手机,平板电脑等,也不停的发送着probe帧,去寻找附近可用的AP。在probe帧的介绍中就我们可以看到probe帧包含了设备的mac地址,当我们的AP接收到probe帧之后就获取了这个设备的MAC地址,而这个AP就是我们的WIFI探针。因此只要在WiFi探针覆盖区域内的设备打开着WiFi,探针就能收集到他的MAC地址。

采集数据类型

WiFi探针可采集数据包括设备MAC地址、设备的类型、WiFi信号强度、WiFi信号频道、信号帧类型,设备类型的 AP/Client 可以从数据帧中得出,PC 还是移动设备可以从 mac 地址中得出,WiFi信号频道中可以分辨出AP设备是 2.4G 还是 5. 8G。

存在问题

苹果手机向外发送无线数据的时候,使用的是假的 mac 地址,我们这不太好去解决。

结语

原理部分就讲到这里,这些东西不是没有用,而是非常有用,写的清楚一些是留着查看的。
下面是我在 openwrt 中实习 WiFi 得博客,希望对各位有帮助。

https://blog.csdn.net/lfq88/article/details/116571200

end

完美撒花

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐