Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

我校锐捷使用该V4算法,应该是丢失了许多信息,导致无法连接 #282

Closed
ShanQincheng opened this issue Sep 23, 2016 · 86 comments

Comments

@ShanQincheng
Copy link

ShanQincheng commented Sep 23, 2016

我用最初的源代码,网址https://code.google.com/archive/p/mentohust/source/default/source

加上你的V4算法,连接锐捷失败。查询锐捷记录日志发现丢失了很多认证信息。登录失败的原因是“用户不允许在该接入地区使用本服务”地区、服务、接入控制,ipv4等信息全部没有。我判断是其中一个信息(也许是地区信息)没有送到锐捷导致其他都为空。

而我在没有加入V4算法之前,用最初源代码编译出来的Mentohust连接锐捷,在日志中可以看到这些信息,登录失败的原因是“户端完整性被破坏,配置文件中未包含该客户端信息”。我判断是V2算法已经不适用于我们学校,传言我们学校已经是V4算法了。

我只修改了mystate.c文件,删除了void customizeServiceName(char* service)方法,把用到了checkV4.c文件中的方法全部替换为V4方法。

总的就是,我仔细对比了你的V4和最初的源代码,找到了你添加V4算法的位置,替换成了新的V4方法。然后删去了你添加的void customizeServiceName(char* service)方法。其他的所有文件,都是最初的源代码文件,并没有复制你的。

按照我的逻辑,最初的版本可以将我的接入信息发给锐捷,只是V2算法太低级了。应该换成V4就可以直接连上了。可惜换成V4后,提示V4认证,可惜认证失败。查询日志发现我的接入信息,地区、服务、接入控制,ipv4等信息都为空。

谢谢你的帮助。

@hyrathb
Copy link
Owner

hyrathb commented Sep 23, 2016

我这里使用的方法其实非常不恰当,是根据华科的数据包特点将v4认证信息强行插到了数据包的特定位置,这样就不用生成其他认证信息了。实际上这个数据包每个字段的位置是可以调整的,每个字段由开头几个字节的特征(似乎是标明类型和长度)加上实际内容组成,所以按我现在的方法将v4认证信息直接插到你们学校的数据包的那个位置可能会破坏其他认证信息,并且本身没有那几个字节的特征数据(我不确定v4认证信息有没有特征字节)。正确的做法是将我的两个认证函数生成的结果加上特征之后插入到某个已有的认证信息后面。

@hyrathb
Copy link
Owner

hyrathb commented Sep 23, 2016

还有,可以看到我的checkv4函数调用了两个数组,它们是我直接从我校客户端里提取出来的。内容看起来非常随便,可能不同学校会有区别。
最近我比较忙,此项目一直有重构的想法,如果你能搞定你的问题的话也请将解决方案反馈,提个PR,非常感谢。

@ShanQincheng
Copy link
Author

你好,能提供一下抓包的思路么。我不清楚如何分析我们学校的认证信息,我知道这个方法之后应该会顺利很多,谢谢

@hyrathb
Copy link
Owner

hyrathb commented Sep 24, 2016

v3之后的版本已经不太可能仅通过抓包来分析算法了。需要进行逆向。抓包大概只能用于验证自己逆向的结果是否正确。

@ShanQincheng
Copy link
Author

ShanQincheng commented Sep 24, 2016

你好,求一个你们华科的认证数据包。我发现你抓的是Linux下锐捷的认证数据包,而我们学校只有windows客户端。还有,你的mystate.c文件中定义了三个字符串,ptk1,ptk2,ptk3,其中包含了认证服务商的信息,比如包含了你们华科的internet。而我抓的windows下的锐捷认证包只有两段信息这种认证信息,没有三段。

@RocyHock
Copy link

集大的同学,能不能给个联系方式?我是你隔壁学校的。可是学的不是编程,只想要让自己路由器用上锐捷。没想到要用那么多专业知识。 。。。如果成功希望分享一下。。。

@RocyHock
Copy link

http://www.right.com.cn/forum/thread-194307-1-1.html 恩山无线论坛发了帖子,发现没人会,或者会的也不愿意分享。太商业垄断了。又无能为力

@RocyHock
Copy link

我的email:
bwrilao7799@gmail.com
希望给个联系方式私聊

@hyrathb
Copy link
Owner

hyrathb commented Sep 25, 2016

其实pkt1,2,3就是华科的认证中EAPOL流程客户端发出的三个数据包(start, response identity, response md5challenge),除了v4认证信息之外,各个学校可能会有不同的字段,这个真的很难通过抓包得到。

@ShanQincheng
Copy link
Author

我现在对比了你的数据包和我们学校的数据包,找到了服务商和用户ipv6地址的位置,替换成我们学校数据包中的数据。现在服务商和ipv6的信息,锐捷都能收到了,曾经收不到。现在就差一个用户ipv4的数据没有传上去了,找了很久ipv4的位置,没有找到。

@ShanQincheng
Copy link
Author

而且你抓包有三段数据,我们的只有两段

@hyrathb
Copy link
Owner

hyrathb commented Sep 26, 2016

恩是的,在使用dhcp时数据包中没有ipv4地址信息。

@etnperlong
Copy link

你好,作为一个爱好者以及学生我也希望可以一同研究。
email: etnperlong@gmail.com
希望可以一起私聊

@ShanQincheng
Copy link
Author

不好意思,再打扰一下。

请问你在mystate.c文件中,sendStartPacket(),sendIdentityPacket(),sendChallengePacket()三个方法中,return pcap_sendpacket(,,int)中最后一个参数数据包大小你是怎么确定的。我看到你这个参数有更改,和源码不一样。

我现在用WireShark抓到了start,identity,challage三个包,三个包的长度都不一样。我看你的代码和源码,pkStart,pkIdentity数组都是一样长,pkChallage这个数组要长一些。但我抓到的三个包是递增的,你是否对这三个数据包进行过某种处理,使它符合锐捷的EAPOL包格式。

谢谢。

@hyrathb
Copy link
Owner

hyrathb commented Sep 29, 2016

其实说起来很简单,就是因为每个学校每次认证时数据包长度总是固定的,所以我偷懒没有算,直接填的是抓包得到的每个包的长度。如果你想先出一个你的学校可以用的版本,也可以直接将抓包所得的包长度填进去。不过后面我还是想算出包的长度(就是头部长度和每个字段长度加起来)。

@ShanQincheng
Copy link
Author

你好,我自己的账号在本机认证成功,切换服务也没有问题。
但一用别人的账号在本机登陆,就提示非管理员指定的客户端,到网络中心查看认证失败日志显示的失败认证ipv4地址是我账号的ipv4地址,并不是控制台中提示的那个当前的认证ipv4,即别人账号的ipv4。

MAC是已经更换了的。

@ShanQincheng
Copy link
Author

ShanQincheng commented Oct 1, 2016

@hyrathb 我已经成功,并且也在路由器上实现锐捷认证。特别感谢你的V4算法,还有你对我的帮助。

我的实现方法分享在这里
http://www.codingstory.net/mo-gai-mentohust-v4ban-ben-de-xin-de/

@hyrathb
Copy link
Owner

hyrathb commented Oct 2, 2016

好的,谢谢分享,我十一也有点时间看看缺了什么。

@czkwg8
Copy link

czkwg8 commented Oct 3, 2016

请问诸位是如何算出那两个长度为1820和2035字节的数组的?
这两个长度恰好为锐捷提供的Linux版反破解文件的长度(事实上Mac 1.33版和Linux 1.31版的反破解文件相同)
hyrathb君的码里面提供的是1.01版
ShanQincheng君则是1.20版的
我提供1.31版的吧(如果你还是想自己提取,依然可以搜索字节2012102613440120,搜索到的第一段取长度1820,接着的第二段长度2035)
软件的版本号可以在uiChs.ini或uiEng.ini的2004这一行看到
https://mega.nz/#F!8NoB0Z4Z!LzAFqdxMc7JksYRPytuZUQ
(链接已更新,我很久没用mega了,不知道有密钥这样的东西)
另外我想我们还是沿用锐捷使用的算法版本名称吧,截至目前最新的Linux 1.31和Mac 1.33版本,使用的算法锐捷依然称之为V3算法。
另Windows直至5.20,都只有V2与V3算法,最新的6.43不太清楚,我手里还有适用于5.20版本的反破解文件,如有兴趣也可以来一发

@ShanQincheng
Copy link
Author

我现在弄的有点头大了,基础不够深现在碰上奇怪的问题无法解决。

我的账号服务器已经给我开了白名单,无论我用什么版本的Mentohust,只要包是符合规范的,管他什么的算法都给我认证上去。
而我的朋友,用我的方法,都会提示“请使用管理员指定的客户端”。我自己操作别人的账号也是同样的结果,抓了很多很多包,找不到问题所在。

但是现在我的朋友,在网络中心看失败日志都能看到各项认证参数了,说明包中的信息已经都给全了,而且服务器也收到认证请求了,只差 “客户端的问题”。

