本来是想发自编自用的AX6/AX3600固件的,想了想觉得缺了这部分总归有点不太完整,虽然这部分资料网上已经很多了。另外提醒下AX6000和AX9000目前没有啥可用固件(LEDE那边虽然说写着有AX9000的目标了,但是没看到有人用,并且没有验证过)。
我是路标
概述
小米的固件是基于QSDK进行开发出来的,固件的稳定性其实还算OK,就是功能实在拉胯,WEB控制界面很辣鸡。
然后就是有很多选项不能配置(比如开启IPV6 NAT6下的内网ULA前缀,导致我两台上下级路由器的内网前缀一样,IPV6直接跪了),同时因为要实现APP查看及控制,路由器有运行长连接的推送,相对来说CPU负载偏高。
当然,没有SSH权限是此类“智能路由器”的祖传技能。想要刷三方固件,先拿到SSH权限是必须的。
简述流程
目前所有的拿SSH权限,都是基于WIFI中继来做的。基本原理其实类似于SQL注入,在源OpenWrt上设置一个脚本,使用要拿到SSH的目标路由器去进行WIFI扩展,实现代码注入后开通SSH权限。
SSH的密码不建议修改,因为系统升级后会进行重置。而密码本身可以通过SN算出来(本文后面可以算)。
拿到SSH权限不是永久的,在系统升级后会重新关闭,所以还需要进行SSH权限固化。
拿到SSH权限先
准备条件
首先,你得有一台已经刷了OpenWRT的路由器,什么型号的无所谓。我是拿了之前遗留下来的贼便宜的TP-LINK WR703便携路由器刷了OpenWrt来用的。
看到有人说可以用虚拟机+网卡模拟AP来跑,但我没有确认过。
然后,你需要一台带有线网卡的电脑,解锁过程需要有线连接路由器。
然后就是破解SSH需要的一些工具。后续的“自动拿SSH”和“手动拿SSH”选择其一即可。
💥刷机有风险,请谨慎操作,对此造成的任何后果,本鱼是不负责的~~~
但根据我的试验,这步不是必须的,我所有的路由器都是直接恢复出厂设置就开搞了,并没有降级固件。
这步根据自己的测试来看吧。
下载相关工具及文件
- 根据自己的路由器型号选择:
- SSH及SCP工具:蓝奏云盘 (含WinSCP、putty,已有相关工具的可不下载)
- 固化SSH权限用到的自动化修改bdata镜像工具:点此下载
- 初始化QSDK分区镜像以及扩容镜像
- QSDK固件 (闭源SDK固件,硬件驱动完善,性能基本上和官方一致,没有特殊需要建议选择)
注意:使用WinSCP连接路由器时,默认的协议都是SFTP,要选择为SCP。
手动拿SSH
本章节中的截图部分转取自 Redmi红米路由器AX6刷OpenWrt教程,如果操作有问题,可同时参考此教程。
1. 设置另外一台OpenWrt路由器
使用电脑插网线到另外一台路由器上,确认如下设置:
- 关闭无线的二合一
- 确保没有其它设备连上这台路由器(可以将WIFI的SSID和密码都改一下,记住2.4G的SSID)
- SSH进入路由器终端,将以下内容保存到
/usr/lib/lua/luci/controller/admin/xqsystem.lua
,保存后记得cat /usr/lib/lua/luci/controller/admin/xqsystem.lua
一下确认文件正确(改坏出错的,可以修改正确后重启路由器。手残的可以📦直接下载这个文件然后上传)。
module("luci.controller.admin.xqsystem", package.seeall)
function index()
local page = node("api")
page.target = firstchild()
page.title = ("")
page.order = 100
page.index = true
page = node("api","xqsystem")
page.target = firstchild()
page.title = ("")
page.order = 100
page.index = true
entry({"api", "xqsystem", "token"}, call("getToken"), (""), 103, 0x08)
end
local LuciHttp = require("luci.http")
function getToken()
local result = {}
result["code"] = 0
result["token"] = "; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;"
LuciHttp.write_json(result)
end
此时,访问路由器的后台地址 http://路由器IP/cgi-bin/luci/api/xqsystem/token
应该会显示如下内容:
{"code":0,"token":"; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;"}
则以上步骤正确,可以继续。
- 关闭内网的DHCP,内网IP设置为169.254.31.1
- 重启
至此,这台路由器的准备工作已经完成。由于关闭了DHCP,后续如果还需要访问这台路由器,在插上网线后,需要手动设置网卡的IP为169.254.31.x
(如169.254.31.10
)才能继续访问路由器。
2. 恢复目标路由器至出厂设置
恢复后插上网线(记得将电脑的网卡IP地址设置为自动获取),进行初始化设置即可。
3. 拿SSH
浏览器进入后台,地址栏的地址看起来一般是这样的:
http://路由器IP/cgi-bin/luci/;stok=24eb5d643b7852ceb68ae3a5e127baf7/web/home#router
一直到 stok=一堆字符/
,都保留,然后把后面的地址删掉,再拼上api/xqsystem/extendwifi_connect_inited_router?ssid=<前面路由器的SSID>&password=<前面路由器的无线密码>
,其中红色字要替换成自己之前设置的路由器信息,这时候地址栏看起来应该是类似这样的:
http://路由器IP/cgi-bin/luci/;stok=24eb5d643b7852ceb68ae3a5e127baf7/api/xqsystem/extendwifi_connect_inited_router?ssid=iFishShare&password=123456
其中红色的字样可能会不一样。确认后回车,等待一会儿(大概需要十几秒),直到显示内容。
如果显示如下内容:
其中 code
为 0,则表示成功。如果不为0,可以参考以下可能的原因重试:
1646
检查之前的路由器DHCP是否关闭1619
检查之前的路由器IP地址是否设置为 169.254.31.1,或之前的路由器下还有别的设备1655
重试一次
如果你看到的code是1636,msg是参数错误,那恭喜你,可以简单一点,换下面的这个地址:
/api/xqsystem/extendwifi_connect_inited_router?ssid=<SSID>&password=<wifi密码>&admin_username=root&admin_password=root&admin_nonce=xxx
如(红色字可能有不同):
http://路由器IP/cgi-bin/luci/;stok=24eb5d643b7852ceb68ae3a5e127baf7/api/xqsystem/extendwifi_connect_inited_router?ssid=iFishShare&password=123456&admin_username=root&admin_password=root&admin_nonce=xxx此时,如果返回的信息里包含了“token”字样(参考下面的例子),则已成功开启SSH,可以跳过本节后续内容,直接跳到 4.固化SSH。
{"token":"; nvram set ssh_en=1; nvram set uart_en=1; nvram set boot_wait=on; nvram commit; sed -i 's/channel=.*/channel=\u0022debug\u0022/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;","code":0}如果其它错误且始终失败,则重头来过吧。
接着,使用类似的方式,再把下面地址拼在token之后:
api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx
拼出来的地址类似于:
http://路由器IP/cgi-bin/luci/;stok=24eb5d643b7852ceb68ae3a5e127baf7/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx
红色字可能不同,确认后回车,看到code为0即为成功。
至此,使用root
和本文后面通过序列号计算到的初始化密码,即可通过SSH连接路由器终端。
4. 固化SSH
默认SSH在小米系统升级后即会自动关闭,所以要想办法留后门默认打开。但如果你准备拿到SSH后即刷成第三方固件,则也可以跳过这个步骤直接开刷。
4.1. 备份相关分区
SSH进入路由器终端,通过如下命令备份分区镜像,确认下bdata、crash分区:
root@XiaoQiang:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00020000 "0:SBL1"
mtd1: 00100000 00020000 "0:MIBIB"
mtd2: 00080000 00020000 "0:BOOTCONFIG"
mtd3: 00080000 00020000 "0:BOOTCONFIG1"
mtd4: 00300000 00020000 "0:QSEE"
mtd5: 00300000 00020000 "0:QSEE_1"
mtd6: 00080000 00020000 "0:DEVCFG"
mtd7: 00080000 00020000 "0:DEVCFG_1"
mtd8: 00080000 00020000 "0:APDP"
mtd9: 00080000 00020000 "0:APDP_1"
mtd10: 00080000 00020000 "0:RPM"
mtd11: 00080000 00020000 "0:RPM_1"
mtd12: 00080000 00020000 "0:CDT"
mtd13: 00080000 00020000 "0:CDT_1"
mtd14: 00080000 00020000 "0:APPSBLENV"
mtd15: 00100000 00020000 "0:APPSBL_1"
mtd16: 00100000 00020000 "0:APPSBL"
mtd17: 00080000 00020000 "0:ART"
mtd18: 00080000 00020000 "bdata"
mtd19: 00080000 00020000 "crash"
mtd20: 00080000 00020000 "crash_syslog"
mtd21: 03800000 00020000 "rootfs"
mtd22: 03800000 00020000 "rootfs_1"
mtd23: 00100000 00020000 "cfg_bak"
mtd24: 07d80000 00020000 "overlay"
mtd25: 005ef000 0001f000 "kernel"
mtd26: 01e84000 0001f000 "ubi_rootfs"
mtd27: 00c79000 0001f000 "rootfs_data"
mtd28: 03013000 0001f000 "data"
标红的五个分区,分别是 mibib
、bdata
、crash
、rootfs
、rootfs_1
后续刷机及固化SSH会修改,所以最好都备份后保留。
备份命令:nanddump -f /tmp/文件名 /dev/对应mtd
如上图中的bdata
分区为mtd18
,则备份命令可以写 nanddump -f /tmp/mtd18 /dev/mtd18
,终端输出类似以下:
root@XiaoQiang:~# nanddump -f /tmp/mtd18 /dev/mtd18
ECC failed: 0
ECC corrected: 0
Number of bad blocks: 0
Number of bbt blocks: 0
Block size 131072, page size 2048, OOB size 64
Dumping data starting at 0x00000000 and ending at 0x00080000...
然后使用winscp连接上路由器后,即可在 /tmp
下找到 mtd18
文件,下载回来即可。如此操作,将需要的分区下载回来。
/proc/mtd
显示结果来进行操作!4.2 写入crash
下载unlock_crash.img下载镜像后,用WinSCP上传到路由器的/tmp
目录下,然后运行命令 mtd write /tmp/crash_unlock.img crash
写入。
写入完成后,运行 reboot
重启路由器。
4.3 修改bdata
使用类似的备份命令,将bdata分区文件下来回来。下载回来后,多复制一份(备份)。
下载自动修改工具工具下载解压后,将下载回来的bdata分区镜像拖到程序图标上,即会自动修改好。
4.4 写回bdata
在路由器重启后,重新连上路由器,并将修改后的bdata
镜像使用WinSCP上传到路由器的/tmp
目录下。
执行命令 mtd write /tmp/bdata bdata
进行写入,红色字表示要改为你自己的文件名。
写入完成后,再运行命令 mtd erase crash
来清除crash
分区,最后运行 reboot 重启。至此大功告成。
手动拿SSH,也可以参考这篇教程:AX3600永久开启telnet-ssh。
自动拿SSH
自动拿SSH其实过程类似,只是用了一些三方的脚本和工具,要方便点。
使用的三方工具,主要参考了 shell-script/unlock-redmi-ax3000,需要最新版的可以访问这个仓库。不需要最新版的可以直接下载工具包。
点击下载镜像包本段中部分截图取自红米AX6解锁SSH,需要更详细的介绍也可参考这篇教程。
1. 修改上级路由器
将准备好的另一台路由器开机,使用WinSCP将工具包中的wireless.sh
复制到/tmp目录下。
使用SSH客户端(如putty)连接到路由器上,运行 sh /tmp/wireless.sh
脚本。执行脚本会更改网络和无线设定,执行之前务必备份相关数据。
2. 解锁SSH
重置目标路由器,并初始化后,进入控制台(需要网线连接,不要用WIFI)。
登录后在浏览器地址栏中找到登录token:
(上图中选中的部分)。
然后拼出来以下地址:
http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/extendwifi_connect?ssid=MEDIATEK-ARM-IS-GREAT&password=ARE-YOU-OK
红字替换为上述的token,然后在浏览器中访问,看到 code 0
即成功。
如果成功,则继续访问地址:
http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx
红字换掉,回车后等待片刻,看到 code 为0即成功。
3. 固化SSH
默认SSH在小米系统升级后即会自动关闭,所以要想办法留后门默认打开。但如果你准备拿到SSH后即刷成第三方固件,则也可以跳过这个步骤直接开刷。
固化SSH如果是AX6的话,可以直接用工具包中的脚本和工具(参考红米AX6解锁SSH)。请注意:这个脚本和工具不适用于其它型号路由器!其它型号路由器因为闪存布局不同,不可通用,要固化可以参考手动拿SSH里的相关操作进行固化,原理是一样的。
提示
- 不建议修改默认的root密码,因为系统重置后密码会被恢复
- 如果执行了重置操作,需要在手机连上路由器并进行初始化设置后,默认密码才会恢复
- 如果系统升级,SSH会被关闭,如果固化了SSH权限,则可以通过telnet连接到路由器后,运行以下命令重新打开SSH
sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear
/etc/init.d/dropbear start
通过SN获得密码
输入SN:
初始密码:
以上算法源自 https://www.right.com.cn/forum/thread-189017-1-1.html
AX3600什么时候能支持刷集客AP啊
23年买的小米AX6000已经无法降级固件了,.41无法降级,还有其他办法吗
小米万兆路由有什么方法可以开启SSH?
这个太高端了,我玩不动……可以看看恩山有没有土豪上手折腾了
大佬,固化了ssh以后,ax9000多出来了一个MIIOT_DEV的ssid,其他功能不影响,求指教
这个应该和固化没啥关系啊。。。是新的固件开启了调试模式?
最后我刷到了最新版(165)固件,然后恢复出厂设置,再刷回开发版,ssh之前已经固化过了,所以ssh还在,但是MIIOT_DEV这个ssid的网络就没了,现在一切正常。
请问ax1800也可以使用这个方法吗?
小米AX6000尝试降级后 确实解锁SSH能连接上,按照楼主所说办法也固化SSH,走完4.2 写入crash 以及4.3修改bdata 最后升级固件后SSH依然连接不上
升级后默认关闭SSH,需要telenet进去后重新打开。没看完呀。
都已经固化了,还需要重新打开吗?话说你这个教程,我看了几遍,确实没说固化后升级怎么再次打开ssh
最后提示里第三条不就是吗。。
REDMI AX6000 有适配嘛
同问
我的AX3600是不是可以照抄AX6处理呀?
红米ax6s也可以开启ssh了,现在有开发板的AX6S固件,默认开启telnet.希望后续可以支持AX6S固化
既然是通过无线中继的方式,为什么上游必须是openwrt的路由器呢,其他路由器为什么不行?
只要支持wifi扩展以及能访问到对应的文件内容的,理论上都行,openwrt只是比较容易达成的一种方式了。
test
那个自动修改工具我在WIN11下,托文件进去之后没反应,在恩山论坛看到了手动修改教程,已经成功固化了
棒
固化SSH的那個自動工具沒效果
拖檔案上去就直接消失掉
AX9000的
不用打开的自动工具的情况下直接把文件拖上去就行
我用的是小米AX3000(RA80型號),黑色站立式的。
到了步驟三,執行了
http://192.168.31.1/cgi-bin/luci/;stok=fc951452fa27ecbb43ad3e77b8dcea8a/api/xqsystem/extendwifi_connect_inited_router?ssid=myssid&password=mypassword&admin_username=root&admin_password=root&admin_nonce=xxx
之後得到的是
{"token":"; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\u0022debug\u0022/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;","code":0}
也就是表示應該成功開啓了SSH。不過實際上SSH端口還是拒絕接受訪問。
~> ssh [email protected].1
ssh: connect to host 192.168.31.1 port 22: Connection refused
請問該怎麼辦?
ax3000我没测试过的,建议恩山论坛看看,这里的教程不一定适用。
感谢木鱼,木鱼的思路写得是比较清楚的,网上很多文章都是比较乱,这点点赞。整个流程下来还是很简单的。
在固化SSH文章有些地方要修正的,4.4 bdata, mtd write bdata /tmp/bdata,应该是mtd write /temp/bdata bdata, 顺序调整一下。然后crash 清除,应该是erase, mtd erase crash, 这2个有小小的问题。其他都非常好。(主要是我搞到这里的时候,出现错误,吓了一跳,对比了网上其他教程然后修正,希望能帮到其他同学)
感谢指正。
我的设置好几天都没有成功!是否可以帮忙呢!谢谢
虽然很想折腾,但是我没得小米系路由器🌝🌝 🌚🌚
买!
小米现在的固件稳定不 需要定时重启不?
官方固件吗?
求分享官方固件和lede固件的稳定度, 谢谢
我都没遇到过什么问题。
虽然,,,但是,,,
虽然看不懂,但也可以先占位