Posted by Veitch Kyrie's Blog on August 24, 2020

#STA接入过程

上一回我们说到FIT AP经过一段不轻松的过程,成功拜入AC师傅的门下,获得师傅的认可后,修习了高深的内功,此后,和诸位师兄弟一起,被师傅委以重任。在玉树临风风流倜傥才高八斗学富五车的师傅的英明领导下,众师兄弟齐心协力建立起了名噪一时的龙门镖局,师傅AC任总镖头,AP作为镖师专为各类主顾押镖。龙门镖局以响应主顾速度快,托镖安全有保障而为众人熟知。故坊间有传言“挖掘技术哪家强,中国山东找蓝翔;托运镖物谁最能,首屈一指是龙门”。经过一段时间的打拼,龙门镖局现已名声在外,能够走到这一步,镖局处理托镖事务的标准规范流程起了重要的作用。那么我们就来看看要想找龙门镖局托镖,具体需要怎么做吧。 主顾STA找镖局托镖,具体过程有三:

其一、寻找到满意的镖师AP(扫描:用于STA发现无线网络);

其二、向镖师出示自己的托镖资格(链路认证:STA和AP间无线链路的认证过程,通过了这个认证,才表示STA有资格和AP建立无线链路);

其三、签订托镖协议(关联:确定STA有资格和AP建立无线链路后,STA还需要与AP协商无线链路的服务参数,才能完成无线链路的建立)。

本文以STA找镖局托镖的流程来喻指STA接入过程,托镖则指数据传输。这里我们说的STA接入过程,包括三个阶段:扫描、链路认证和关联。

img

完成了这三个阶段后,STA就连接上了AP。后续STA还要根据实际情况,来决定STA是获取IP地址后就可以接入网络,还是需要再进行各种接入认证和密钥协商后才能接入网络(图中是以Portal认证的流程为例,获取IP是在接入认证之前,不同的认证方式获取IP的顺序可能不一样,例如MAC认证,获取IP是在接入认证之后进行的)。

Ps:接入认证和密钥协商不是一定要进行的,在STA关联阶段,STA会根据收到的关联回应报文来决定是否需要进行接入认证和密钥协商。具体会在后面的关联阶段描述。但在实际的应用中,考虑到无线网络的安全性,通常都会选择进行接入认证和密钥协商的。

第一阶段:扫描

主顾STA在托镖之前,首先要找到自己满意的镖师。因为镖局为适应市场需求,在不同区域安排有不同的镖师负责业务,而主顾可能会在不同的区域中移动,因此主顾就需要及时的了解到当前有哪些镖师可以雇佣。主顾找到可雇佣镖师的过程,用行话来说就是扫描。主顾可以主动的去寻找镖师,也可以被动的等待镖师推送给你的服务信息。

联系到平时我们使用手机连接Wi-Fi之前,通常都是要先看看当前手机上能搜索到哪些无线信号,然后再选中一个网络接入。图中是手机搜索到的无线网络,里面的那一串串字母是啥?对了,就是我们之前介绍过的SSID,也就是每个无线网络的标志。而我们就是通过点击其中的一个想要连接的SSID来进行联网的。

img

其实在这里就体现了一个信息,要想连接无线网络,就需要先搜索到无线网络。STA搜索无线网络的过程就叫做扫描。当然现在很多手机在开启Wi-Fi连接功能的时候,如果以前连接的网络能够连上,会自动就连接以前的网络,这是手机软件为简化用户的操作而设计的功能,并不是说手机就不用再进行扫描过程了。实际上扫描过程是手机等这类STA自动进行的过程,我们在使用的时候,看到的已经是扫描到的结果了。

扫描分为两类:主动扫描和被动扫描。正如字面的含义,主动扫描是指STA主动去探测搜索无线网络,而被动扫描则是指STA只会被动的接收AP发送的无线信号。具体过程请看下文描述。

主动扫描

主动寻找镖师的过程中,主顾STA会在其力所能及的范围内,主动去寻找都有哪些镖师可以帮忙押镖。现在STA已经前往镖局,寻找所有能提供服务的镖师。进入镖局后,STA找了个稍高的位置站好,喊了一嗓子,“有镖师可以帮忙托镖没,这有一宗大买卖”,也许是大买卖三个字引起了众镖师的关注,几乎是最短的时间内,所有的镖师的回应了STA的请求。一般按照龙门镖局的规范要求,所有在位的镖师都要回应主顾的需求,为的就是能够让主顾能够完整的获取到镖师的信息,为主顾提供更多的选择。而STA现在需要做的就是从中选择一个最中意的镖师。

img

主动扫描情况下,STA会主动在其所支持的信道上依次发送探测信号,用于探测周围存在的无线网络,STA发送的探测信号称为探测请求帧(Probe Request)。探测请求帧又可以分为两类,一类是未指定任何SSID,一类是指定了SSID的。

1、探测请求帧里面如果没有指定SSID,就是意味着这个探测请求想要获取到周围所有能够获取到的无线网络信号。所有收到这个广播探测请求帧的AP都会回应STA,并表明自己的SSID是什么,这样STA就能够搜索到周围的所有无线网络了。(注意如果AP的无线网络中配置了Beacon帧中隐藏SSID的功能,此时AP是不会回应STA的广播型探测请求帧的,STA也就无法通过这种方式获取到SSID信息。)

有时候STA发现热情的镖师实在是太多了,为了能够迅速找到想要雇佣的镖师,STA会直接喊出镖师的名字,这样其他的镖师自然不会再来打扰,而只有被点名的镖师才会找上前来,与主顾沟通交流。

img

2、探测请求帧中指定了SSID,这就表示STA只想找到特定的SSID,不需要除指定SSID之外的其它无线网络。AP收到了请求帧后,只有发现请求帧中的SSID和自己的SSID是相同的情况下,才会回应STA。

被动扫描

除了通过主动去镖局的方式寻找镖师外,镖师也会定期发送信息或传单来告诉主顾们这里有镖师可以提供押镖服务。通过这些主动送上门的信息或传单上的联系方式,STA也能找到可以雇佣的镖师。这样做的好处当然就是让主顾更加的省力省事了。

被动扫描情况下,STA是不会主动发送探测请求报文的,它要做的就只是被动的接收AP定期发送的信标帧(Beacon帧)。

img

AP的Beacon帧中,会包含有AP的SSID和支持速率等等信息,AP会定期的向外广播发送Beacon帧。例如AP发送Beacon帧的默认周期为100ms,即AP每100ms都会广播发送一次Beacon帧。STA就是通过在其支持的每个信道上侦听Beacon帧,来获知周围存在的无线网络。(注意如果无线网络中配置了Beacon帧中隐藏SSID的功能,此时AP发送的Beacon帧中携带的SSID是空字符串,这样STA是无法从Beacon帧中获取到SSID信息的。)

STA是通过主动扫描还是被动扫描来搜索无线信号呢?这完全是由STA的支持情况来决定的。手机或电脑的无线网卡,一般来说这两种扫描方式都会支持。无论是主动扫描还是被动扫描探测到的无线网络都会显示在手机或电脑的网络连接中,供使用者选择接入。而一般VoIP语音终端通常会使用被动扫描方式,其目的是可以节省电量。

当手机扫描到无线网络信号后,我们就可以选择接入哪个网络了,这时STA就需要进入链路认证阶段了。

第二阶段:链路认证

当STA找到满意的镖师后,并不能够直接就让镖师押送货物,而是需要先通过镖师的认证,验证STA的合法资格后才能签订押镖协议,避免不合法或恶意的STA进行不可告人的活动。

龙门镖局为主顾们提供了好几种服务套餐(安全策略),每种服务套餐都会包含有不同的方式来验证STA的合法资格。但总的来说验证STA资格的方式分有两种:开放系统认证和共享密钥认证。

STA和AP之间是通过无线链路进行连接的,在建立这个链路的过程中,需要要求STA通过无线链路的认证,只有通过认证后才能进行STA和AP之间的无线关联。但此时尚不能判断,STA是否有接入无线网络的权限,需要根据后续STA是否要进行接入认证、是否通过接入认证才能判断。

一说到认证,可能大家就会想到802.1X认证、PSK认证、Open认证等等一堆的认证方式。那这些认证方式和链路认证有什么关系呢?在解决这个问题前,我们先来简单的了解下安全策略。

安全策略体现的是一整套的安全机制,它包括无线链路建立时的链路认证方式,无线用户上线时的用户接入认证方式和无线用户传输数据业务时的数据加密方式。如同下表中,列举出来几种安全策略所对应的链路认证、接入认证和数据加密的方式。

安全策略 链路认证方式 接入认证方式 数据加密方式 说明
WEP Open 不涉及 不加密或WEP加密 不安全的安全策略
Shared-key Authentication 不涉及 WEP加密 仍然是不安全的安全策略  
WPA/WPA2-802.1X Open 802.1X(EAP) TKIP或CCMP 安全性高的安全策略,适用于大型企业。
WPA/WPA2-PSK Open PSK TKIP或CCMP 安全性高的安全策略,适用于中小型企业或家庭用户。
WAPI-CERT Open 预共享密钥鉴别 SMS4 国产货,应用的少,适用于大型企业和运营商。
WAPI-PSK Open WAPI证书鉴别 SMS4 国产货,应用的少,适用于小型企业和家庭用户

这里再配合下面这张图一起理解下。链路认证和接入认证是先后两个不同阶段的认证。

img

从表中可以看出,安全策略可分为WEP、WPA、WPA2和WAPI几种,这几种安全策略对应的链路认证其实只有Open和Shared-key Authentication两种,而802.1X和PSK则是属于接入认证方式。另外用户接入认证方式其实还包括表中未列出的MAC认证和Portal认证。

(Ps:更多的安全策略、MAC认证和Portal认证的内容,可以参考WLAN安全特性和安全特性的特性描述。)

现在回到我们的主题上来,链路认证包括Open和Shared-key Authentication,具体认证过程是怎么样的呢?

开放系统认证(Open System Authentication)

为加快镖师处理业务的速度能力,龙门镖局使用了一种叫做开放系统认证的方式来检查主顾的合法资格,只要主顾有托镖请求,镖师都会直接同意。当然这样做会存在安全隐患,让不合法的主顾有机可趁,所以为了提高镖局的安全保障,通常配合这套认证方式,会在后面的托镖流程中再进行一次严格的方式来专门检查主顾的合法资格。

img

开放系统认证简称就是Open认证,又叫不认证。但是要注意,不认证也是一种认证方式,只不过这种链路认证方式下,只要有STA发送认证请求,AP都会允许其认证成功,是一种不安全的认证方式,所以实际使用中这种链路认证方式通常会和其它的接入认证方式结合使用,以提高安全性。认证协议如果是Open System,即AP只对接入设备的MAC地址进行验证,只要MAC地址不被BAN,STA就可以通过认证

img

共享密钥认证(Shared-key Authentication)

另一种方式叫共享密钥认证,需要主顾和镖师间先确定好一个暗语,主顾发出托镖请求后,镖师会用暗语的方式验证主顾的身份合法性。通过了认证会给主顾办理托镖业务。

img

看到共享密钥认证,从名称上很容易就让人联想到预共享密钥认证PSK(Pre-shared key Authentication),其实共享密钥认证是一种链路认证方式,而预共享密钥认证是一种用户接入认证方式,两种认证方式的过程实际上是类似的。

共享密钥认证的过程只有四个步骤,在认证前,需要在STA和AP上都配置相同的密钥,否则是不能认证成功的。

img

认证的第一步,是由STA向AP发送一个认证请求。

接着,AP在收到请求后会生成一个挑战短语,再将这个挑战短语发送给STA,假设这个挑战短语是A。

然后,STA会用自己的密钥Key将挑战短语进行加密,加密后再发给AP,假设加密后变为了B。

最后,AP收到STA的加密后信息B,用自己的密钥Key进行解密。只要STA和AP上的密钥配置的一致,解密出来的结果就会是A,AP会将这个结果与最开始发给STA的挑战短语进行对比,发现结果一致,则告知STA认证成功,结果不一致则就会认证失败。