虽然我感觉是临门一脚,但是目前只有我一个人能上网,我心里虚的很...也请有思路的大神不吝赐教。

谢谢。

@ShanQincheng
Copy link
Author

@czkwg8 这个数组原理我是不懂的...不好意思。 @hyrathb 应该会给出答案。

@ShanQincheng
Copy link
Author

其实我现在发现有三种包都是可以认证的。

一种是Windows客户端的包,一种是Linux客户端的包,还有一种RPLink以及最初版的Mentohust发的包。

RPLink以及最初版的Mentohust发的包,每个包都是 0x3E8的长度。
Windows客户端的包每个长度不同,Start < Identity < Challenge
Linux客户端的包最短。

只要弄懂以上三种包的一种,构造出来,发给服务器,就能认证。
但是我就是不懂 “客户端校验“的位置在哪里,均有认证信息,只差客户端认证。

@czkwg8
Copy link

czkwg8 commented Oct 3, 2016

@ShanQincheng 我也是前两天才知道有白名单这样的东西
我们宿舍的一个小哥之前投诉Mac版客户端没法用被加到白名单里面去了
这么说来你没成功么。。
我还在改源码呢
如果实在不行我建议对Mac版客户端逆向吧,OC写的东西所有函数名都看的一清二楚
这帮逼怎么就没勇气用C#写一个?

另外我想那个1000的长度,是当初的mentuhust写的时候随意定的吧,1000个字节肯定放得下,而rp-link实际上是从mentohust改的,这个1000字节就不要纠结了,如果真的想做个100%接近的客户端,不应该使用这个长度

@ShanQincheng
Copy link
Author

现在我都真不知道自己是成功还是没成功了....按理来说我是成功的,但是别人上不了,我又是没成功的。简直无奈

@ShanQincheng
Copy link
Author

但是RPLink既然能用,说明除了白名单肯定有方法认证。只是包中某个细节没搞清楚

@czkwg8
Copy link

czkwg8 commented Oct 3, 2016

RP-Link还能用啊,这么幸福
集美的环境需要抓包么?
好像rp-link根本没有重新做抓包工具,真的能正确的取Windows 4.74版的数据?
V3用的数据在4.7版本换过了啊

PS:并非我想的那样,他们修正了抓包工具

@hyrathb
Copy link
Owner

hyrathb commented Oct 4, 2016

这两个数组是我在逆向Linux版客户端时追踪到的。
如果提示客户端版本不对,应该就是checkV4里的两个函数计算结果不对。
这个可以验证,拿computeV4来说,你拿官方客户端抓面对md5 challenge的request和response包,然后把request的EAP-MD5值(第18个字节开始)丢给computeV4函数算一个结果出来和官方的response里那一串可见字符比一下就好了。

@czkwg8
Copy link

czkwg8 commented Oct 4, 2016

@hyrathb 我直接从你的源码里面改了那两个长数组以及3个ptk的数组
结果是无限卡在发送用户名上
抓了下包,是无限重试identity,包和Linux 1.31版的差别是末尾少了3个字节
是不是之前在哪里定义了数据包的截断位置?

ps:修正发包长度并不起作用
pps:发现了之前加的参数--service如果服务名是中文的并不能产生正确的结果,但是如果我在源码中修正服务名的话失败的提示居然是MAC地址被修改

@ShanQincheng
Copy link
Author

@czkwg8 直接在源码改服务名。MAC那个,你在虚拟机里面改一下连接信息中的MAC地址,改成你认证时用的MAC。这种情况说明你们学校还对MAC地址有限制

@czkwg8
Copy link

czkwg8 commented Oct 4, 2016

@ShanQincheng 是的的确是有MAC限制
我统计过了,我校应该开启了所有的保护措施
可问题就是我的Linux系统。。。并不是在虚拟机里面运行的

@updateing
Copy link
Contributor

  1. 心跳问题方面,我记得之前有人提到过echoNo不应该从0开始。此外,心跳间隔也可能会有影响。可抓包比对。
  2. IP等信息在锐捷私有数据的前面数十个字节内,经过了颠倒取反的处理。可参考这里的实现

@yjcn
Copy link

yjcn commented Nov 20, 2016

1、官方Linux客户端心跳是20秒一次,我试着把mentohust的心跳分别设置为10秒、20秒,发现这两个结果是一样的,都是7分钟左右系统会检测到心跳超时,可能就是心跳包格式不对
2、确实官方客户端采用了二次认证,第二次认证的MD5-ChallengePacket中有一段与第一次的不同,应该就是把IP信息进行了处理

@hezhuowei
Copy link

我现在用的是 @updateing 的minieap,现在也发现了类似 @ShanQincheng的问题,截图右边是学校官方的包,对比minieap的包发现官方多了一段数据(地址0X17,长度固定0X20),并且这段数据也是每次抓包不断变化的,估计这也是 @ShanQincheng 魔改的mentohust只能自己用的原因 2016-11-25 13-21-25

我们学校还算好,锐捷版本低可以用猎豹wifi,而且校内wifi覆盖,不过就是没linux客户端。
据我所知,身边很多学校都有卖那些两百多路由器的,我也想减少这种事情发生。
现在我在linux上认证主要是靠虚拟机,理论上也适用于高版本锐捷在windows下开wifi,没什么技术含量,就是虚拟机比较耗资源。如果有同学需要,我可以另外写教程出来解燃眉之急。

@hezhuowei
Copy link

另外也发现我的dns数据是跟在锐捷版本号的后面,上面的截图对比能看出。
现在猜测是不是每个学校的锐捷数据包的结构顺序都不一样。
另外猜想就是能不能抓官方的包,然后只修改里面的v4校验值再发出去,也就mentohust只负责改包,不负责重新构建一个包,这样的话应该更容易适配每个学校。(还没认真看checkV4.c,如果不可行就当我胡扯就行了:-P )

@updateing
Copy link
Contributor

updateing commented Nov 25, 2016

MentoHUST现在就是用改包的方式工作的,不过没有提供修改模板的选项。同时,IPv6地址和硬盘序列号这类字段也不支持修改。

字段顺序并不清楚是否影响认证结果,这里无法验证。

如果用模板的话,0x17这个字段也就定死了不能改变。可以在minieap里用--rj-option添加这个字段看能否起作用。

@factoid233
Copy link

factoid233 commented Nov 30, 2016 via email

@ShanQincheng
Copy link
Author

@hezhuowei 是的,这一段是关键,我觉得也是我的魔改代码无法通用的原因。这一段是 V4 算法算出来的一段,连不上说明算错了,每一次请求的值都不一样。但长度一样,位置一样。

@ShanQincheng
Copy link
Author

@hezhuowei 其实从M. 那个位置到后面很长的一段,也是一直在变的。但是我们学校,可以固定死数据,服务端似乎不验证这一段。我当时也在猜,服务端只对某一部分效验,其他的忽略。

@hezhuowei
Copy link

@updateing 现在发现,0x17字段在锐捷linux版是没有的,只出现在windows版。不排除这两个平台版本的校验方法不一样。

@hezhuowei
Copy link

@ShanQincheng 另外一个问题就是如何从官方的锐捷linux客户端提取array[1820],array_1[2035]这两个数组。

@hyrathb
Copy link
Owner

hyrathb commented Dec 7, 2016

@hezhuowei 你可以看看Linux客户端符号表在不在,如果在的话,那很有可能就有两个数组appdata和dlldata,就是这俩。

@ShanQincheng
Copy link
Author

@hezhuowei

这两个数组里面的数据,是从 Linux 版本的锐捷一个文件里面用 WinHex 工具提取出来的,每个学校也不一样。可以看看我的两个数组,再看看别的学校 Mentohust 版本里这两个数组,找一找里面相同的一段,然后去 WinHex 里面查询出来。我建议先看看我的数组和别的学校的数组的头尾是否相同,相同的话就查找对应的一段16进制数据,截取对应长度的16进制代码,复制为 C 数组的形式。

拿我的第一个数组,array[1820]举例。该数组开头为, 0x36,0xE0,0x04,0x08,0x46,0xE0 ..... 用 WinHex 打开 Linux 锐捷中, x32 文件下 rjsupplicant 文件,搜索这一段 16 进制 36E0040846E0

——————————————————————————————————————————————

具体的图片,这里有,在文章后半部分
http://www.codingstory.com.cn/mo-gai-mentohust-v4ban-ben-de-xin-de/

@wallproxy
Copy link
Contributor

wallproxy commented Dec 18, 2016

很高兴见到这个全局变量满天飞堪称黑历史的项目还有人在跟进。
粗看了下@hyrathb 的checkV4.c文件,和mentohust 0.3.4的V3貌似差不多,所以同意@czkwg8 仍是V3的说法,至于0.3.4失效的原因,可能是用来校验的数据提取方法不适用了或某些地方填充有误吧,原V3由kkHAIKE提供,我没怎么看过,毕业后就更没必要看了,所以对于后来的失效无力改进。
由于无法理解请求包里的所有字段,所以mentohust的思路是抓包然后去修改校验字段,V3的校验字段是通过8021x.exe、W32N55.dll、SuConfig.dat这3个文件计算的,抓包工具也有整合前2个文件的内容,从文件名就可以知道这个是只适用32位的,所以失效可能与此有关。
虽然很多地方0.3.4也已经失效了,但应该还是有一定参考意义的,楼上几位如果需要0.3.4源码的话,可用hust.edu.cn邮箱联系www.ehust[at]gmail.com获取源码,至于拿到源码后是否开源,你们自己决定哈,如果开源后引起麻烦也请自己承担。
PS: 鄙视拿这个去卖钱的行为。

@ShanQincheng
Copy link
Author

哈哈炸出原作者了么

@updateing
Copy link
Contributor

@hezhuowei 关于 0x17 字段,我发现 MentoHUST 本来是支持的。这一段逻辑在 v4 中并没有走到……

@shanzhaozhen
Copy link

@ShanQincheng 请问你现在修改的代码编译后可以让其他同学也认证成功吗,我跟着你的做法做了一遍,自己成功认证了,但是在其他同学的端口认证失败,提示物理mac地址已被修改。有解决办法或思路吗

@ShanQincheng
Copy link
Author

ShanQincheng commented Sep 8, 2017

抓包分析,看看你认证时,和你朋友认证时,认证数据包中MAC地址是不是一样的。

根据提示消息,我猜想是,mentohust中把正在进行认证的电脑的MAC地址自动填充到认证数据包里的那段代码失效了,导致你和你同学认证时都用的是你电脑的MAC地址( 代码没有修改复制粘贴过去的认证数据包的MAC地址数据 ,有的学校锐捷认证是账号与MAC地址绑定的 )。

myconfig.c 文件中有 MAC 地址填充到数据包的代码,你可以去看看代码逻辑,然后修改。优雅的做法是修改代码自动获取本机MAC地址然后填充,暴力的做法是,直接将填充的那段字符串写成想要的MAC地址。( 这样做的话,每个MAC地址都得重新编译一份 )

@shanzhaozhen

@shanzhaozhen
Copy link

@ShanQincheng 明白,现在解决好物理MAC地址的问题了。
但是现在又出现了另外一个问题,ipv4冲突,你使用的ipv4地址已有用户在使用中。
我想是因为我抓的包里面包含了我的ip地址,直接把我的ip也发送过去了,现在我编译出来的程序只能一个人在线,应该怎样子才可以获取服务器给我们分配的ip地址呢
@updateing

@updateing
Copy link
Contributor

@shanzhaozhen MiniEAP 支持全部已知字段的填充,包括 IP 和 MAC 在内(目前 IP 填充仅限于二次认证时后面一次的填充,静态地址还没有处理)。如果是二次认证的话直接能用,静态地址的话可以尝试改一下。

所有字段填充相关的逻辑都在这里

@shanzhaozhen
Copy link

shanzhaozhen commented Sep 8, 2017

@updateing 感谢!
我学校就是使用两次认证的,我觉得对我帮助会很大。
但是今天我抓包查找包里面是否存在ip地址,并没有发现
锐捷成功认证的过程中会发送两组包,第二组包跟第一组包基本一直,只是在账号后面的一组数据,这是密码吗?
两组数据我查找不到我的16进制的ipv4地址,我获取到ip是在发送完第一组包之后获取的,感觉跟第二组包没多大联系
现在我使用第一组包来修改代码可以自动获取服务器返回的ip了

认证成功后内网都可以直接打开,但是不能访问外网,因为我学校还有一个网页认证,我想是因为DNS解析不了,又是一个新问题,揪心

@shanzhaozhen
Copy link

@updateing 我使用这个方法已经可以在学校内都认证成功了,可以直接上校园内网,但是部分测试却不能上外网,看了一下可以的人主要是跟我住同一栋宿舍的。之后找其他宿舍的同学抓包分析一下发现有一个地方不一样,请问这个地方是一些什么参数呢?
_20170914172023

@updateing
Copy link
Contributor

看起来是第二 DNS 的地址。

在 Windows 下认证时,有没有“内网”“外网”之类两种服务的选择?

@shanzhaozhen
Copy link

@updateing 在windows下会多一组在linux不存在的参数,直接使用windows的包会出现版本检验的问题,而且windows下至发一次start包,其他都是两次。
我发现linux抓包的长度并不是固定的,主要影响的长度位置主要是我上面哪个图指出的红色地方,好奇怪啊,如果是dns应该也是占用4位,应该不会影响长度才对啊

@shanzhaozhen
Copy link

shanzhaozhen commented Sep 15, 2017

在win下也是internet
1505451250 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests