net\mac80211\mlme.c MAC层管理实体。
本文不涉及具体协议帧格式,具体的协议帧可以参考本博客802.11 MAC层帧解析。
扫描sacn
AP的频率是特定的,因此STA需要切换channel来切到AP的频率。
内核中,可以调用ieee80211_channel_to_frequency(net/wireless/util.c) 实现频道和频率的转换。
- 被动扫描
STA在信道之间进行切换,等待AP的beacon信号解析。
- 主动扫描
STA同样在信道之间进行切换,但同时也会发送Probe Request(调用ieee80211_send_probe_req() 实现),这里的信道包含1-13。
扫描函数为 ieee80211_request_scan(net/mac80211/scan.c)。
切换信道函数为 ieee80211_hw_config(net/mac80211/main.c), 第二个参数为IEEE80211_CONF_CHANGE_CHANNEL。
身份认证
接口函数ieee80211_send_auth (net/mac80211/util.c)
内核定义了四种认证方式:
/* Authentication algorithms */
#define WLAN_AUTH_OPEN 0
#define WLAN_AUTH_SHARED_KEY 1
#define WLAN_AUTH_FT 2
#define WLAN_AUTH_SAE 3
#define WLAN_AUTH_LEAP 128
WLAN_AUTH_OPEN 实际就是不用密码认证的意思。
WLAN_AUTH_SHARED_KEY 共享密钥认证,客户端必须使用WEP、WPA等方式进行身份认证。
其他两项,暂未研究
主要分析下WLAN_AUTH_SHARED_KEY ,这里包含三种类型:
- WEP
- WPA/WPA2-PSK(预共享密钥)
- WPA/WPA2 802.1 (radius认证)
WPA-PSK认证过程
主要分析EAPOL四次握手认证的过程。
AP生成32字节的随机数ANonce;
STA收到ANonce后,也产生随机数SNonce。 根据ANonce、SNonce、登录密码计算出PTK,公式如下:
- PMK = PBKDF2(HMAC−SHA1, pwd, ssid, 4096, 256)
在计算中,PBKDF2会被执行4096*2轮,另外,这里同时使用SSID(0-32) 字符进行了salt(因此难以彩虹表预算)
- PTK = PRF-512(PMK, “Pairwise key expansion”, Min(AP_Mac, Sta_Mac) ||Max(AP_Mac, Sta_Mac) || Min(ANonce, SNonce) || Max(ANonce, SNonce))
PTK使用PRF-512(pseudo random functions 512bits)算法产生, 通过PMK、固定字符串、AP_Mac、Sta_Mac、ANonce、SNonce六个输入参数得到一个64字节PTK .
WPA1 TKIP的PTK长度512bits,WPA2 CCMP的PTK长度为384bits,
其中KCK用来计算WPA EAPOL KEY消息的MIC;AP使用KEK加密WPA
EAPOL KEY消息的额外Key Data数据;TEK用于单播数据加密。
WPA破解最关键的部分就是通过KCK计算MIC,其算法如下:
WAP MIC = HMAC(EVP_sha1(), KCK
, 16, eapol_data,eapol_size)
WAP2 MIC = HMAC(EVP_md5(), KCK
, 16, eapol_data,eapol_size)
破解原理
破解时,使用字典的PSK+ssid生成PMK。
再利用抓取到STA的MAC,AP的BSSID,ANONCE,SNONCE、PMK计算PTK。
然后,加上原始的报文数据算出MIC,并与AP发送的MIC比较。如果一致, 那么字典中的PSK就是密钥。
这里的MIC由PTK的KCK,计算两次EAPOL报文得到。
具体流程如下:
关联
函数为ieee80211_send_assoc (net/mac80211/mlme.c),这是个static函数。 用来发送Association Request
重新关联
函数为ieee80211_send_assoc(net/mac80211/mlme.c), 与关联函数相同,但传的参数不同。
在ESS系统中,STA需要在不同AP之间进行切换。这个时候,STA需要向新的ap发送 Reassociation Request,进行重新关联。
如果关联ok,AP向STA发回一个AID。
参考: