在monitor模式下使用wireshark抓包分析802.11帧格式,用于分析Airkiss协议及实现
802 协议及 OSI 模型
- 802.2 :逻辑链路控制 Logical Link Control
- 802.3 :以太网 Ethernet (CSMA/CD)
- 802.11:无线局域网 Wireless LAN
802.11是一个协议簇,包括物理层规范、增强型 MAC 层规范及高层协议规范。
802.11与802.3一样,主要定义了OSI模型中物理层和数据链路层的相关规范,其中数据链路层由MAC子层和LLC子层组成,802.11和802.3的LLC子层统一由802.2描述,802.2是为各种媒介向上层提供一个统一的接口。可不管是有线或者无线,都是以802.2为标准,进行封装的。一张老图描述802协议簇在OSI模型关系

Radiotap
monitor模式下802.11在收到帧之后还要在外边包一层称为prism或radiotap的头部,里面包含无线协议帧相关的信息,诸如信号强度、噪声强度、信道、时间戳等。radiotap比传统的prism或AVS头部更有灵活性,radiotap头已经完全取代了prism,两者功能一样,但前者是后者的扩展。该报头属于802.11的规范内容。

这个头部是在802.11成帧后(RX)流经内核mac80211层时加上去的,代码在net/mac80211里。所以这是一个纯软件机制,这个头部对于底层无意义,像iwconfig, iwlist scanning这些工具显示出来的数据并不依赖这个头部的信息。那么它的用途是什么?答案是供给像wireshark这样的协议分析工具用的,这样这些工具就不用实时从硬件获得 RF 射频信息,直接解析协议报文即可。
另外在
monitor模式下发送(TX)流经802.11层时需要脱掉radiotap头部,也就是要求编写 raw 套接字程序通过monitor状态的网卡发送802.11帧时,需要手工把radiotap头部加上,否则内核会认为是异常帧而丢弃。
Prism
各个帧的头部见 LINK-LAYER HEADER TYPES
本文涉及
是在内核中处理,Linux 4.9相关代码linux/if_arp.h及net/mac80211/iface.c
#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */
#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */
#define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */
#define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */
case NL80211_IFTYPE_MONITOR:
sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP;
sdata->dev->netdev_ops = &ieee80211_monitorif_ops;
sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | MONITOR_FLAG_OTHER_BSS;
break;因此在Linux 4.9下抓包格式为802.11 plus Radiotap header
而在Linux 2.6使用的wifi驱动中有如下代码
#define RTMP_OS_NETDEV_SET_TYPE_MONITOR(_pNetDev) RTMP_OS_NETDEV_SET_TYPE(_pNetDev, ARPHRD_IEEE80211_PRISM)
因此抓包格式为802.11 plus Prism header,如下
802.11 帧结构
和所有其他的802链路层一样,802.11可以传输各种不同的网络层协议。和以太网不同的是,802.11是以802.2的逻辑链路控制封装来携带上层协议。
802.11封装上层协议下图

RFC 1042与802.1H均衍生自802.2的子网络访问协议(sub-network access protocol ,简称SNAP )
当AP使用加密模式时,802.11 MAC payload为加密状态,看不到内部封装,只有在非加密状态才能解包分析
协议关系图,从上到下三层分别为网络层、数据链路层和物理层,截图自网络协议图【科来软件 -2011】

MAC
具体802.11帧结构见 802.11 MAC 层,airkiss是基于802.11 MAC 数据帧,因此后续分析全部基于数据帧
数据帧MAC头如下

其中Address字段由 To DS/From DS位来决定

示例

SNAP
SNAP全称Subnetwork Access Protocol,是802.2 LLC的扩展,具体见 Subnetwork Access Protocol
子网络访问协议SNAP规范了在IEEE802网络上传输IP 数据报的标准方法。换句话说,IP数据报可以封装在802.2 LLC,SNAP数据链路层和802.3、802.4、802.5或802.11网络物理层中,然后在IEEE802`网络上发送。

当DASP、SSAP为0xAA或0XAB时,在802.11中只有数据帧含有SNAP,如下图

根据Type可以看出Ethernet type,可以看到继续解析层次为IP->UDP->DATA
加密帧结构
如下图

wireshark识别protocol为802.11,更为上层的数据因为加密的原因无法识别,详细数据如下

airkiss 数据

总结
- 因为网卡及路由的原因,
header长度不一定,因此采用连续发送1-4长度负载来确定整个链路层长度 - 因为采用
mudp,因此会出现乱序 - 当链接加密
AP时,只能分析到802.11,更高层协议因为加密原因无法拆包 airkiss只关心data长度,不关心data内容
Ref
- IEEE 802.11 - libtins
- IEEE 802.2. LLC, Logical Link Control
- How to find out encapsulated protocol inside IEEE802.11 Frame?
- 无线网络嗅探中的 Radiotap
- Understanding the 802.11 Wireless LAN MAC frame format
- Subnetwork Access Protocol
- 以太网两种帧的格式 Ethernet_II and IEEE 802.3
- 802.11 网络协议细节
- Ethernet Encapsulation and De-encapsulation
- 80211 与 IEEE 802 网络技术族谱简介