本鱼拟成立工作室承接项目开发/软件定制/云设施开发运维/办公设备技术支持等,如您有相关需求,欢迎来询 | ::博客文章推荐::

红米AX6/小米AX6/AX3600/AX6000/AX9000全系列拿SSH权限&固化教程

: 硬件/HW 木魚 47976℃ 37评论

本来是想发自编自用的AX6/AX3600固件的,想了想觉得缺了这部分总归有点不太完整,虽然这部分资料网上已经很多了。另外提醒下AX6000和AX9000目前没有啥可用固件(LEDE那边虽然说写着有AX9000的目标了,但是没看到有人用,并且没有验证过)。

概述

小米的固件是基于QSDK进行开发出来的,固件的稳定性其实还算OK,就是功能实在拉胯,WEB控制界面很辣鸡。

然后就是有很多选项不能配置(比如开启IPV6 NAT6下的内网ULA前缀,导致我两台上下级路由器的内网前缀一样,IPV6直接跪了),同时因为要实现APP查看及控制,路由器有运行长连接的推送,相对来说CPU负载偏高。

当然,没有SSH权限是此类“智能路由器”的祖传技能。想要刷三方固件,先拿到SSH权限是必须的。

当前,只有红米AX6和小米AX3600有稍微成熟的三方固件(我用过QSDK以及LEDE);AX6000和AX9000不建议刷三方固件。

简述流程

目前所有的拿SSH权限,都是基于WIFI中继来做的。基本原理其实类似于SQL注入,在源OpenWrt上设置一个脚本,使用要拿到SSH的目标路由器去进行WIFI扩展,实现代码注入后开通SSH权限。

SSH的密码不建议修改,因为系统升级后会进行重置。而密码本身可以通过SN算出来(本文后面可以算)。

拿到SSH权限不是永久的,在系统升级后会重新关闭,所以还需要进行SSH权限固化。

拿到SSH权限先

准备条件

首先,你得有一台已经刷了OpenWRT的路由器,什么型号的无所谓。我是拿了之前遗留下来的贼便宜的TP-LINK WR703便携路由器刷了OpenWrt来用的。

看到有人说可以用虚拟机+网卡模拟AP来跑,但我没有确认过。

然后,你需要一台带有线网卡的电脑,解锁过程需要有线连接路由器。

然后就是破解SSH需要的一些工具。后续的“自动拿SSH”和“手动拿SSH”选择其一即可。

💥刷机有风险,请谨慎操作,对此造成的任何后果,本鱼是不负责的~~~

💡 所有教程都说破解SSH需要先降级固件并恢复出厂设置。
但根据我的试验,这步不是必须的,我所有的路由器都是直接恢复出厂设置就开搞了,并没有降级固件。
这步根据自己的测试来看吧。

下载相关工具及文件

  • 根据自己的路由器型号选择:
    • AX6的老版本固件:  1.0.16 1.0.18(建议下载,后续备用,如果不降级拿不到SSH可考虑降级)
    • AX3600的老版本固件:1.0.17
    • AX6000的老版本固件:1.0.41 1.0.72
    • AX9000的老版本固件:1.0.108
  • SSH及SCP工具:蓝奏云盘 (含WinSCP、putty,已有相关工具的可不下载)
  • 固化SSH权限用到的自动化修改bdata镜像工具:点此下载
  • 初始化QSDK分区镜像以及扩容镜像
  • QSDK固件 (闭源SDK固件,硬件驱动完善,性能基本上和官方一致,没有特殊需要建议选择)

注意:使用WinSCP连接路由器时,默认的协议都是SFTP,要选择为SCP。

手动拿SSH

手动拿SSH比较复杂。但成就感拉满。手残党或小白不建议用此方案。
本章节中的截图部分转取自 Redmi红米路由器AX6刷OpenWrt教程,如果操作有问题,可同时参考此教程。

1. 设置另外一台OpenWrt路由器

使用电脑插网线到另外一台路由器上,确认如下设置:

  1. 关闭无线的二合一
  2. 确保没有其它设备连上这台路由器(可以将WIFI的SSID和密码都改一下,记住2.4G的SSID)
  3. 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,后续如果还需要访问这台路由器,在插上网线后,需要手动设置网卡的IP169.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进入路由器终端,通过如下命令备份分区镜像,确认下bdatacrash分区:

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"

标红的五个分区,分别是 mibibbdatacrashrootfsrootfs_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即成功。

💡注意:这个方式拿到SSH后,root密码会被改成 admin。

3. 固化SSH

默认SSH在小米系统升级后即会自动关闭,所以要想办法留后门默认打开。但如果你准备拿到SSH后即刷成第三方固件,则也可以跳过这个步骤直接开刷。

固化SSH如果是AX6的话,可以直接用工具包中的脚本和工具(参考红米AX6解锁SSH)。请注意:这个脚本和工具不适用于其它型号路由器!其它型号路由器因为闪存布局不同,不可通用,要固化可以参考手动拿SSH里的相关操作进行固化,原理是一样的。

