当前位置:   article > 正文

wifi 连接psk方式流程抓包_psk tkip协商流程报文分析抓包

psk tkip协商流程报文分析抓包

PSK 即是ap的密码,密码不足64位,则使用密码加ssid然后hash算出64字节的PSK

PMK使用PSK前32字节,256bit。

Anonce是ap的随机数, Snonce是sta的随机数,各32字节。

PTK = PMK + MAC(AP)+无线网卡MAC(STA)+AP产生的随即值(ANonce)+wifi产生的随机值(SNonce)+登陆密码(pairewise),SHA256和MD5算法得到的,而这种算法是不可逆的。

PTK ← PRF-X(PMK, “Pairwise key expansion”, Min(AA,SPA) || Max(AA,SPA) ||Min(ANonce,SNonce) || Max(ANonce,SNonce))

X = 256 + TK_bit 是生成的PTK的长度,参数X是256加上对应加密的TK位数,不同的加密方式TK_bits不一样,可查下表:

KCK ← L(PTK, 0, 128),它是PTK的前128bit(0-127),用于计算密钥生成消息的完整性校验值

KEK ← L(PTK, 128, 128),它是PTK的中间128bit(128–255),用来加密密钥生成消息

TK ← L(PTK, 256, TK_bits),它是PTK中256bit以后的所有位(256 — 255 + TK_bits),用来对数据包中的数据进行加密。从表中可看出,对于TKIP加密PTK的长度是512bit, 对于CCMP加密PTK的长度是384bit。

KCK和KEK将用于后续EAPOL Key帧中某些信息的加密。 TKIP TK和CCMP TK就是TKIP和CCMP算法中用到的密钥。

后面贴出一个示例,wep目前基本不用了,主要ccmp和tkip。

抓包:

auth req    open system, seq = 1


auth rsp    open system, seq = 2, status = 0(success)

assoc req

assoc rsp

eapol 1

这里第一个eapol报文的data应该是空的,我这里用的wifi芯片在第一个报文里填了个固定值,不确定有什么作用,看注释是为intel加的。

除此之外,第一个报文发送时携带了ap的Anonce。

eapol 2

sta收到ap的Anonce之后,加上自己输入的密码,已经具备了计算PTK的所有元素。

这里应该由wap_supplicant计算出来,对这里代码细节不熟悉,我后面贴出ap的计算代码。

sta计算完成后发出第二个eapol报文,报文中携带sta的Anonce和KCK计算的MIC值。

这个keydata好像是PMKID,不过我用的这款wifi里面没处理这个data。

eapol 3

AP收到第二个报文后会根据Snonce计算出对应的PTK,然后再用KCK算一遍MIC,比对一下,成功则继续。

PTK计算:

  1. static void CalcPTK(unsigned char *addr1, unsigned char *addr2,
  2. unsigned char *nonce1, unsigned char *nonce2,
  3. unsigned char * keyin, int keyinlen,
  4. unsigned char *keyout, int keyoutlen
  5. )
  6. {
  7. unsigned char data[2*ETHER_ADDRLEN+ 2*KEY_NONCE_LEN], tmpPTK[128];
  8. unsigned char keydata[32]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,
  9. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20 };
  10. unsigned char plainData[10]="abc";
  11. unsigned char **ptr;
  12. unsigned char encryptedData[32];
  13. if(MIN(addr1, addr2, ETHER_ADDRLEN)<=0)
  14. {
  15. memcpy(data, addr1, ETHER_ADDRLEN);
  16. memcpy(data + ETHER_ADDRLEN, addr2, ETHER_ADDRLEN);
  17. }else
  18. {
  19. memcpy(data, addr2, ETHER_ADDRLEN);
  20. memcpy(data + ETHER_ADDRLEN, addr1, ETHER_ADDRLEN);
  21. }
  22. if(MIN(nonce1, nonce2, KEY_NONCE_LEN)<=0)
  23. {
  24. memcpy(data + 2*ETHER_ADDRLEN, nonce1, KEY_NONCE_LEN);
  25. memcpy(data + 2*ETHER_ADDRLEN + KEY_NONCE_LEN, nonce2, KEY_NONCE_LEN);
  26. }else
  27. {
  28. memcpy(data + 2*ETHER_ADDRLEN, nonce2, KEY_NONCE_LEN);
  29. memcpy(data + 2*ETHER_ADDRLEN + KEY_NONCE_LEN, nonce1, KEY_NONCE_LEN);
  30. }
  31.         sha256_prf(keyin, keyinlen, (unsigned char*)PMK_EXPANSION_CONST, data, sizeof(data),tmpPTK, keyoutlen);
  32.         memcpy(keyout, tmpPTK, keyoutlen);
  33. }
  34.     
计算成功后,回复sta第三个eapol报文,携带MIC和group key,group key应该在data中。

eapol 4

sta进行验证之后安装PTK,GTK,并回复确认报文,之后ap也会安装PTK。

贴一个描述更详细的帖子

https://blog.csdn.net/lee244868149/article/details/52743302

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/724844
推荐阅读
相关标签
  

闽ICP备14008679号