WiFi认证已经第三弹了。LEAP是企业版WiFi常用的认证方式,是EAP的一种,而且没有正式的协议。但是LEAP就像WEP一样不是很安全,ASLEAP就是一个攻击工具。LEAP基本要被PEAP代替。本来是想直接实验PEAP的,没想到我的系统默认用的是LEAP,索性就从简单的开始。

由上图可以看出LEAP的基本认证过程。认证服务器RADIUS通过AP发送给用户一个Challenge,就是一个随机字符串。用户使用特定算法(密码+MD4+DES)处理字符串,返回给RADIUS。同时用户也要对该RADIUS进行认证,步骤相同,但是加密算法不同。
Wireshark分析
通过Wireshark分析我的认证过程。(请不要尝试破解我的密码。。。如果你需要测试,可以联系我)。截图中显示前两步,一个是PC,8 bytes,一个是PR 24bytes。而且Cisco也提醒我这个协议是不安全的,牛!所以有了PC和PR之后就可以开始测试了。
查看LEAP协议,有以下约定:
- PC是RADIUS发送给用户的Challenge
- PR是用户发送给RADIUS的Response
- APC是用户发送给RADIUS的Challenge
- APR是RADIUS发送给用户的Response
那么根据协议,得出:
1 2 3 4 | NtPW = NtPasswordHash(Unicode(PW)) //16 bytes PR = ChallengeResponse(PC, NtPW) //24 bytes MPPEHASH = NtPasswordHash(NtPW) //16 bytes APR = ChallengeResponse(APC, MPPEHASH)//24 bytes |
我去,NtPasswordHash是个什么?搞了半天,这是Microsoft PPP CHAP Extensions,还有Version2.我看着蛋碎,其实就两句话。还有MPPEHASH,原理一样。
1 2 3 4 5 6 7 8 9 | NtPW: phash = MD4.new() phash.update(unicode(password).encode("utf-16le")) NtPW = phash.digest() MPPEHASH: phash = MD4.new() phash.update(NtPW) MPPEHASH = phash.digest() |
然后Challenge的构造是使用DES加密算法。因为出来的NtPW和MPPEHASH都是要补成21字节长,然后分成3段,分别使用这3段作为密钥加密Challenge,然后合并后产生24 bytes的Response。坑爹的是21/3 = 7 bytes。DES要8 bytes密钥,所以首先要扩展密钥。这实在说不清,而且补的那位是奇偶校验位,大多数时候被忽略,看代码。
1 2 3 4 5 6 7 8 9 10 11 | def ChallengeResponse(challenge, NTHash): """ Return Challenge Response""" key1 = expand_key(NTHash[0:7]) key2 = expand_key(NTHash[7:14]) key3 = expand_key(NTHash[14:16]+"\x00"*5) cr1 = (DES.new(key1, DES.MODE_ECB)).encrypt(challenge) cr2 = (DES.new(key2, DES.MODE_ECB)).encrypt(challenge) cr3 = (DES.new(key3, DES.MODE_ECB)).encrypt(challenge) return (cr1 + cr2 + cr3) |
完整代码和实验数据见github,我的测试结果就不放了。不要告诉我到这份上了,还不知道怎么破解LEAP密码。关于无线还有两部分,一个是PEAP,一个是Reaver。
链接: