Closed nature2608 closed 4 years ago
我发现虽然不能认证,但是可以持续心跳。能否移植到minieap或者mentohust上?
你好 @nature2608 ,还是需要通过抓包分析才能解决你的问题。
每个学校锐捷认证的数据段是不同的,有些学校可能会认证更多的数据段,或者同样的数据段加密方式不同。
1、实现一个符合802.1X协议的Supplicant首先要弄清楚,Supplicant和Authenticator之间往来的帧,帧格式和帧中的每段数据代表的意义,
2、再要弄清楚,每段数据,锐捷官方客户端如何将其加密的。(有些是明文传输,就不需要分析了)
以上两点弄清楚之后,编程实现就是小意思了。
你可以参考我jmuSupplicant项目代码结构,同样也可以参考mentohust,minieap项目的代码结构。但看懂代码结构不是最核心的,最核心的就是弄清楚以上两个步骤。
抓包的方法,我的那边文章里有说明。
用 Wireshark 抓认证时传输和接收的帧,对比其中变化的部分。我校在认证过程中,变化的数据段的位置和含义,在文章中我有标注,可能你们学校只是位置偏移一点而已,数据含义和加密算法应该都没有变化。
谢谢你的回复,我在你的教程下修改认证数据后可以成功认证,但是不能心跳。请问此项目和mentohust心跳的差别在哪里?
你好 @nature2608 jmuSupplicant移植了hyrathb/mentohust项目中获取心跳帧第一个Echo Key的方法,移植了hyrathb/mentohust项目计算后续Echo Key的函数。
我使用wireshark分析我校锐捷官方认证客户端发送的心跳帧结构,构造具有相同结构的心跳帧,并将Echo填入心跳帧中合适的位置。
能否告知 ethernet_padding指的是哪一段?
@nature2608
@ShanQincheng 谢谢你!经过修改后start和id包已经无差别,但是md5包遇到点问题,第一张图的右边是官方linux客户端抓包,请问要怎么修改左边那些值?第二张图是认证时抓的包,提示的问题我觉得是计算密码或者校验值的位置填充错了,请帮忙看看。附上linux客户端抓包https://pan.baidu.com/s/1bBXVY4KhpGlQspnPBkvSwg
@nature2608 。
我先分享一下“如何从一次失败的锐捷认证中找到导致失败的关键因素”
1、实现一个第三方锐捷认证客户端,在功能上需要把“核心数据段”处理成与锐捷官方认证客户端处理的一样。
2、哪些是核心数据段呢?根据我的经验来说,锐捷日志里指明的认证不成功的原因,就是锐捷认证时的“核心数据段”。知道了核心数据段后,用wireshark去对应帧中找对应的“核心数据段”的位置。找到准确的位置后,针对被加密过的“核心数据段”还需分析出它的加密算法。
再分享一下“我会如何尝试解决你遇到的这个问题””
1、在第二张图片中,锐捷提示用户名错误,导致认证不成功。我校锐捷认证时,在EAP-Response-Identity frame
和 EAP-Response-MD5-Challenge frame
两个帧中填有“明文的用户名”数据段。(你需要用wireshark分析你们学校的锐捷认证数据帧,看看是否用户名同样填充在这两个认证帧中)。
2、那么现在就有两种情况。EAP-Response-Identity frame
和 EAP-Response-MD5-Challenge frame
,其中一个或两个帧中的用户名数据段出错了,导致认证不成功。
3、使用wireshark对比锐捷官方认证客户端发送的帧,和jmuSupplicant发送的帧。看看它们在用户名数据段这里,哪里不一样了。将其改成一样的位置,一样的数据。
4、根据我的经验,我觉得没有在截图中呈现的EAP-Response-Identity frame
也可能存在问题。具体分析步骤与上面分享的相同。
5、仅对比你留言中的第一张图片和第二张图片,wireshark 捕获的帧图片,再结合锐捷认证失败通知,我认为第二张图片中左边那些值暂时都不需要改变,因为第二张图片中左边那些值对用户名在EAP-Response-MD5-Challenge frame
帧中的位置和数据无影响。此时可能有影响的可能是 EAP-Response-MD5-Challenge frame
中,位置为 0x25,0x26,0x27 这三个字节的数据。第一张图片和第二张图片对比,这三个位置的数据从 75,8e,6c 更改为 5f,e1,4d。转换为Ascii显示即从" u.l " 更换为 "_.M "。
6、于是我下载了网盘中wireshark数据文件。发现EAP-Response-MD5-Challenge frame
中,位置为 0x25,0x26,0x27 这三个字节的数据,锐捷官方客户端发送的帧中也是变化的,因此我猜测这三个字节的数据仍然不是关键原因。
7、因此我再考虑和用户名相关的参数,比如“EAP数据长度”这一数据(具体查看RFC 3748,以了解EAP协议)。我在你的第二张图片中,发现指明EAP-Response-MD5-Challenge frame
中“EAP数据长度”的数据是有问题的。位置在 0x14,0x15 这两个字节(可以在wireshark中点击此位置,下方会提示“eap.len”)。锐捷官方客户端发送的帧中,这两个字节的值为 0020,十进制的32。而第二张图片中,0x14,0x15 这两个字节的值为 0027, 十进制的39。比官方发送的大了7个字节。这可能正是锐捷提示用户名错误的原因,因为你要求验证者多验证了7个字节的数据,而这7个刚好被算在了用户名的长度中。
8、你需要修改EAP-Response-Identity frame
和EAP-Response-MD5-Challenge frame
中“EAP数据长度”的数据,使其与锐捷官方客户端发送的一样。
最后,我发现jmuSupplicant在代码的可读性上依然很差。应该把所有要填充的数据段的位置和长度都写在头文件中才会更加清晰。用户名这个数据段,填充的位置存储在construct_eap_frames.c
文件中的USERNAME_ADDR
参数中。填充的长度,存储在construct_eap_frames.c
文件中的username_length
参数中...
以上。
@ShanQincheng 太感谢你了! 昨天考四级没及时回复,我今晚继续修改再试一下.理解的很透彻,完全可以写出一篇教程供大家学习.
昨天晚上尝试了一下依旧没有成功,我在construct_eap_frames.c找相应的位置找的很混乱,不知是否填错位置.MD5包依旧校验值与服务名位置对不上,我上传附件能否帮忙看看? https://pan.baidu.com/s/1gt6xCO_ltXkr3hJhLCeD0Q 祝端午安康.
Sorry, i can't help you. I believe this is your own business and you will do well. I prefer share my experience than help others do programming job.
经过修改后已经和官方包没什么区别,但是出现mac地址被修改,看了一下mentohust的issues说后面还有一段mac,请问怎么在指定位置再覆盖上mac?另外,id与md5包里面的ip,掩码,网关在包里面的什么位置? ps:我用不开启V3验证的账号能够认证
昨晚在源码上加了填充第二个mac的代码,已经可以成功认证.但是依旧不能心跳,日志提示心跳超时被强制下线.
jmuSupplicant和hyrathb/mentohust项目心跳帧核心算法相同,仅仅是帧结构和数据有微小的差异。这需要抓你们锐捷官方认证客户端的发送的心跳帧,分析其中规律来解决你的问题。心跳帧数据不多,你离成功只差一步的距离了。
我查找了很多资料都没有说到如何分析心跳数据,只在此issus看到一点信息https://github.com/hyrathb/mentohust/issues/273 所以想继续请教一下如何分析.感谢.
@ShanQincheng 可否指教指教?
@nature2608 不好意思,最近事情太多太忙,很久没上github了。
分析的方法依然是抓包。
找出心跳包变化的数据段位置,数据变化规律。每一次初始的心跳包,数据是怎么样的,而后是如何变化的。
说白了就是靠猜。我估计锐捷的算法不会针对你们学校做出改变,可能是心跳包钟固定的数据段数据不同导致心跳包无法认证。
@ShanQincheng 这个数据分析对我来说很困难,没有头目,完全看不懂这些结构。看来只能遗憾到这里了。感谢你一直的回复。
看了你的“魔改mentohust”教程后在我学校用V3验证的可以登陆,但是不能心跳。现在想试试改这个行不行。