提示

  1. 不建议修改默认的root密码,因为系统重置后密码会被恢复
  2. 如果执行了重置操作,需要在手机连上路由器并进行初始化设置后,默认密码才会恢复
  3. 如果系统升级,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

喜欢 (43)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(37)个小伙伴在吐槽
  1. AX3600什么时候能支持刷集客AP啊

    router2024-10-24 11:05 回复
  2. 23年买的小米AX6000已经无法降级固件了,.41无法降级,还有其他办法吗

    1122332023-12-21 13:09 回复
  3. 小米万兆路由有什么方法可以开启SSH?

    YorkYe2022-12-16 20:02 回复
    • 这个太高端了,我玩不动……可以看看恩山有没有土豪上手折腾了

      木魚2022-12-23 18:50 回复
  4. 大佬,固化了ssh以后,ax9000多出来了一个MIIOT_DEV的ssid,其他功能不影响,求指教

    YorkYe2022-11-27 10:32 回复
    • 这个应该和固化没啥关系啊。。。是新的固件开启了调试模式?

      木魚2022-11-29 18:01 回复
      • 最后我刷到了最新版(165)固件,然后恢复出厂设置,再刷回开发版,ssh之前已经固化过了,所以ssh还在,但是MIIOT_DEV这个ssid的网络就没了,现在一切正常。

        YorkYe2022-12-10 19:43 回复
  5. 请问ax1800也可以使用这个方法吗?

    Lewis2022-06-03 12:51 回复
  6. 小米AX6000尝试降级后 确实解锁SSH能连接上,按照楼主所说办法也固化SSH,走完4.2 写入crash 以及4.3修改bdata 最后升级固件后SSH依然连接不上

    小拓拓2022-05-28 19:51 回复
    • 升级后默认关闭SSH,需要telenet进去后重新打开。没看完呀。

      木魚2022-06-02 15:34 回复
      • 都已经固化了,还需要重新打开吗?话说你这个教程,我看了几遍,确实没说固化后升级怎么再次打开ssh

        bfc2023-08-08 16:29 回复
        • 最后提示里第三条不就是吗。。

          木魚2023-08-25 01:17 回复
  7. REDMI AX6000 有适配嘛

    213123122022-04-18 02:00 回复
  8. 我的AX3600是不是可以照抄AX6处理呀?

    弥时2022-03-08 22:02 回复
  9. 红米ax6s也可以开启ssh了,现在有开发板的AX6S固件,默认开启telnet.希望后续可以支持AX6S固化

    文大大2022-03-03 17:51 回复
  10. 既然是通过无线中继的方式,为什么上游必须是openwrt的路由器呢,其他路由器为什么不行?

    Hello2022-01-23 17:51 回复
    • 只要支持wifi扩展以及能访问到对应的文件内容的,理论上都行,openwrt只是比较容易达成的一种方式了。

      木魚2022-01-27 11:00 回复
  11. test

    大西瓜2022-01-10 16:25 回复
  12. 那个自动修改工具我在WIN11下,托文件进去之后没反应,在恩山论坛看到了手动修改教程,已经成功固化了

    BDONG2022-01-08 19:05 回复
  13. 固化SSH的那個自動工具沒效果
    拖檔案上去就直接消失掉

    Ricky2021-11-04 17:02 回复
    • AX9000的

      Ricky2021-11-04 17:03 回复
    • 不用打开的自动工具的情况下直接把文件拖上去就行

      Nicola2024-08-23 01:52 回复
  14. 我用的是小米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

    請問該怎麼辦?

    teohhanhui2021-09-29 19:49 回复
    • ax3000我没测试过的,建议恩山论坛看看,这里的教程不一定适用。

      木魚2021-10-14 10:38 回复
  15. 感谢木鱼,木鱼的思路写得是比较清楚的,网上很多文章都是比较乱,这点点赞。整个流程下来还是很简单的。
    在固化SSH文章有些地方要修正的,4.4 bdata, mtd write bdata /tmp/bdata,应该是mtd write /temp/bdata bdata, 顺序调整一下。然后crash 清除,应该是erase, mtd erase crash, 这2个有小小的问题。其他都非常好。(主要是我搞到这里的时候,出现错误,吓了一跳,对比了网上其他教程然后修正,希望能帮到其他同学)

    Even2021-08-30 15:46 回复
  16. 我的设置好几天都没有成功!是否可以帮忙呢!谢谢

    nimeng19792021-08-21 15:21 回复
  17. 虽然很想折腾,但是我没得小米系路由器🌝🌝 🌚🌚

    幻梦云生2021-08-04 17:48 回复
    • icon_wink.gif买!

      木魚2021-08-04 23:49 回复
      • 小米现在的固件稳定不 需要定时重启不?

        昵称12021-08-05 11:12 回复
        • 官方固件吗?

          木魚2021-08-05 12:05 回复
          • 求分享官方固件和lede固件的稳定度, 谢谢

            昵称12021-08-05 21:57
        • 我都没遇到过什么问题。

          木魚2021-08-05 22:43 回复
  18. 虽然,,,但是,,,

    felix2171302021-08-04 15:41 回复
  19. 虽然看不懂,但也可以先占位

    懒狮子2021-08-04 15:18 回复