一个完整的WLAN连接过程:
一:WLAN扫描
主动扫描:
两种方式:
(1)向各个信道发出Probe Request帧并制定某个SSID,只有能够提供指定SSID相匹配的WLAN服务的AP接受到这个帧后才会答复Probe Response帧(隐藏AP的连接)
(2)STA定期向所有STA支持的信道广播Probe Request帧,所有收到请求的AP都会回应Probe Response帧以表明自己在这里
被动扫描:
AP会每隔一段时间向周围广播Beacon帧,如同心跳,表明自己alive的状态,STA就会收到这个帧,从而知道AP的一些信息
Beacon包含了什么:BSSID、SSID、Channel、RSSI、Beacon interval、Country、Vendor Specific(供应商)。。。
如图:使用wlan.fc.type_subtype == 0x08筛选,把所有Beacon帧过滤出来,Source列就可以找到我们的路由器
从封包可以看到be:76:07:c2:34:a4这个设备发出了广播 Probe Request,然后各个周围的各个AP有给他答复了Probe Response
以上提到的,是指搜索到了这个AP,要连接这个AP,还要制定这个SSID去扫描一次,确保这个AP存在:
二:WLAN认证(Authentication)
需要说下两种认证方式,注意:要区别与认证跟加密,两者是不同的概念
认证:就是确认凭证、检查身份,比如你是警察,你要确认对方是不是警察,那就的确认对方的身份、凭证等
加密:就是通过有规律的把原始数据打乱或重组等方式再呈现出新的数据。比如你是警察,对方是卧底,你们就需要通过暗号进行交流,避免暴露
认证包含2种方式
开发系统(Open System):
就是很简单的发送身份声明跟认证请求,也就是通过Mac地址为身份证明,而MAC地址又是独一无二的,所以AP在这种方式中就直接按802.11最原始的方式,有身份证且唯一就OK,然后AP侧只有成功或者失败,没有更多的交流,AP也不Care其他,只有Yes or No!
注:除非MAC地址重复,staff频繁断线重连的问题还记得吗。。。。
共享密钥(Share Key):
必须使用WEP的加密方式,通信双方要使用相同的密钥去对一个“code”进行加密和解密
1.STA发一个认证请求给到AP
2.AP利用随机密钥(Random key)和初始向量生成一个Challenge Text ,我们就叫“Code1.0”给回STA
3.STA用STA端已知密钥加密得到“Code2.0”,发给AP(就是我们输入的密码的过程)
4.AP使用AP端已知的密钥去解密“Code2.0”,然后比较“Code1.0”是否一致
5.比对完成,AP发送认证答复,成功/失败
这里要注意两点:
1.WPA、WPA2的认证过程仍旧是Open System(规范就是如此,By design)
2.Share Key 区别与WPA-PSK、WPA2-PSK中的PSK(PreShare Key 预共享密钥),
三:WLAN关联(Association)
如图可以看到,一来一回的交流,到了最后关联的阶段,如果通过认证,STA就会向AP端发一个Association Request帧去请求关联
AP收到了Association Request,是怎么处理的呢?
这里就要注意到Association Request里面包含的Listen Interval,意思就是STA会定期聆听beacons帧,为什么要定期,因为要省电节能,STA可以暂时关闭802.11 网络介面的天线,这个Listen interval间隔就是STA的休眠时间(这里指的是WLAN,而不是我们说的待机休眠),是通过AP送来的Beacons Interval计算出来的,也就是说,STA不需要一直监听每个beacons,只需要间隔多个beacons周期后聆听一次,达到省电目的;
802.11规范AP端因为要为STA暂存一些帧,当STA处于休眠阶段,AP将这些帧暂存起来等待STA苏醒,然后发送出去,这就涉及到AP的容量了,当好多个STA连接后,能不能继续给新的STA分配资源去暂存就是AP要考虑的事情了,如果做不到,那可能就会在Association Response返回失败了
Listen interval可以说是STA开给AP的一个价格,AP有足够的空间给STA暂存帧,则交易成功,如果没有那交易失败
四:关联之后呢
WPA/WPA2的四次握手:上面除了WEP共享密钥的认证方式,看到有我们输入密码的过程,我们输入的密码又是在哪里用到呢?WPA的四次握手!
首先,我们输入的密码并不是用来连接上AP的,而是用来作为跟AP沟通时加密数据的,通过使用四次握手的方式来产生所需要的密钥
首选要引入一些概念:
PMK:Pairwise Master Key, 成对主密钥,认证者用来生成组临时密钥(GTK)的密钥
PTK:Pairwise Transient Key, 成对临时密钥,最终用于加密单播数据流的加密密钥
Nonce:一个随机生成的值,只使用一次
MIC:Message Integrity Code,消息完整性校验码,针对一组需要保护的数据计算出的散列值,用来防止数据遭篡改
GTK:Group Temporal Key, 组临时密钥,最终用于加密广播和组播数据流的加密密钥。
使用抓包工具抓包可以看到4次握手过程:
在4次握手前,双方都已知的条件是PMK,SSID、SSID lenth、各自的MAC。。
Round One:首先AP会发一个随机码(A_Nonce),将A_Nonce、A_MAC 发给STA;
Round Two:STA收到A-Nonce后,它就的到的所有的参数,可以通过算法(如图)获得PTK,然后得到PTK后相继的也就算出来MIC。
此时STA也生成一个随机码(S_Nonce),然后S_Nonce、MIC、S_MAC发给AP;
Round Three:AP收到后,也的得到的所有可生成PTK的参数,然后就可以生成PTK,继而算出自己的MIC,这样就AP端就有了来两个可以对比的MIC,也就是校验完整性
如果OK,那AP端算是搞定了。AP端派生出GTK,然后将GTK、MIC发给STA,告诉STA你可以使用PTK加密数据了
Round Four:AP端收到MIC后,也会进行完整性校验,这个过程跟AP端校验的的过程是一样的,大家都确认好拥有同样的MIC,然后发ACK给AP,确认收到OK了,大家可以使用使用PTK(单播数据流)、MIC(组播&广播数据流)加密数据了