开放式系统验证和共享密钥验证两种模式中,每个移动客户端都必须针对访问点进行验证。开放式系统验证其实可以称为“无验证”,因为实际上没有进行验证——工作站说“请求验证”,而AP也不管是否密钥是否正确,先“答应了再说”,但最终ap会验证密钥是否正确,决定是否允许接入——这种验证方式的ap,往往你随便输入一个密码,都可以连接,但如果密码不正确,会显示为“受限制”。共享密钥验证稍微强大一些,工作站请求验证,而访问点(AP)用WEP加密的质询进行响应。如果工作站的提供的密钥是错误的,则立即拒绝请求。如果工作站有正确的WEP密码,就可以解密该质询,并允许其接入,因此,连接共享密钥系统,如果密钥不正确,通常会立即显示“该网络不存在等提示”。 说实话,wep已经基本上无安全可言。但至少,共享密钥系统稍微安全一点。

链路认证成功后,STA就可以进行下一步的关联阶段了。

第三阶段:关联

验证完了主顾的合法资格后,镖师将主顾请到会客室,准备签订托镖协议。STA将准备好的各类协议材料提交给镖师,然后镖师会把这些材料递交给镖头,由现任的镖头AC来审核签订协议。审核签订完成后,镖师再把镖头的审核签订结果递交给主顾。至此,STA完成了托镖的流程。

img

关联总是由STA发起的,实际上关联就是STA和AP间无线链路服务协商的过程。

关联阶段也是一个只有关联请求和回应的两步的过程。

img

STA在发送的关联请求帧中,会包含一些信息,包括STA自身的各种参数,以及根据服务配置选择的各种参数。(主要包括STA支持的速率、信道、QoS的能力,以及选择的接入认证和加密算法等等。)如果是FAT AP收到了STA的关联请求,那么FAT AP会直接判断STA后续是否要进行接入认证并回应STA;如果是FIT AP接收到了STA的关联请求,FIT AP要负责将请求报文进行CAPWAP封装后发送给AC,由AC进行判断处理,并且FIT AP还要负责将AC的处理结果解CAPWAP封装后再发送给STA。(在这个过程中FIT AP起到一个传话筒的作用,且AP和AP间的这类关联报文需要通过CAPWAP隧道传输。)

托镖协议签订完成后,根据主顾选择的服务套餐,后续会有不同的托镖流程。例如,主顾选择的是WEP安全策略的服务套餐(例如Open 不加密),这种情况下,协议签订完成后,STA获取一个临时联系方式(获取IP地址),就可以通过镖局发镖了。如果主顾选择的是WPA安全策略的服务套餐(例如Open 802.1X CCMP),协议签订完成后,用户获取联系方式后,还需要进行一轮新的身份权限认证(802.1X认证)和密钥协商,成功后才能通过镖局发镖。

关联完成后,表明STA和AP间已经建立好了无线链路,如果没有配置接入认证,STA在获取到IP地址后就可以进行无线网络的访问了。如果配置了接入认证的,STA还需要完成接入认证、密钥协商等阶段才能进行网络访问。(如果接入认证失败,仅可以访问Guest VLAN中的网络资源或Portal认证界面。)

其它阶段

如前面链路认证阶段所述,接入认证包括802.1X认证、PSK认证、MAC认证以及Portal认证。通过这些认证方式可以实现了对用户身份的认证,提高了网络的安全性,而密钥协商是对用户数据安全提供保障。完成接入认证和密钥协商后,就可以进行网络访问了。限于本期的重点,详细的内容不加以描述,有兴趣了解这方面内容,可以参考WLAN安全和安全的特性描述。

最后给大家分享个内涵故事,并用本期介绍的知识简单分析下。一对新婚***,老婆为了向某单身闺蜜秀优越,带着新婚的老公去看望该单身闺蜜,席间老婆拿出老公的IPhone6,习惯性的开启了Wi-Fi,没有输入密码,直接就连上了网络。。。。。瞬间,她貌似明白了什么,默默的拿出了自己的手机,选择连接闺蜜家的Wi-Fi,显示这是一个安全的网络,需要输入密码才能连接。她醒了,她彻底觉悟了——她的手机能关联闺蜜家的WLAN,但她要输入密码才能使用闺蜜家的Wi-Fi。

手机上能看到这个Wi-Fi网络,表示手机成功的通过扫描过程找到了Wi-Fi网络。老公的手机直接能连Wi-Fi,老婆的手机要输密码才能连,并且手机有显示这是一个安全的网络,表示闺蜜家的Wi-Fi是存在密码认证的。手机连接过的Wi-Fi,通常可以存储上次连接时的一些信息,比如密码,那么下次再连接的时候是不需要用户重新输入密码,手机软件直接帮忙输入了。所以老公的手机一定是之前有连过闺蜜家的Wi-Fi,这次才会不用输密码就直接连上。那这个密码是链路认证还是接入认证阶段提示的呢,仅通过上面的信息是无法判断的。因为链路认证可以采用共享密钥加密方式,接入认证可以采用更多的(比如802.1X、PSK、Portal等)认证方式,两者都需要输入密码,所以不能认为需要输密码就是接入认证,也有可能是链路认证。不过在实际使用中,链路认证通常使用Open认证,较少使用共享密钥认证,所以一般情况下是接入认证提示密码的可能性大。

可以这样理解:

链路认证 —认证STA有没有权限和AP建立链路

链路认证+关联 —STA能不能接入WLAN网络

接入认证 —STA接入WLAN网络之后,认证STA能不能访问网络的权限(如果安全策略里面没有接入认证的过程,则表示STA接入WLAN网络后就有访问网络的权限,不需再认证)


管理帧 (Management Frame)

Type SubType FrameType
00 0000 Association request (连接请求)
00 0001 Association response (连接响应)
00 0010 Reassociation request(重连接请求)重连接前仍需进行authentication认证
00 0011 Reassociation response(重连接联响应)
00 0100 Probe request(探测请求)
00 0101 Probe response(探测响应)
00 1000 Beacon(信标,被动扫描时AP 发出,notify)
00 1001 ATIM(通知传输指示消息)
00 1010 Disassociation(解除连接,notify)
00 1011 Authentication(身份验证)
00 1100 Deauthentication(解除认证,notify)
00 1101~1111 Reserved(保留,未使用)

不管是STA还是AP都可以发Deauthentication 和Disassociation 帧,参考https://mrncciew.com/2014/10/11/802-11-mgmt-deauth-disassociation-frames/

Deauthentication Frame Station or AP can send a Deauthentication Frame when all communications are terminated (When disassociated, still a station can be authenticated to the cell). Deauthentication frame format is as shown below. It is subtype 12 (0x0c) management frame (type 0) & you can filter it using below wireshark filter.

Disassociation Frame Once a station associated to an AP, either side can terminate the association at any time by sending a disassociation frame. It has the same frame format as deauthentication frame. A station can send a disassociation frame because it leave the current cell to roam to another cell. An AP could send disassociation frame because station try to use invalid parameters.(above given reason codes applicable to disassociation frames as well). You can filter disassociation frames in wireshark using below filter (subtype 10 management frames)

关于 IEEE 802.11

IEEE 802.11是现今无线局域网通用的标准,而当今我们熟悉的Wi-Fi,正是基于IEEE 802.11系列标准的产品。通过Wi-Fi,我们可以尽情享受无线上网的乐趣,而不必拖着长长的网线。那么,它是如何工作的呢?带着这样的疑问,我查找了相关资料,并通过抓包的方式进行验证。由于没有通信相关的专业背景,因此学习的主要是数据链路层的部分。

定义

img

Access Point(AP)

接入点,多指无线访问接入点,即通常所说的路由器。

Station(STA)

站点,泛指无线接入设备,如笔记本电脑、平板电脑、手机等。

Basic Service Set(BSS)

所有无线设备(STA)关联到一个访问点(AP)上,它们构成一个基础服务集合。在集合中,访问点控制和主导整个BSS中的全部数据的传输过程。

Extended Service Set(ESS)

多个BSS通过各种手段互联形成的扩展网络,无线设备关联到一个或多个访问点上,它们构成一个扩展服务集合。在同一个ESS中的不同BSS之间切换的过程称为漫游。

Service Set Identification(SSID)

BSS和ESS使用的标识符,路由器等AP一般都允许用户自由设置。

802.11 Frame

802.11标准将所有的帧(Frame,数据链路层的基本传输单元)分为3种:

  1. Management Frame

    管理帧(wlan.fc.type == 0x00)

    用于STA与AP之间协商、关系的控制。

    • Beacon Frame

      信标帧(wlan.fc.type_subtype == 0x08)

      一个提供服务的AP会定时发送Beacon Frame以告知BSS的存在,并提供了BSS的一些基本信息,如BSSID、SSID、Channel等。

    • Probe Request / Probe Response

      探测请求(wlan.fc.type_subtype == 0x04)和探测响应(wlan.fc.type_subtype == 0x05)

      Probe request由STA发出,用于探测周围的BSS。如果指定了SSID,则只有SSID与之一致的BSS(准确来说是BSS内的AP)会通过Probe Response进行响应;如果未指定,则所有BSS都会进行响应。和Beacon Frame一样,Probe Response提供了BSS的基本信息。

    • Authentication

      认证(wlan.fc.type_subtype == 0x0B)

      Authentication中,包含认证类型(Authentication Algorithm),认证进度(Authentication SEQ),认证状态(Status Code)。AP可以根据相关信息决定接受还是拒绝某个STA的加入,并同样通过Authentication进行回复。

    • Deauthentication

      解除认证(wlan.fc.type_subtype == 0x0C)

      用来终结认证关系。

    • Association Request / Association Response

      关联请求(wlan.fc.type_subtype == 0x00) / 关联响应(wlan.fc.type_subtype == 0x01)

      一旦STA找到网络并通过认证,就会发送Association Request,请求 AP 进行关联。AP以Association Response进行回应。如果AP接受该请求,将为该STA分配资源。

    • Reassociation Request / Reassociation Response

      重关联请求(wlan.fc.type_subtype == 0x02) / 重关联响应(wlan.fc.type_subtype == 0x03)

      当STA远离原AP,并发现相同的ESS里有另一个信号更强的AP时,STA将发送Reassociation Request。AP以Reassociation Response进行回应。一旦AP接受该请求,将为该STA分配资源,由此AP提供服务。

    • Disassociation

      解除关联(wlan.fc.type_subtype == 0x0A)

      用来终结关联关系。收到Disassociation后,AP将释放先前为该STA分配的资源。

  2. Control Frame

    控制帧(wlan.fc.type == 0x01)

    用于竞争期间的握手通信和正向确认等,为数据帧的发送提供辅助功能。

    • Power Save - Poll

      省电-轮询(wlan.fc.type_subtype == 0x0A)。休眠的AP定期发送。

    • Request To Send

      请求发送(wlan.fc.type_subtype == 0x0B)

      表明A要向B发送若干数据,申请预约。目的是为了避免同时有多人向B发送帧,导致冲突。

    • Clear To Send

      清除发送(wlan.fc.type_subtype == 0x0C)

      收到Request To Send后,如果B同意该预约,则通过Clear To Send宣告其他人在一定时间内暂停向自己发送数据,避免冲突。

    • ACK

      确认收到的数据帧(wlan.fc.type_subtype == 0x0D)

      如果收到的数据帧校验出错,则不发送ACK,等待重传。

    • CF-End

      无竞争周期结束(wlan.fc.type_subtype == 0x0E)

      让STA脱离PCF模式,开始以DCF(基于竞争)模式。

    • CF-End + CF-ACK

      无竞争周期结束+确认(wlan.fc.type_subtype == 0x0F)

  3. Data Frame

    数据帧(wlan.fc.type == 0x02)

    用于在竞争期(Contention Period)和非竞争期(Contention-free Period)传输数据。

    • Data

      基本数据帧(wlan.fc.type_subtype == 0x00)

      包含了通信的实际数据。

    • Null

      没有数据的空帧(wlan.fc.type_subtype == 0x04)

      但可以有其它的标记信息。

    • CF-ACK

      无竞争周期的确认(wlan.fc.type_subtype == 0x05)

      用于确认之前所收到的帧。

    • CF-Poll

      无竞争周期的轮询(wlan.fc.type_subtype == 0x06)

      用于通知已经没有数据要传输。

    • Qos Data

      Data帧的 Qos 版本(wlan.fc.type_subtype == 0x08)

    • Qos Null

      Null帧的 Qos 版本(wlan.fc.type_subtype == 0x0C)

    此外还有各种帧的组合,如Data + CF-ACK,Data + CF-Poll、Qos Data + CF-ACK等,不再细述。

