802.11 linux内核管理层原理解析


请尊重原创版权,转载注明出处。

    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四次握手认证的过程。

figure1

    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 .

figure1

    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报文得到。

    具体流程如下:

figure1

关联

    函数为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。

参考:

    wifi破解

文档信息
--------------
* 版权声明:自由转载-非商用
* 转载: [802.11 linux内核管理层原理解析]

802.11 linux内核管理层原理解析