hyrathb/mentohust

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

ShanQincheng opened this issue · 86 comments

我用最初的源代码,网址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等信息都为空。

谢谢你的帮助。

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

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

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

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

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

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

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

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

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

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

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

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

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

不好意思,再打扰一下。

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

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

谢谢。

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

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

MAC是已经更换了的。

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

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

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

请问诸位是如何算出那两个长度为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版本的反破解文件,如有兴趣也可以来一发

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

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

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

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

谢谢。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@czkwg8 数据包是由一个一个的字段拼成的,基本上认证用到的字段开头都有写长度。

@hyrathb 已经修正长度,但是神奇的是无限identity
如果使用你的源码里面提供的数据则可以通过identity,但又有其他的错误

@czkwg8 你这个情况就是包格式或者长度有点问题了,信息填充对的话是会给你全部都认证一遍的。Linux也有修改网络地址的命令,百度一下就行了。和Windows里面目的是一样的,骗一下锐捷,没别的了。

你得把你们学校的包各个信息位置完全弄懂,你才能制作正确的包。看代码,看别人的位置,自己猜一猜,都是弄清信息位置的办法

@czkwg8 无限identity说明服务端无法解析这个包。service的问题我认为是编码不对,linux默认utf8了,似乎服务端是gbk(不确定)。

@ShanQincheng 一切皆有可能,我去重新看看数据有没有搞错吧
MAC地址是正确的,但是报了被修改的错误

@hyrathb 编码问题如你所想,服务端使用的确实是gbk

如果要在--service中使用中文的话,还是抓到GBK格式的服务名然后用"\x**\x**"的转义序列做参数比较好。根据之前其他fork的情况来看,确实存在服务端GBK而Linux是UTF-8的情况。编码问题也在这里提过。

@updateing 使用转义序列似乎并不可行
Tested on Ubuntu 16.04

@czkwg8 刚才试验了一下,用下面这种办法可以在发出的包中得到正确的服务名。

SERVICE=`echo -ne "\xbd\xcc\xd3\xfd\xcd\xf8\xbd\xd3\xc8\xeb"`
mentohust --service $SERVICE

对shell的理解不深,造成困扰,很抱歉……

更改:最好用-ne选项。

@ShanQincheng 今天我这边也完工了,原来是数据包里面hash的位置不正确
另外我发现了数据包出了头部有mac之外还有另一个地方也有本机的mac
可能这个是你之前说只有自己能用的原因吧
正在考虑把这里也改好

@czkwg8 这个包结构我基本都搞清楚了。只有我自己能用,我几乎确定是V4算法算出来的校验值不对。我的朋友拿官方客户端和V4函数算出来的结果进行比对,不能匹配。所以我认为我提取的V4数组不正确。我们学校的Linux版本锐捷是不能使用的,所以从Linux版本中提取出来的V4数组应该也是不正确的。可惜没法找到Windows下提取这两段长数组的办法。

@ShanQincheng 这样子。。。
最简单的办法应该还是去网络中心跟他们说Linux客户端没法用吧,然后他们会将对应的防破解文件导进去
Windows客户端的数据我也有,但是可能算法不一样,因为我看到的结果是分x86和x64的数据,而且大小差距太大了(Linux是两个2kb左右的,但是Windows却是一个2M的和一个几b的)

@czkwg8 什么是把防破解的文件导进去?我不太懂。我是给网络中心打过一个电话的,然后我的账号现在就成了神号。我现在用什么版本的Mentohust都可以认证成功,只要发的包格式和长度是对的,就给我认证。根本就不校验我的客户端完整性了。

@ShanQincheng http://www.ruijie.com.cn/fw/wt/19306
你可以看看这篇文章,里面简单的说明了防破解的设置
可能他们不知道Linux版本要另外导入防破解数据吧
我拿到了一个内部泄露的客户端生成器,分析过后得出了一些结论(也得到了所有的防破解文件)
所有学校的客户端,只要版本号相同,不同的地方只有图标和程序名称
现在防破解的原理我猜应该是双向计算校验值来比对罢了,不开启则不比较hash

@czkwg8 那我们学校可以针对账号进行校验。其实网络中心那个业务员也没跟我说清楚,就说下午会跟老师反映一下这个情况,之后就没有消息了。现在我改一下本地ip,也可以联网,就相当于我在学校任何地方都可以上网了,别的人都会提示绑定的ip地址不正确。

我的账号现在已经成了神号,没有研究价值了。这次弄了这么久,只有我一个人可以上网还是有很强的挫败感的。应该就差一个校验值了,这个我的能力不够,逆向完全不会,搞不定了。

@ShanQincheng 其实白名单的这个功能,服务端是有的,但是从来没有公开过
事实上RP-link的那个程序,早已经被人从固件里面分离出来过了,而且是可以使用的,我帮你找找看吧,但是应该只有mipsel的

@czkwg8 那个RP-link的是V3吧?
有没可能反编译?

@sequencer 不曾试过逆向mipsel的程序,没什么把握
如我所说,实际上并没有V4

@czkwg8 rplink应该是市面上除了mentohust最后一个版本之外的唯一一个V3吧。
hyr已经弄出v4算法,其他学校的同学估计也比较需求V3。
或者还是反编译linux下的?
我们学校已经没有V3的测试环境了。

@sequencer 就如我之前提到的,直至Windows版本5.20,Linux版本1.31,Mac版本1.33,锐捷方面不曾提过V4的概念,hyr是反向Linux客户端得到算法的,所以我认为实际上是V3算法
现在的这个项目,只要学校能使用Linux版的客户端,就一定有办法成功认证(若不能就应该做不到)
所以我认为RP-Link所提到的V4,无非是一个噱头,因为在开启了所有保护措施的4.99和6.43版本下,RP-Link所提供的认证程序根本过不了客户端检验

如果要绝对意义的适配所有的客户端,还需要反一下Windows的客户端

根据上面讨论的内容,我写了一个提取数据包中每个字段的工具: https://github.com/HamsterReserved/misc_scripts/blob/master/rj_property_reader.c . 可将Wireshark导出的一个数据包作为参数传入。

根据提取结果,我发现有这些字段在我校的Linux版客户端中出现(注释是我自己加的,程序中不包含。部分内容太长省略,有隐去的地方也都标明了):

# DHCP开关
INFO: A valid header found at 0xa0
INFO:   header->magic = 0x1a
    header->header_type = 0x0c
    header->magic_2 = 00 00 13 11 
    header->type = 0x18
    header->len = 0x06 (including type and len, actual size = 0x04)
    content(hex) =
00 00 00 01 
    content(ASCII) =

# 本机MAC
INFO: A valid header found at 0xac
INFO:   header->magic = 0x1a
    header->header_type = 0x0e
    header->magic_2 = 00 00 13 11 
    header->type = 0x2d
    header->len = 0x08 (including type and len, actual size = 0x06)
    content(hex) =
00 00 00 00 00 00 
    content(ASCII) =

# 未知
INFO: A valid header found at 0xba
INFO:   header->magic = 0x1a
    header->header_type = 0x18
    header->magic_2 = 00 00 13 11 
    header->type = 0x2f
    header->len = 0x12 (including type and len, actual size = 0x10)
    content(hex) =
dc 5c 1f 4e fe fc 40 39 2b 36 90 68 22 2d d2 6d 
    content(ASCII) =
�\�N��@9+6�h"-�m

# 本机IPv4 ASCII表示(隐去)
INFO: A valid header found at 0xd2
INFO:   header->magic = 0x1a
    header->header_type = 0x16
    header->magic_2 = 00 00 13 11 
    header->type = 0x76
    header->len = 0x10 (including type and len, actual size = 0x0e)
    content(hex) =
32 30 00 00 00 00 00 00 00 00 00 00 00 00 
    content(ASCII) =
20……

# 未知
INFO: A valid header found at 0xe8
INFO:   header->magic = 0x1a
    header->header_type = 0x09
    header->magic_2 = 00 00 13 11 
    header->type = 0x35
    header->len = 0x03 (including type and len, actual size = 0x01)
    content(hex) =
01 
    content(ASCII) =
�
# 未知
INFO: A valid header found at 0xf1
INFO:   header->magic = 0x1a
    header->header_type = 0x18
    header->magic_2 = 00 00 13 11 
    header->type = 0x36
    header->len = 0x12 (including type and len, actual size = 0x10)
    content(hex) =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    content(ASCII) =

# 本地链路IPv6,十六进制表示,不知在认证成功后是否会变成Global scope的IPv6(隐去)
INFO: A valid header found at 0x109
INFO:   header->magic = 0x1a
    header->header_type = 0x18
    header->magic_2 = 00 00 13 11 
    header->type = 0x38
    header->len = 0x12 (including type and len, actual size = 0x10)
    content(hex) =
fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    content(ASCII) =
��

# 未知
INFO: A valid header found at 0x121
INFO:   header->magic = 0x1a
    header->header_type = 0x18
    header->magic_2 = 00 00 13 11 
    header->type = 0x4e
    header->len = 0x12 (including type and len, actual size = 0x10)
    content(hex) =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    content(ASCII) =

# V3校验码
INFO: A valid header found at 0x139
INFO:   header->magic = 0x1a
    header->header_type = 0x88
    header->magic_2 = 00 00 13 11 
    header->type = 0x4d
    header->len = 0x82 (including type and len, actual size = 0x80)
    content(hex) =
省略
    content(ASCII) =
省略

# 服务名
INFO: A valid header found at 0x1c1
INFO:   header->magic = 0x1a
    header->header_type = 0x28
    header->magic_2 = 00 00 13 11 
    header->type = 0x39
    header->len = 0x22 (including type and len, actual size = 0x20)
    content(hex) =
69 6e 74 65 72 6e 65 74 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    content(ASCII) =
internet

# 硬盘序列号(隐去)
INFO: A valid header found at 0x1e9
INFO:   header->magic = 0x1a
    header->header_type = 0x48
    header->magic_2 = 00 00 13 11 
    header->type = 0x54
    header->len = 0x42 (including type and len, actual size = 0x40)
    content(hex) =
54 46 36 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    content(ASCII) =
TF6……

# 未知
INFO: A valid header found at 0x231
INFO:   header->magic = 0x1a
    header->header_type = 0x08
    header->magic_2 = 00 00 13 11 
    header->type = 0x55
    header->len = 0x02 (including type and len, actual size = 0x00)
    content(hex) =

    content(ASCII) =


# 未知
INFO: A valid header found at 0x239
INFO:   header->magic = 0x1a
    header->header_type = 0x09
    header->magic_2 = 00 00 13 11 
    header->type = 0x62
    header->len = 0x03 (including type and len, actual size = 0x01)
    content(hex) =
00 
    content(ASCII) =

# 未知
INFO: A valid header found at 0x242
INFO:   header->magic = 0x1a
    header->header_type = 0x09
    header->magic_2 = 00 00 13 11 
    header->type = 0x70
    header->len = 0x03 (including type and len, actual size = 0x01)
    content(hex) =
40 
    content(ASCII) =
@

# 客户端版本字符串
INFO: A valid header found at 0x24b
INFO:   header->magic = 0x1a
    header->header_type = 0x1d
    header->magic_2 = 00 00 13 11 
    header->type = 0x6f
    header->len = 0x17 (including type and len, actual size = 0x15)
    content(hex) =
52 47 2d 53 55 20 46 6f 72 20 4c 69 6e 75 78 20 
56 31 2e 30 00 
    content(ASCII) =
RG-SU For Linux V1.0


有一些字段是之前从未提及到的,如硬盘序列号、本地链路IPv6地址等。结合之前在锐捷网站上看到的能够设置的检测字段 (可能已经很不完整了),也许能发现其他需要注意的地方……

其实说到底就是项目还是需要重构一下。。。大部分重要部分的算法都在,只是拼的时候出了不少问题。

@updateing 我好像记得你曾经有提到过你写好了V3算法,不知道是针对windows版本逆向出来的吗?
昨天试了一下,mentohust提供的0.3.4版本算出来的hash已经是不正确的了(对于Windows 4.7以上的版本来说)

@czkwg8 并不是,只是靠工具辅助凑出了MentoHUST 0.3.4的V3验证代码而已……

image

这个是rp-link路由器的认证日志,请问这个锐捷是什么算法的呢?

@RainbowStar 这可能是个混合版本,看日志里面有些不属于本项目的功能,算法的版本也就无法保证。看一下mentohust -h里面有哪些选项?

image
image
不好意思,看不太懂就全部截图了,麻烦帮忙看看

学校的路由器太坑了,听说学校有人破解了,但是卖得只比网上便宜了一点点。我想把这个破解了公开,造福学弟学妹。我们的锐捷版本是V4.96,我这里有抓的包和需要的一些东西,我按照rp-link的安装指南把路由器设置好了,现在我这里有个华为hg255d的路由器和一个ar9331的路由器,现在就是需要算法,希望能在这里得到一点帮助。

看起来这个版本改了不少。如果有人会MIPS逆向的话,也许能试试……

这个是RPLink改的认证程序嘛,都搞成大集合了
不知道有没有对高版本的锐捷进行适配,如果目的是破解这个程序让它可以在其他路由器上运行,应该比较难(花费的时间可能不如自己去逆向Windows客户端),我记得最新的RPLink,是每台路由器绑定的,发货给你之前重新编译一下,程序里面有Flash的ID(类似的东西)验证,换到别的路由上是没法运行的

既然有人做出别的认证程序,那就要看你们学校到底开启了什么样的保护措施了,如果不是太狠,那么利用现有的东西,搞起来也不会太难

根据上面讨论的结果,我重新写了个802.1x的认证客户端,代码在这里

注:这个客户端设计之初并不针对锐捷,而是尽量实现标准的802.1x MD5-Challenge算法,然后允许插件来对标准算法生成的数据包进行修改。所以锐捷是以plugin的形式存在的,运行时需要添加--module rjv3 参数。

其他方面的特性有:

  1. 网络帧收发部分(if_impl)是插件形式,可以根据情况编写不同的插件。代码里实现了一个基于RAW Socket的插件,不必再链接到libpcap。要注意的是,同一时刻只能启用一个帧收发插件。
  2. 非标准数据包的修改代码(packet_plugin)也是插件形式的,但一次可以启用多个这类插件,程序会让标准算法生成的数据包依次流经这些插件,从而在不修改核心代码(packet_buildereap_state_machine)的情况下能够支持更多功能。代码里现在实现了一个适配RJv3的插件和一个作为插件演示的打印数据包长度的插件。
  3. 所有的数据包读写操作都是通过structenum实现的,每一个读写操作的目标与数值都有明确的名称,如frame.header->eap_hdr.code[0] = IDENTITY,再也没有MentoHUST里漫山遍野的magic number了……有个别地方实在解析不了,没有办法用struct表现,也是加了注释的。
  4. RJ数据包生成操作完全抛弃了模板,都是一条一条prop(erty)生成、加入列表,然后从列表构造新的数据包的。prop的格式也有struct对应,各type尽我所能地用宏定义标出了其实际含义。同时支持一些原版MentoHUST没有的字段,如上面提到的几个IPv6地址、硬盘序列号等。
  5. 考虑到认证用的字段可能有所差异,程序支持用命令行参数--rj-option type:value[:r]修改或新增字段,无须修改代码。如--rj-option 5a:00ff表示新增一条type为0x5a,内容是0x00 0xff的字段,而--rj-option 6f:ff:r表示将type为0x6f的字段内容修改为0xff(当然,修改是内置字段生成错误时才用的)。
  6. 在二次认证时,支持修改数据包头部的IPv4地址、网关、DNS。这部分内容不在property list里面。在我这里,这个修改可以使得管理中心显示出我的真实IP地址,而使用MentoHUST的话我的IP地址会显示为0.0.0.0.
  7. 兼容原版MentoHUST中与认证相关的全部命令行参数(像静态IP地址设定、解析SuConfig就没有了),可以直接使用。但目前还没有做后台功能,故需要把-b设置为-b0
  8. 就测试的情况来看,256MB内存的ARM设备上,MiniEAP内存占用比MentoHUST低87%.

不过现在还不是很完善,有这样一些缺点:

  1. 没有感谢、版本信息
  2. 目前没有后台运行和配置文件保存功能,暂且用&nohup顶着
  3. 文档靠注释,注释还没覆盖全
  4. 命令行参数的帮助还没有写,不过兼容MentoHUST的参数,加一个--module rjv3即可
  5. if_implpacket_plugin的自动注册机制没有实现,新插件需要手动加一行xxx_new来注册到程序,可参见packet_plugin.c
  6. 只在一个地方测试过(稳定地跑了一下午),稳定性未知,功能性未知
  7. 初次写这样规模的代码,可能有些冗余或混乱

欢迎大家试用这个程序并提出意见。程序里使用了本项目的认证算法代码。感谢po主!我将会持续更新这个程序,希望它能在这个阻止Windows以外系统普及到大众的问题上帮助到更多人……

哇,非常感谢,这样之后我就不用重构啦,适配各个学校也简单了。

yjcn commented

我根据@ShanQincheng 同学的教程,抓了我们学校linux锐捷的包,修改了pkt三个数组的内容和checkv4里那两个数组,现在可以成功认证,但还是存在问题
1、心跳存在问题,每隔7分钟左右会掉线,多次掉线会被服务器拉黑
2、服务器记录不到正确IP,在系统中IP为0.0.0.0 即使客户端有了正确IP也检测不到

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

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

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

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

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

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

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

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

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

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

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

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

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

@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/

很高兴见到这个全局变量满天飞堪称黑历史的项目还有人在跟进。
粗看了下@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: 鄙视拿这个去卖钱的行为。

哈哈炸出原作者了么

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

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

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

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

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

@shanzhaozhen

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

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

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

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

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

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

看起来是第二 DNS 的地址。

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

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

在win下也是internet
1505451250 1