工作流程

为了真正了解802.11协议的工作流程,这里对一个STA加入到一个BSS的过程进行装包分析。打开Wireshark后,进入Capture-Input,选择要监听的WIFI网卡,将Link-Layer Header改为Per-Packet Information,将Monitor Mode改为enabled(双击修改)后开始监听。

  1. STA通过侦听AP定期发送的Beacon Frame来发现BSS。

    如图,可以发现空间中充斥着各个AP发送的Beacon Frame:

    img

    在这种方式下,STA几乎无需付出扫描代价,因此称为被动扫描。还有一种称为主动扫描的BSS发现方法,STA通过在信道上发出Probe Request帧,通过AP发回的Probe Response来发现BSS。如图,设备HTC在广播Probe Request后,收到了SSID为STAR的AP发来的Probe Response:

    img

    img

    从图上可以发现在STA在发现STAR后双方又进行了多轮Probe。

  2. 当STA获取到该BSS的相关信息并确定想加入该BSS时,向相应AP发送Authentication Request

    如图,双方通过发送Authentication帧进行认证:

    img

    img

    我们发现这里的认证协议是Open System,即AP只对接入设备的MAC地址进行验证,只要MAC地址不被BAN,STA就可以通过认证。这样岂不是很不安全?非也非也,请接着往下看。

  3. 认证通过后,STA向该AP发送Association Request,AP收到后回复Association Response

    img

    img

  4. 至此,STA接入完毕,可以开始向AP传送数据帧

  5. 注意:在上图中,AP对STA发起了EAPOL认证( EAP(Extensible Authentication Protocol),可扩展认证协议,是一种普遍使用的支持多种认证方法的认证框架协议,主要用于网络接入认证)这是因为AP选择了WPA2(RSN)-PSK的认证方式。在这种认证方式下,AP和STA把预共享密钥(PSK)当作成对主密钥(PMK),并通过EAPOL协议进行四次握手,生成了成对临时密钥(PTK),用于加密后续通讯内容。

    After EAPOL 1 and 2 both sides know the temporal key that will be used to decrypt the traffic.

    The third message is proof that both sides know the temporal key and indicates that the Authenticator (the base station) is ready to start using the temporal key.

    The fourth message triggers the switch from the PMK set up before the EAPOL to the temporal key derived in the EAPOL

  6. 双方通过Qos data帧交换数据

    此时帧中的数据已被PTK加密:

    img

应用

在学习了相关概念和流程后,可以折腾一些有趣的东西。

应用一 利用Wireshark进行无线网络抓包

Wireshark可以通过PSK算出PTK来解密数据。在Preferences-Protocols-IEEE 802.11中勾选Enable decryption:

img

点击Decryption Keys旁边的Edit按钮,新增类型的wpa-pwd的记录,Key为接入AP的PSK:SSID:

img

保存后发现先前被加密的数据被解密了!从链路层到应用层的报文一览无余:

img

这意味着我们可以方便地进行跨设备网络嗅探。曾经抓移动设备的包是一件十分蛋疼的事情,为此我尝试了各种姿势:

  1. 在移动设备上直接抓包

    抓出来的包在移动设备上无论是查看还是操作都十分不方便,往往需要导出到电脑上来分析。

  2. 电脑做AP供移动设备连接,然后在电脑上抓包

    由于RMBP只有无线网卡,一旦做了AP就连不了网,无法满足99%的应用场景。

  3. 路由器上抓包

    最终我搞了一台极路由,刷了OpenWRT,然后直接在上面tcpdump,当然dump出来的文件依然要拷到电脑上分析才方便。这个方法唯一的不足是能够让你愉快地进行tcpdump的路由毕竟极少,日常生活中99%的路由都是只能192.168.1.1的弱鸡路由,比如上文所用的TPLink。

通过网络嗅探的方式,我们能够得到移动设备传输的包,再通过PTK解密得到包内容,不失为一种另类的抓包方法。

应用二 WIFI探针

通常来说,移动设备会经常发送Probe request来发现周围的BSS,而在Probe request中有设备的MAC地址。只要我们监控周围的Probe request帧,就可以知道是否有某个设备进入了BSS的范围。于是,我搞到了BOSS手机的MAC地址,写了一段代码,BOSS一旦进入到WIFI覆盖范围就弹出提示。

由于RMBP只有一张无线网卡,在进入monitor mode后会导致无法上网,为了避免该影响,考虑插入多一张网卡。一番寻找后,掏出了吃灰多年的360wifi2代(9块9包邮哦亲)。由于懒得折腾Mac上的驱动,因此转移到自带驱动的Ubuntu 16.04的虚拟机上进行。在插入网卡后,设备已经被识别:

$ lsusb
...
Bus 001 Device 004: ID 148f:760b Ralink Technology, Corp. MT7601U Wireless Adapter
$ ifconfig
...
wlx24050f2db588 Link encap:Ethernet  HWaddr 24:05:0f:2d:b5:88          UP BROADCAST MULTICAST  MTU:1500  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

进入monitor mode,设置监听信道:

$ sudo ip link set wlx24050f2db588 down
$ sudo iw dev wlx24050f2db588 set type monitor
$ sudo ip link set wlx24050f2db588 up
$ sudo iw dev wlx24050f2db588 set channel 1

此时看iwconfig,会发现wlx24050f2db588网卡的Mode为Monitor,Frequency为2.412 GHz。

以下是监听代码,依赖于scapy 2.3.2和manuf(https://github.com/coolbho3k/manuf.py):

from __future__ import print_function
from scapy.all import *
import manuf

def monitorDevice(pkt):
    addr, target = None, None
    if pkt.haslayer(Dot11ProbeReq):
        addr = pkt.getlayer(Dot11).addr2
        target = pkt.getlayer(Dot11ProbeReq).info or ''
    if pkt.haslayer(Dot11ProbeResp):
        addr = pkt.getlayer(Dot11).addr1
        target = pkt.getlayer(Dot11ProbeResp).info or ''
    if addr:
        manuf = parser.get_manuf(addr) or 'Unknown'
        print('Detected Devices: MAC[%s] Manuf[%s] Target[%s]' % (addr, manuf, target))
        if MAC_DICT.get(addr) == 'BOSS':
            print('[*] Warning!!! BOSS is coming!!!')


MAC_DICT = {'50:2e:5c:e5:e6:14': 'BOSS'}
interface = 'wlx24050f2db588'
parser = manuf.MacParser()
sniff(iface=interface, prn=monitorDevice)

这份代码除了监听Probe Request,还监听了Probe Response。当监听到BOSS手机的MAC,输出提示。于是我跑着这份代码,开始了愉悦的摸鱼生活~

img

第一天,我利用WIFI探针,成功躲过BOSS的袭击。

第二天,我被BOSS干死了,因为今天BOSS的手机没开WIFI。

第三天,我又被BOSS干死了,因为今天BOSS出门没带手机。

第四天,我又被BOSS干死了,因为今天BOSS竟然换IPhone了。

……

总结

我们必须承认,Wi-Fi的普及是人类史上的一次飞跃。拥有Wi-Fi,我们不再需要拖着长长的网线,不必担心路由器上的LAN口不够用,为移动设备的发展提供了良好条件。但同时也必须指出,我们在获取Wi-Fi便利的同时,也付出了相应的代价:当你在大街上行走时,路边不起眼的垃圾桶正监听移动设备发出Probe Request帧,为“大数据”增砖添瓦;当你进入餐馆,询问店家密码后愉快地连上WIFI刷朋友圈刷微博时,你的隐私可能正在店家甚至是其他人收集;当你在家里偷偷摸摸地下载小黄油时,隔壁老王发出叹息:“这部早看过了”。只有不断提高自己的姿势水平,才能保证自己的菊部安全。总之,出门在外,还是走Proxy全局加密吧~