这篇文章基于《Wi-Fi Simple Configuration Technical Specification Version 2.0.5》文档, 更详细的内容请直接参考文档,这里只将自己的想法做一些简单的记录。
一、WSC的三种实现
WSC(wifi simple configuration),一看这名字就知道这个协议是用来偷懒用的,所以我将它翻译为“快速接入无线网”协议,这个协议主要包括三种快速连接方式:
1. WPS: 看这篇文章的人,应该会知道wps是干嘛用的,但是相信也有很多人不了解,因为周边的朋友从来都问wifi密码是多少,不会问wps按钮在哪。但是老外对这个功能比较喜爱,他们把密码设个几十位加特殊字符,连自己都不记得了,更不要说告诉你了,所以wps成了解决这个问题的很好选择。有线之所以比无线跟安全,其中一个原因是我们不能轻易的将一根网线插到他的router上去,但是却可以通过无线轻易的搜到这个router的信号,通过不同的手段破解。但是将router设个几十位的ccmp加密,我想应该不会有人想去破解它了。
WPS主要包括两种快速接入的方法:PIN (personal identifiy number) and PBC (push button configuration)。
ROUTER PIN 是一组序列号,它写在router里面,一般可以从router的标签上可以看到,它是"external registrar"的验证模式,仅需路由器的PIN,此模式的设计存在问题允许对PIN进行暴力猜测攻击。当PIN验证失败时访问接入点会发送EAP-NACK消息回客户端。根据发送回的EAP-NACK消息攻击者可判断PIN的前一半是否正确,此外,PIN的最后一个数字也是已知的,因为它是一个PIN的校验。这种设计大大降低了暴力破解PIN的尝试次数,尝试次数从10的8次方到10的4次方
+10的3次方之间,共11000次尝试。根据报告一些无线路由器没有对暴力破解尝试进行任何锁操作策略,这就大大降少了成功进行暴力破解攻击的时间。也有报告一些路由器会因为暴力破解尝试产生拒绝服务条件,需要重新启动。对于这种问题,router一般会对pin_lock_down的数量进行限制,如果是5,那么验证5次后会锁住,不在让PIN。
CLIENT PIN是无线客户端随机生成的PIN,在连接router的时候,将它输入router里面,实现验证连接,这种方式会比router pin会安全些。
PBC就是按下WPS按钮后,router会开始广播带有WCS IE的beacon包,当wireless client收到这个信息以后,表示在这周围有发现可使用WSP连接的AP,然后就会发送request进行关联,这个关联并不是真正的连接,只是为了让完成8路wps认证,以获取router的认证信息,包括ssid,psk,encryption等;获取到这些信息以后,断开与router的关联,然后用这些信息实现RSNA(正常连接的4路握手过程)。
2. P2P(peer-to-peer):这个协议可以实现两个sta之间直接互联,是不是想到了蓝牙功能?没错,它就是可以像蓝牙功能那样,将两个设备之间连接起来快速的传输文件,而且稳定又快。但是蓝牙的省电是direct wifi的硬伤,如果用p2p听歌或打电话,我想简直有点耗电过头了,但是用蓝牙耳机来完成这些功能实在是划算。除了耗电这一点,我想direct wifi几乎可以完成蓝牙所有的事了,我买了个蓝牙音箱,隔个房间音质就变差了,但是使用direct wifi,去一楼也没事,如果这个协议成熟了,应该可以节省好多网线吧。
3. NFC(非接触式射频识别):这个协议允许你的无线客户端只要刷一下router就可以上网了,是不是更方便了呢?就像超市刷条形码一样。如果哪一天,你进入一家餐馆,你只要刷一下手机,就会把你所有预定好的菜都上好,而且会自动帮忙连上这家的无线网络,会不会觉得很贴心呢?想想还是挺美的。
二、基本概念
Registrar: An entity with the authority to issue and revoke Domain Credentials. A Registrar may be integrated into an AP, or it may be separate from the AP. A Registrar may not have WLAN capability. A given Domain may have multiple Registrars.一个发放和撤销证书的实体,它可能整合在外部AP上,也可能和AP相互独立,这个实体可能没有wlan特性,而且一个指定的域里面也有可能有多个registrars。简直不是人话,说白了,它就是一个server,让要鉴定真身的太监们来这里报道,所以下面叫它"认证server",
enrollee叫“接入者”
Enrollee: A Device seeking to join a WLAN Domain. Once an Enrollee obtains a valid credential, it becomes a Member.
Stand-Alone External Registrar (SAER): An External Registrar that is not embedded in a wireless STA. For example, may be embedded in an Ethernet connected device, or may be software installed on any networking device.
WSC IE:WSC information element,这个字段主要在beacon包,probe requests and probe responses里面,以表明是WSC连接,从这些包的IE里面获取的信息是没有加密认证的。
In-band(内带): Data transfer using the WLAN communication channel, including WLAN multiband devices (e.g. 2.4GHz, 5GHz, and 60GHz).
Out-of-Band(外带): Data transfer using a communication channel other than the WLAN.
内带和外带是两个比较重要的概念,这主要体现在输入PIN的时候,如果将无线客户端的PIN通过页面或其他方式输入给router,那么这叫内带,因为它传输使用的是和无线同一channel;但是如果使用的是NFC的方式,那么就是外带了,因为NFC工作在13.56MHz频道,肯定不是WLAN channel。
我们下面讨论的都是内带方式,包括router pin,client pin,pbc。
三、核心结构
关于WPS的认证结构,文档上是这样画的:
关于这个图,有点像portal的功能,也有点想802.1x协议的实现过程,不管是哪一种,对于用户来说,配置起来都有些难度。
这种结构需要至少三个设备,enrollee用来作客户端,AP用来做接入点,registrar用来做认证服务器:
Enrollee的角色类似于supplicant,它向Registrar发起注册请求。
Registrar用于检查Enrollee的合法性。另外,Registrar还能对AP进行配置。
AP也需要注册到Registar中。所以,从Registrar角度来看,AP也是Enrollee。
AP和Registrar以及Enrollee三者交互,Enrollee从Registrar那获取AP的安全配置信息,然后Enrollee利用该信息加入AP提供的无线网络。
注意,这三个组件只是逻辑上的概念,这种结构叫:AP With an External Registrar
在具体实现时,AP和Registrar可以由同一个实体实现,也可分别由不同实体来实现。
但是在实际应用中,AP和registrar是由一个设备实现的,所以我更喜欢这样画:
这种结构就是常说的 Standalone AP。
四、In-band Setup Using a Standalone AP/Registrar
其实还有EAP-based Setup of External Registrar和Ethernet-based Setup of External Registrar,这里就不分析了,下面主要分析常用的 standalone AP的方式
1. AP端的WSC开始工作后,它会广播带有WSC IE字段的beacon包,以声明AP支持WSC
2. 如果Enrollee收到来自AP的端的beacon包,那么它会解析beacon包中的 WSC IE,并向AP发送单播Probe Request包;如果Enrollee没有收到带有WSC IE的beacon包,那么它就会去搜索周围支持WSC的AP,所以会向周围发送Probe Request广播包。
如果Enrollee发现周围有两个或者两个以上的AP在跑WPS,则Enrollee会在发现阶段停止继续执行;同理,如果AP发现有两个或两个以上的Enrollee在尝试建立WPS连接,AP也会停止运行WPS。如果哪一天按下你router的WPS按钮,发现wps灯快闪了几下就不闪了,可能就是当时同时有两个Enrollee在尝试WPS连接。
3. AP收到带有 WSC IE的Probe Request请求包以后,就会回复Probe Response包,这个包里面带有WSC IE,会告诉Enrollee一些信息,这些信息很多,Enrollee会根据这些信息来决定下一步的动作
4. 这条虚线是一个分水岭,对于PIN WPS需要在这个步骤输入PIN,对于PUSH BUTTON则不需要输入,当然PIN有分AP PIN和client PIN,这个决定了需要在AP端还是在Enrollee端输入PIN, 这种输入都是in-band的方式,当然也可以使用out-band的方式输入信息,如NFC
5. 当Enrollee获取到AP端的信息,并且通过判断符合接入条件的时候,Enrollee会尝试去和AP进行认证,向AP发送Auth包
6. AP端知道又是这个小伙子来了,很大度的让他认证成功,并回复Auth 成功包
7. 然后Enrollee发送Association Request 关联请求包,并附带WSC IE 信息,这个信息很重要,目的是告诉AP我这边使用的协议的802.1x WPS 1.0 协议,我们接下来的M1-M8过程也将会遵守这个协议进行交互,你那边可要准备好哦,如果不能接受这种协议的话,请及时告诉我。
8. 这时,AP端发现,放心啦,你这种协议我是支持的,让你关联进来完成下面的信息交互过程吧! 然后AP就会发送一个Association Response包给Enrollee,完成关联。
9. 发送EAPOL-Start
10. 在STA和AP双方开展EAP-WSC流程前,AP需要确定STA的Identity以及使用的身份验证算法。该过程涉及三次EAP包交换。这三次包交换的内容,首先,AP发送EAP-Request/Identity以确定STA的ID
11. 对于打算使用WSC认证方法的STA来说,它需要在回复的EAP-Response/Identity包中设置Identity为"WFA-SimpleConfig-Enrollee-1-0"。
12. AP确定STA的Identity为"WFA-SimpleConfig-Enrollee-1-0"后,将发送EAP-Request/WSC_Start包以启动EAP-WSC认证流程。这个流程将涉及M1~M8相关的知识。
13-20. M1到M8的交互过程
看到这些是不是有点不耐烦了?没关系,先去了解一下EAP和EAPOL的知识再来看这个吧,或者直接看看802.1x协议也不错。802.1x本来是专门针对无线局域网涉及的,后来却在PPP上玩的风声水起。
EAPOL:Extensible Authentication Protocol over LAN, 运行在局域网内的可拓展认证协议,为什么是可拓展呢?EAP协议是IEEE 802.1x认证机制的核心,它将实现细节交由附属的EAP Method协议完成,还记得这张图吗,EAP methods有好多种,但是EAP并不在链路建立阶段指定认证方法,而是把这个过程推迟到“认证”阶段,这样认证方就可以在得到更多的信息以后再决定使用什么认证方法。所以WPS是在完成关联以后才进行的认证协商。后面分析我们会知道,他们协商的结果是使用了EAP-WSC
方式,它是WSC规范利用EAP的扩展功能新定义的一种EAP算法。
M1:在确认了接下来使用的ID以后,Register会向Enrollee发送WSC_Start报文,告诉Enrollee可以开始信息认证交互了,这时Enrollee首先会发送M1报文给Register,下面来看看它给Register什么信息
UUID-E:代表STA的UUID
MAC Address代表STA的MAC地址
Enrollee Nonce:代表STA产生的一串随机数,它用于后续的密钥派生等工作
Public Key:STA和AP的密钥派生源头也是PMK,在WSC PIN法中并没有使用PSK(PIN码的作用不是PSK),双方采用了Diffie-Hellman[6](D-H)密钥交换算法。该算法使得通信的双方可以用这个方法确定对称密钥。注意,D-H算法只能用于密钥的交换,而不能进行消息的加密和解密。通信双方确定要用的密钥后,要使用其他对称密钥操作加密算法以加密和解密消息。Public Key属性包含了Enrollee的D-H Key值。
Authentication Type Flags和Encryption Type Flags:表示Enrollee支持的身份验证算法以及加密算法类型
Connection Type Flags:代表设备支持的802.11网络类型,值0x01代表ESS,值0x02代表IBSS
M2:如果register发送给Enrollee的M2包是通过out-of-band的方式发送的,那么register会将ConfigData在这个包里面发送出去。当使用out-of-band进行发送M2包时,ConfigData数据的加密方式是可选的,因为使用这种方式的前提是:预先假定这个通信过程是安全的,而且不会被偷听。然而,即使使用的是out-of-band的方式发送带有ConfigData数据的包,也强烈推荐对ConfigData进行KeyWrapKey加密。
在使用in-band的方式配置AP时,如果使用的是外部register,那么register需要在M7包中获取AP的当前配置信息,来决定是需要使用新的配置来覆盖AP的旧配置,还是保留AP的原有配置。比如router上有一个“keep existing wifi setting”的功能,如果把这个功能关闭,表示AP会进入未配置状态,当使用WPS进行连接的时候,会根据新的规则或无线客户端的信息来配置AP。
·Registrar Nonce:Registrar生成的随机数。
·Public Key:D-H算法中,Registrar一方的D-H Key值。
·Authenticator:由HMAC-SHA-256及AuthKey(详情见下文)算法得来一个256位的二进制串。注意,Authenticator属性只包含其中的前64位二进制内容。
提示 AP发送M2之前,会根据Enrollee Nonce、Enrollee MAC以及Registrar Nonce并通过D-H算法计算一个KDK(Key Derivation Key),KDK密钥用于其他三种Key派生,这三种Key分别用于加密RP协议中的一些属性的AuthKey(256位)、加密Nonce和ConfigData(即一些安全配置信息)的KeyWrapKey(128位)以及派生其他用途Key的EMSK(Extended MasterSession Key)。
M3:
·Registrar Nonce值来源于M2的Registrar Nonce属性
·E Hash1和E Hash2属性的计算比较复杂,根据WSC规范,E Hash1和E Hash2的计算过程如下
1)利用AuthKey和PIN码利用HMAC算法分别生成两个PSK。其中,PSK1由PIN码前半部分生成,PSK2由PIN码后半部分生成
2)利用AuthKey对两个新随机数128 Nonce进行加密,以得到E-S1和E-S2
3)利用HMAC算法及AuthenKey分别对(E-S1、PSK1、STA的D-H Key和AP的D-H Key)计算得到E Hash1; E Hash2则由E-S2、PSK2、STA的D-H Key和AP的D-H Key计算而来
·Authenticator是STA利用AuthKey(STA收到M2的Registrar Nonce后也将计算一个AuthKey)计算出来的一串二进制位。
M4:
·AP将计算R Hash1和R Hash2。其使用的PIN码为用户通过AP设置界面输入的PIN码。很显然,如果AP设置了错误PIN码的话,STA在比较R Hash 1/2和E Hash 1/2时就会发现二者不一致,从而可终止EAP-WSC流程。
·Encrypted Settings为AP利用KeyWrapKey加密R-S1得到的数据。
M5:
M6:
Encryped Settings为AP利用KeyWrapKey加密R-S2而来。
M7:
由M5、M6的内容可知,STA的M7将发送利用KeyWrapKey加密E-S2的信息给AP以进行验证,当AP确定M7消息正确无误后,它将发送M8消息,而M8将携带至关重要的安全配置信息.
M8:
安全配置信息保存在Encrypted Settings中,它由KeyWrapKey加密。WSC规范规定,当Enrollee为STA时(对Registrar来说,AP也是Enrollee),Encrypted Settings将包含若干属性,其中最重要的就是Credential属性集合,该属性集的内容如下(这里讨论的Enrollee是STA):
当STA收到M8并解密其中的Credential属性集合后,将得到AP的安全设置信息。很显然,如果不使用WSC,用户需要手动设置这些信息。使用了WSC后,这些信息将在M8中由AP发送给STA。
STA获取到这些信息以后,一般会保存起来并修改到wpa_supplicant.conf 文件中,后面STA就可以用这个配置文件正常的连接AP了
root:~/run# cat wpa_supplicant-ath11.conf ctrl_interface=/var/run/wpa_supplicant-ath11 config_methods=virtual_display virtual_push_button physical_push_button wps_cred_processing=2 update_config=1 uuid=87654321-9abc-def0-1234-001122334450 network={ scan_ssid=1 ssid="R8500-5G-2" key_mgmt=WPA-PSK proto=RSN psk="12345678" pairwise=CCMP group=CCMP TKIP }
接下来,STA就可以利用这些信息加入AP对应的目标无线网络了。
STA处理完M8消息后,将回复WSC_DONE消息给AP,表示自己已经成功处理M8消息。
·AP发送EAP-FAIL以及Deauthentication帧给STA。STA收到该帧后将取消和AP的关联。
·STA将重新扫描周围的无线网络。由于STA以及获取了AP的配置信息,所以它可以利用这些信息加入AP所在的无线网络。