updateing / minieap

可扩展的 802.1x 客户端,带有锐捷 v3 (v4) 算法插件支持
GNU General Public License v3.0
514 stars 93 forks source link

能够认证成功,但是无法心跳 #18

Closed X1aomu closed 7 years ago

X1aomu commented 7 years ago

我修改过一个适用我学校的 mentohust,现在想试试 minieap,几经探索,修改字段后现在 minieap 已经可以认证成功,但心跳包那里出了问题,

[2017/9/8 9:18:26][I] ========================
[2017/9/8 9:18:26][I] MiniEAP 0.91已启动
[2017/9/8 9:18:26][I] 正在查找认证服务器
[2017/9/8 9:18:26][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 9:18:26][I] 正在回应用户名请求
[2017/9/8 9:18:26][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 9:18:26][I] 正在回应密码请求
[2017/9/8 9:18:26][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 9:18:26][D] 字段格式错误,未发现特征值(偏移量 0x5b)
[2017/9/8 9:18:26][E] 无法找到 echo key 的位置,将不能进行心跳
[2017/9/8 9:18:26][I] 认证成功
[2017/9/8 9:19:25][D] 字段格式错误,未发现特征值(偏移量 0x6)
[2017/9/8 9:19:25][W] 认证掉线,稍后将重新开始认证……
[2017/9/8 9:19:26][I] 正在查找认证服务器
[2017/9/8 9:19:26][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 9:19:26][I] 正在回应用户名请求
[2017/9/8 9:19:26][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 9:19:26][I] 正在回应密码请求
[2017/9/8 9:19:26][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 9:19:26][D] 字段格式错误,未发现特征值(偏移量 0x5b)
[2017/9/8 9:19:26][E] 无法找到 echo key 的位置,将不能进行心跳
[2017/9/8 9:19:26][I] 认证成功
^C[2017/9/8 9:19:35][I] MiniEAP 已退出

以上是一次成功后被掉线后再第二次认证的日志。 但是我用 Mentohust 的时候,心跳包是没有问题的,而用 minieap 出现以上错误且心跳包没有发出去。 这是用 minieap 认证时服务器发回的 success 包:

第一行省略
0010   01 08 03 02 01 08 00 00 13 11 00 00 00 00 13 11  ................
0020   00 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00  .I..............
0030   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0040   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0050   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0060   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0070   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0080   00 00 00 00 00 00 00 00 00 00 00 00 00 13 11 01  ................
0090   00 00 00 13 11 01 00 ff ff 37 77 af 7f ff ff 87  .........7w.....
00a0   ef ff ff ff d7 ff 00 00 13 11 3c 1f c4 fa b5 b1  ..........<.....
00b0   c7 b0 ca b9 d3 c3 b5 c4 b7 fe ce f1 ce aa d3 d0  ................
00c0   cf df 31 78 c9 cf cd f8 3b 00 00 13 11 3d 1d 32  ..1x....;....=.2
00d0   30 31 37 2d 30 33 2d 30 33 d6 c1 32 30 31 38 2d  017-03-03..2018-
00e0   30 36 2d 33 30 28 32 36 30 29 00 00 13 11 56 06  06-30(260)....V.
00f0   00 00 00 00 00 00 13 11 66 18 ce de cf df 77 65  ........f.....we
0100   62 c9 cf cd f8 40 d3 d0 cf df 31 78 c9 cf cd f8  b....@....1x....
0110   00 00 13 11 98 06 ff ff ff ff                    ..........

这是用 mentohust 认证时服务器发回的 success 包:

第一行省略
0010   01 08 03 02 01 08 00 00 13 11 00 00 00 00 13 11  ................
0020   00 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00  .I..............
0030   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0040   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0050   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0060   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0070   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0080   00 00 00 00 00 00 00 00 00 00 00 00 00 13 11 01  ................
0090   00 00 00 13 11 01 00 ff ff 37 77 af 7f ff ff 5d  .........7w....]
00a0   ad ff ff ff d7 ff 00 00 13 11 3c 1f c4 fa b5 b1  ..........<.....
00b0   c7 b0 ca b9 d3 c3 b5 c4 b7 fe ce f1 ce aa d3 d0  ................
00c0   cf df 31 78 c9 cf cd f8 3b 00 00 13 11 3d 1d 32  ..1x....;....=.2
00d0   30 31 37 2d 30 33 2d 30 33 d6 c1 32 30 31 38 2d  017-03-03..2018-
00e0   30 36 2d 33 30 28 32 36 30 29 00 00 13 11 56 06  06-30(260)....V.
00f0   00 00 00 00 00 00 13 11 66 18 ce de cf df 77 65  ........f.....we
0100   62 c9 cf cd f8 40 d3 d0 cf df 31 78 c9 cf cd f8  b....@....1x....
0110   00 00 13 11 98 06 ff ff ff ff                    ..........

对比了下,基本是相似的,而且 00003111 字段也都存在,那么问题出在哪?

updateing commented 7 years ago

根据 MiniEAP 现在的报文处理方式走一遍,可以发现你抓包的第二个字段长度不正确:

0010 01 08 03 02 01 08 00 00 13 11 00 00 00 00 13 11 ................ 0020 00 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .I.............. 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

但是在 0x49 个字节过后并没有新的 00 00 13 11 的 magic 出现,因此解析过程不会继续,也就找不到后面 00 00 13 11 01 00 ff ff 37 77 ... 这里的心跳 key.

不清楚为什么会出现这种情况,或许是我对 0x00 这个类型的字段理解还是不对。

可以尝试把 0x00 类型的解析方式改为与需要忽略长度信息、主动探测长度的 0x01 一致:

diff --git a/packet_plugin/rjv3/packet_plugin_rjv3_prop.c b/packet_plugin/rjv3/packet_plugin_rjv3_prop.c
index 32a6c28..3829629 100644
--- a/packet_plugin/rjv3/packet_plugin_rjv3_prop.c
+++ b/packet_plugin/rjv3/packet_plugin_rjv3_prop.c
@@ -174,11 +174,10 @@ RESULT parse_rjv3_buf_to_prop_list(LIST_ELEMENT** list, uint8_t* buf, int buflen

             if (memcmp(_tmp_prop->header2.magic, _magic, sizeof(_magic)) == 0) {
                 /* Valid */
-                if (_tmp_prop->header2.type == 0) {
-                    /* 0x0 prop's len does not include HEADER2 */
-                    _content_len = _tmp_prop->header2.len;
-                } else if (_tmp_prop->header2.type == 1) {
-                    /* Type 0x1 means there is no length info, we have to search for next 00 00 13 11 */
+                if (_tmp_prop->header2.type == 0 || _tmp_prop->header2.type == 1) {
+                    /* Type 0x0 and 0x1 means there is no accurate length info,
+                     * we have to search for next 00 00 13 11
+                     */
                     uint8_t* _next_magic = find_byte_pattern(_magic, sizeof(_magic),
                                                               buf + _read_len, buflen - _read_len);
                     _content_len = _next_magic ? (_next_magic - (buf + _read_len)) : buflen - _read_len;

结果如下

[2017/9/8 13:59:13][I] ========================
[2017/9/8 13:59:13][I] MiniEAP 0.91已启动
[2017/9/8 13:59:13][I] 正在查找认证服务器
[2017/9/8 13:59:13][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 13:59:13][E] 无法从 /etc/mtab 获取根分区挂载设备信息,请使用 --fake-serial 选项手动指定硬盘序列号: Inappropriate ioctl for device (25)
[2017/9/8 13:59:18][I] 正在查找认证服务器
[2017/9/8 13:59:18][W] 第二 DNS 地址获取错误。若认证失败,请用 --fake-dns2 指定第二 DNS 地址
[2017/9/8 13:59:18][E] 无法从 /etc/mtab 获取根分区挂载设备信息,请使用 --fake-serial 选项手动指定硬盘序列号: Inappropriate ioctl for device (25)
[2017/9/8 13:59:20][I] 计费通知:
[2017/9/8 13:59:20][I] 您当前使用的服务为有线1x上网;
[2017/9/8 13:59:20][I] 正定时发送 Keep-Alive 报文以保持在线……
[2017/9/8 13:59:20][I] 认证成功

顺注:我看到你在 MentoHUST 那边提到 MAC 地址问题,这个已经在其他 issue 里有过讨论了。MiniEAP 支持自动获取并填充 MAC 地址,如果给其他人认证仍然提示 MAC 地址被修改,可能是字段标识有变化,还是得看看包。

X1aomu commented 7 years ago

@updateing 照你说的改果真心跳没有问题了:)

另外,MAC 我这边在极少样本测试下还没有出现问题,提出问题的是这位 @shanzhaozhen

shanzhaozhen commented 7 years ago

我这边MAC没有问题了,主要是我漏看了一个地方还需要替换MAC地址,现在我这是不能访问外网 @Xiaomu0

nature2608 commented 6 years ago

@X1aomu 我也有不能心跳的问题,能否帮我解决下?