前言:新学期伊始,办了校园网的有线套餐,于是有了购入一台路由器用来将网络WiFi共享的需求,且校园网不定时会将用户自动踢下线,需要重新认证,我校校园网认证原理为发送一个HTTP-POST请求到认证服务器,可使用wgetcurl构造一个POST请求实现自动认证,编写成一个可自动判断网络认证状态的shell脚本上传至路由器定时检测并自动认证,故将选择投向了可刷入第三方固件的路由器,最终在合理价位宿舍用的路由器里挑中了小米R3G

R3G参数介绍及OpenWrt信息

  • 型号:Xiaomi Mi Router 3G
  • 处理器:MediaTek MT7621 2 core 默认频率880MHz
  • DRAM内存:256MB DDR3
  • Flash闪存:128MB SLC Nand Flash
  • WAN/LAN:WAN x1 LAN x2 1Gbps
  • USB:3.0接口 x1
  • 无线芯片: MT7603/MT7612 2.4GHz/5GHz 802.11an+ac
  • 固件版本 Steven build from Lede 2022.06.05 @ OpenWrt R22.5.5 / LuCI Master (git-22.155.62538-041a223)
  • 内核版本 5.4.195

需要注意的是,小米R3G共有两个型号,另一个型号为运营商定制版的R3Gv2,内存缩水至128M,闪存更是只有16M,且砍掉了USB接口,不推荐购入
小米R3G拼多多二手参考价50元(2022-10)。
由于本文发布之前,我已刷好OpenWrt,故部分图文不符,若有疑惑,请以文字为准,图片作参考
以下所有操作在使用网线直连下最优,不推荐WiFi情况下进行操作

📷 小米R3G 宿舍一隅

Breed刷入流程

Breed 是一款由国内个人hackpascal开发的闭源Bootloader ,也被统称为“不死鸟”。
它允许人们使用易操作的Web页面进行刷固件,其“不死”的原理为部分固件自带Bootloader,通过Breed刷入固件时会自动去除固件自带的Bootloader,防止Breed被覆盖,因此保证了Breed的“不死”。 —— hackpascal

获取SSH权限

为了通过ssh刷写路由器的Bootloader为Breed,需要先将小米路由器的ROM更新为开发版(稳定版不支持)

开发版ROM更新

前往 MiWiFi:@ROM 找到路由器对应的开发版ROM
开发版ROM刷入有两种方式,一般推荐方式1,当方式1不可用时,可尝试方式2

  • 方式1:通过小米路由器后台在线升级,地址一般为192.168.31.1,进入常用设置,点击系统状态,在升级检测栏中点击手动升级,选择 刚刚从 MiWiFi:@ROM 下载的固件,等待路由器重启即可。

📷 小米路由器固件更新

  • 方式2:将从 MiWiFi:@ROM 下载的固件重命名为miwifi.bin,放入分区格式为FAT32的U盘根目录(推荐先格式化U盘,格式必须为FAT/FAT32,避免异常出错),断开小米路由器的电源,将U盘插入USB接口,用卡针按住reset按钮之后重新接入电源,指示灯变为黄色闪烁状态即可松开reset按钮,刷机完成后路由器会自动重启(指示灯由黄灯常亮变为蓝灯常亮)。

MiWiFi App 绑定小米路由器,获取root密码

前提:需要一个可用的小米账号

  1. 可从手机自带的应用商店下载MiWiFi,也可从 MiWiFi:@手机客户端 下载。
  2. 在MiWiFi中登录自己的小米账号,手机连接至小米路由器的WIFI网络,扫描绑定小米路由器
  3. 绑定成功后,在 MiWiFi:@SSH 登录路由器所绑定的小米账号
  4. 选择账号所绑定的相应路由器,下载工具包,并记下root密码

📷 MiWiFi SSH

刷入工具包

以下为官网所述的使用方法:

  1. 请将下载的工具包bin文件复制到U盘(FAT/FAT32格式)的根目录下,保证文件名为miwifi_ssh.bin;
  2. 断开小米路由器的电源,将U盘插入USB接口;
  3. 按住reset按钮之后重新接入电源,指示灯变为黄色闪烁状态即可松开reset键;
  4. 等待3-5秒后安装完成之后,小米路由器会自动重启,之后您就可以尽情折腾啦 :)

自此,小米路由器的SSH权限开启成功。

Windows系统下,通过WinScp和Xshell或PuTTY刷入Breed

以下仅提供软件的官方地址
Martin Přikryl:@WinScp
NETSARANG:@Xshell
Simon Tatham:@PuTTY

提示:刷机之前,记得备份
提示:刷机之前,记得备份
提示:刷机之前,记得备份
由于本文发布之前,我已刷好OpenWrt,故部分图文不符,若有疑惑,请以文字为准,图片作参考

使用Xshell登录系统,并进行备份

在Xshell的命令行界面输入ssh 192.168.31.1,用户名为root,密码为之前在 MiWiFi:@SSH 所记下的root密码,跳出提示信息选择“是”即可

📷 Xshell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看分区命令:cat /proc/mtd
一般分区情况如下
mtd0: 07f80000 00020000 "ALL"
mtd1: 00080000 00020000 "Bootloader"
mtd2: 00040000 00020000 "Config"
mtd3: 00040000 00020000 "Bdata"
mtd4: 00040000 00020000 "Factory"
mtd5: 00040000 00020000 "crash"
mtd6: 00040000 00020000 "crash_syslog"
mtd7: 00040000 00020000 "reserved0"
mtd8: 00400000 00020000 "kernel0"
mtd9: 00400000 00020000 "kernel1"
mtd10: 02000000 00020000 "rootfs0"
mtd11: 02000000 00020000 "rootfs1"
mtd12: 03580000 00020000 "overlay"
mtd13: 012a6000 0001f000 "ubi_rootfs"
mtd14: 030ec000 0001f000 "data"

将U盘(FAT/FAT32格式)插入路由器,Xshell中输入cd /,再输入ls -a(查看有无extdisks,一般可略过此步骤),接着cd extdisks,再输入一遍ls -a即可查看到自己的U盘路径
通过以上命令查询可知我的U盘路径为sda1,以下为使用我的U盘路径的备份命令(请修改成自己的U盘路径)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dd if=/dev/mtd0 of=/extdisks/sda1/ALL.bin
dd if=/dev/mtd1 of=/extdisks/sda1/Bootloader.bin
dd if=/dev/mtd2 of=/extdisks/sda1/Config.bin
dd if=/dev/mtd3 of=/extdisks/sda1/Bdata.bin
dd if=/dev/mtd4 of=/extdisks/sda1/Factory.bin
dd if=/dev/mtd5 of=/extdisks/sda1/crash.bin
dd if=/dev/mtd6 of=/extdisks/sda1/crash_syslog.bin
dd if=/dev/mtd7 of=/extdisks/sda1/reserved0.bin
dd if=/dev/mtd8 of=/extdisks/sda1/kernel0.bin
dd if=/dev/mtd9 of=/extdisks/sda1/kernel1.bin
dd if=/dev/mtd10 of=/extdisks/sda1/rootfs0.bin
dd if=/dev/mtd11 of=/extdisks/sda1/rootfs1.bin
dd if=/dev/mtd12 of=/extdisks/sda1/overlay.bin
dd if=/dev/mtd13 of=/extdisks/sda1/ubi_rootfs.bin
dd if=/dev/mtd14 of=/extdisks/sda1/data.bin

备份至mtd14时可能会出现错误,该分区备份是否成功可以忽略

  • 恢复官方固件方法请前往恩山论坛搜索,以上仅作备份处理,请保存好备份文件

使用WinScp将Breed上传至路由器

Breed的官方下载地址 hackpascal:@Breed
例:搜索breed-mt7621-xiaomi-r3g.bin即为小米R3G专用Breed

提示:Breed v1.2无法给小米R3G直刷底包,其它路由器不知
故推荐使用Breed v1.1,在 hackpascal:@Breed 中往下拉至底部,进入r1338文件夹,搜索下载breed-mt7621-xiaomi-r3g.bin即可

新建会话登录路由器,文件协议选择SCP,用户名密码皆如上(不再赘述),将Breed上传至路由器的/tmp目录下

📷 WinScp

使用Xshell刷入Breed

WinScp上传Breed成功后,即可通过Xshell刷入Breed
请确认自己的Breed文件名
命令如下:
mtd -r write /tmp/breed-mt7621-xiaomi-r3g.bin Bootloader
写入完成会自动重启

通过Breed刷入OpenWrt

首先需要进入Breed,先拔掉路由器的电源,使用卡针按住reset按钮(约3秒左右),再给路由器通电,等到路由器指示灯变为蓝色闪烁状态时即可松开reset按钮

此时在浏览器中访问192.168.1.1,就可以进入Breed的Web页面控制台,如无法访问,请排查以下两个可能故障

  1. 检查浏览器是否对192.168.1.1建立了HTTPS安全连接,如是,请尝试访问http://192.168.1.1
  2. 检查有线网卡是否自动获得了IP,若无,请自行固定IP,IP地址为192.168.1.100,子网掩码为255.255.255.0,默认网关为192.168.1.1

刷入第三方固件

以下使用恩山论坛坛友coolcucumber所作的2022-06-05(Breed直刷版)OpenWrt固件作简单演示
coolcucumber:@OpenWrt

  1. 刷入前,请先备份EEPROM编程器固件
  2. 恢复出厂设置
  3. 在环境变量编辑中加入两个变量,字段xiaomi.r3g.bootfw的值为2,字段autoboot.command的值为boot flash 0x600000
  4. 点击固件更新,闪存布局选择小米路由器 3G 固件 2,固件选择直刷固件,勾选自动重启,上传即可

重启之后,该固件的OpenWrt后台登录地址为192.168.1.31,密码为password
固件功能介绍:
IPv6支持 带宽监控 TTYD 计划任务 磁盘管理 定时重启 FileTransfer 酸酸的乳饮料
动态DNS 网络唤醒 KMS服务器 frp内网穿透 Zerotier 硬盘休眠 网络共享(SMB)
Transmission 阿里云WebDav TurboAcc网络加速 iPerf3 USB3.0支持
JerryKuKu’sArgon主题&个性化设置

OpenWrt校园网自动认证

提示:方法仅适合可构造永久可用的 cURL 校园网登陆系统

获取校园网登录网络的 HTTP-POST 请求

  • 原理:我校校园网web认证是通过发送一个HTTP-POST请求到认证服务器实现认证
  • 满足以上原理,即可使用以下的实现方法完成自动认证

在任意可使用Web开发工具的浏览器中打开校园网登录网址,以下使用 基于 Chromium 的 Microsoft Edge 演示
在页面中按下 F12 或者右键点击检查打开开发者工具,切换到 网络 ,正常输入用户账密,点击登录

📷 校园网Web登录页面

登录过程中,开发者工具会自动记录下所出现的HTTP请求,我们需要在这些请求中找到登录所使用的请求,一般来说,带有 login 字段的请求即为登录网络的 HTTP-POST请求

📷 请求

找到登录请求后,对该请求右键,复制为cURL(bash)

📷 复制请求

将复制的cURL粘贴到任意文本编辑器,原始cURL如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
curl 'http://gas.gwifi.com.cn/gportal/web/authLogin?round=971' \
-H 'Accept: application/json, text/javascript, */*; q=0.01' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'Cookie: tgw_l7_route=bf09a01e33fbf3c9fa61e7142abb6129; PHPSESSID=6cajcmka56nn6ff847imh3vsc0' \
-H 'Origin: http://gas.gwifi.com.cn' \
-H 'Referer: http://gas.gwifi.com.cn/gportal/web/login?wlanacname=GXZZ01&wlanuserip=10.202.34.251' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52' \
-H 'X-Requested-With: XMLHttpRequest' \
--data-raw 'data=KzAgDStuyf5ZA%2BEZS4a5nq56Yo50jiQ%2Bi%2Bp%2BO99fnBFhMys6ozkb4I%2BHt1Ojo7y6BprXA0GkLNmt3XW8tQdIYVdfxKUagxBkqgOxSNLmIj7cBeOrh%2B%2FbLFUl2VmwNX261eo1fF4do4FZvQVPs9rlprlLmTiMAM5I8kQD%2BrWCpUorphtytHS8vIa7Uq532gfbRSXdqvv5LYEyhv5BVnhx5jA6FAhLhg3CZ5DSNMdNS3zfshry%2BGW491E3pnIezHpMks3IFJlX7xTRFOP%2BIantgGJ3QNE5eddA0LljmZ5o1yDK3XRmZbmH5waLfRG%2B3vUlFVkpcC3bu3dUArOKabmyVQ%3D%3D&iv=c34cfebb8a822c05' \
--compressed \
--insecure

修改 cURL 便于永久可用

首先将末尾的 --compressed--insecure 去除
另外可自行分析尝试可去除的部分,以下为我最终构造的 cURL
记得将原始cURL中的单引号 ' 改为双引号 "

1
curl -X POST "http://gas.gwifi.com.cn/gportal/web/authLogin?round=301" -H "X-Requested-With: XMLHttpRequest" --data-raw "data=KzAgDStuyf5ZA%2BEZS4a5nq56Yo50jiQ%2Bi%2Bp%2BO99fnBFhMys6ozkb4I%2BHt1Ojo7y6BprXA0GkLNmt3XW8tQdIYVdfxKUagxBkqgOxSNLmIj7cBeOrh%2B%2FbLFUl2VmwNX261eo1fF4do4FZvQVPs9rlprlLmTiMAM5I8kQD%2BrWCpUorphtytHS8vIa7Uq532gfbRSXdqvv5LYEyhv5BVnhx5jA6FAhLhg3CZ5DSNMdNS3zfshry%2BGW491E3pnIezHpMks3IFJlX7xTRFOP%2BIantgGJ3QNE5eddA0LljmZ5o1yDK3XRmZbmH5waLfRG%2B3vUlFVkpcC3bu3dUArOKabmyVQ%3D%3D&iv=c34cfebb8a822c05"

测试 cURL 是否可用

退出登录校园网后
通过 PowerShellCmd 尝试是否可用,如图:

📷 复制请求

我校校园网返回值中, status1 即为登录成功,为 0 时即为登录失败

编写脚本

编写一个shell脚本,上传至路由器,并定时运行,即可实现校园网的自动认证

搁置,理由如下

我校校园网登录所用的 HTTP-POST 请求中有一个 data 变量的值每隔一定时间便会自动通过 AES加密算法 加密更新,我不清楚里面的原理,只能构造出一个短时间可用的 cURL ,故该方法无用
目前思路是给路由器装上 Python 来模拟浏览器正常登录,或者再分析 data 的加密原理

相关链接及参考鸣谢