修改 MiniEAP

提醒:这篇文章与修改 MiniEAP 的认证算法无关。

起因:原版 MiniEAP 不能很好地适配我的校园网络环境

[I] ========================
[I] MiniEAP 0.93已启动
[I] 正在查找认证服务器
[I] 正在回应用户名请求
[I] 正在回应密码请求
[I] 正在回应密码请求
[D] 字段格式错误,未发现特征值(偏移量 0x6)
[E] 无法找到 echo key 的位置,将不能进行心跳
[I] 认证成功
[I] 正在回应用户名请求
[I] 正在回应用户名请求
[I] 正在回应用户名请求
[E] 在 4 状态已经停留了 3 次,达到指定次数,正在退出……
[I] MiniEAP 已退出

事后整理的学校的 EAP-MD5 认证流程:

sequenceDiagram participant C as Client participant A as Authenticator participant S as Authentication Server C->>A: EAPOL-Start A->>C: EAP-Request/Identity C->>A: EAP-Response/Identity A->>S: RADIUS Access-Request S->>A: RADIUS Access-Challenge (EAP-Request/MD5-Challenge 1) A->>C: EAP-Request/MD5-Challenge 1 C->>A: EAP-Response/MD5-Challenge 1 A->>S: RADIUS Access-Request S->>A: RADIUS Access-Challenge (EAP-Request/MD5-Challenge 2) A->>C: EAP-Request/MD5-Challenge 2 C->>A: EAP-Response/MD5-Challenge 2 A->>S: RADIUS Access-Request S->>A: RADIUS Access-Accept or Access-Reject A->>C: EAP-Success or EAP-Failure

经过排查,[D] 字段格式错误,未发现特征值(偏移量 0x6) 的输出是程序在读取 EAP-MD5 认证成功后接收的 EAP-Success 数据帧时产生的。

通过修改程序输出得到程序接收的 EAP-Success 数据帧为:

0000   a4 a9 30 1e 73 f4 74 25 8a 0e d5 29 88 8e 01 00
0010   00 04 03 03 00 04 00 00 00 00 00 00 00 00 00 00
0020   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030   00 00 00 00 00 00 00 00 00 00 00 00 23 6b 80 14

其中,程序尝试从下面这部分内容读取特征值:

0000   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0010   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020   00 00 00 00 00 00 23 6b 80 14

对比我在电脑上使用 WireShark 抓包得到 Windows 锐捷客户端的 EAP-Success 数据帧:

image

可以看到数据帧中属于 EAP 协议的部分只有 03 03 00 04,不应该处理后面的数据。

后来发现接入学校网络其实不需要启用锐捷插件。后面的数据是由锐捷插件处理的。

帮助信息其实隐藏在第二次 EAP-Request/MD5-Challenge 数据帧中:

image

此外,可以发现学校的认证策略是每 30s 发送一次 EAP-Request/Identity 数据帧:

image

这也就说明了为什么认证成功后还会产生 正在回应用户名请求 的输出:认证成功后,认证服务器再次发送 EAP-Request/Identity 数据帧,于是 MiniEAP 发送 EAP-Request/Identity 进行响应(回应用户名请求)。程序设计了超时重传机制,因此在 5s 内没有接收到认证服务器的回应就会重传 EAP-Request/Identity。由于程序设计了最大重传次数为 3 的限制,因此在重传 3 次 EAP-Request/Identity 没有得到响应后程序就会自动退出(在 4 状态已经停留了 3 次,达到指定次数,正在退出……)。

[I] 认证成功
[I] 正在回应用户名请求
[I] 正在回应用户名请求
[I] 正在回应用户名请求
[E] 在 4 状态已经停留了 3 次,达到指定次数,正在退出……
[I] MiniEAP 已退出

因此我取消了超时重传机制和最大重传次数的限制,发布了 MiniEAP-SYSU

进行测试:

[2024/10/27 6:08:06][I] ========================
[2024/10/27 6:08:06][I] MiniEAP 0.93已启动
[2024/10/27 6:08:06][I] 正在查找认证服务器
[2024/10/27 6:08:06][I] 正在回应用户名请求
[2024/10/27 6:08:06][I] 正在回应密码请求
[2024/10/27 6:08:06][I] 正在回应密码请求
[2024/10/27 6:08:06][I] 认证成功
[2024/10/27 6:08:11][I] 正在回应用户名请求
[2024/10/27 6:08:27][I] 正在回应用户名请求
[2024/10/27 6:08:57][I] 正在回应用户名请求
[2024/10/27 6:09:27][I] 正在回应用户名请求
[2024/10/27 6:09:57][I] 正在回应用户名请求

可以看到修改后的程序的行为和官方客户端一样,每隔 30s 进行一次认证。

受此 issue 启发:能认证成功,但无法心跳

Read for fun:

posted @ 2024-10-27 01:03  Undefined443  阅读(16)  评论(0编辑  收藏  举报