小米CR6609路由器刷OpenWRT

关于这款路由器

这是来自值友的推荐,据说这款运营商定制版的小米路由器硬件配置同小米AX1800,可以直接刷小米AX1800的固件,获得一个便宜又好用的Wifi6路由器。CR6609(或者叫TR609)是电信定制版,另有移动版的CR6608和联通版的CR6606。

正好家里用的K2p很老了,虽然这么多年一直稳如狗,但毕竟不支持Wifi6,加上不能刷OpenWRT感觉也不太够用,所以也去搞了一个这个,下手的时候已经涨起来了,但还是算便宜的。

刷机的几个主要步骤:

  • 降级官方固件
  • 打开SSH
  • 下载OpenWRT固件
  • 备份原版固件
  • 刷入固件

降级官方固件

因为下面的打开SSH方法是利用了版本1.0.103及以下的官方固件BUG,所以在新版本的固件中是不能用的,目前我这个已经是1.1.211版本了,所以需要先降级。

官方固件可以在阿里云盘下载。注意要选择正确的型号,对应CR6609的文件是:miwifi_cr6609_firmware_06619_1.0.90。因为阿里云盘不允许上传压缩文件,所以是自解压格式,也可以用通用解压工具解出。

然后连上CR6609,登录管理页面,然后在系统管理中选择手动上传系统,把解压出的bin文件上传上去,注意选择清空用户数据,以免重启出问题,等待更新完成即可。实际降级后的版本为:1.0.41

注意:系统降级以后,默认IP变成:192.168.2.1,不再是原来的:192.168.31.1。

打开SSH权限

小米路由器有个一键换机功能,打开SSH的方法就是伪造一个待换机的旧路由,提供一些脚本给新路由执行,通过这个脚本来解锁新路由的SSH。

不过我手头只有K2P,不能刷OpenWRT来跑脚本,所以是用电脑来提供服务模拟旧路由器,另外再用一个古董路由器用于临时给电脑提供接入。

方法如下:

  • 用一个临时路由器,LAN地址设置为:169.254.31.x,注意:x不可为1,因为不是它来伪造旧路由,另外把这个路由的DHCP关闭,如果支持Wifi 2.4G/5G复用的话,也关闭,只使用2.4G即可。我这个旧路由只有2.4G。
  • 用一台电脑连接这个临时路由器,并指定 IP为:169.254.31.1,跑一个WEB服务(代码附后),这个才是伪造旧路由的
  • 启动CR6609,然后用手机或另一台电脑连接CR6609的热点,登录CR6609的管理页面(系统降级后为192.168.2.1,不是机器背面那个了),然后记录一下登录后页面地址里的stok参数值,这是登录session的token
  • 通过构造一个地址(如下,其中为上面记录的stok值,为临时路由器的2.4G热点名,为临时路由器的热点密码),用这个地址打开一个新页面,让CR6609连接到临时路由器,并从伪造成旧路由的电脑上下载脚本执行,等待10秒执行完成,期间会断网一下,导致执行后会显示页面无法打开,关闭即可,不要重复刷新。如果有其它出错信息,则检查上述步骤是否有误(部分错误原因附后)
http://192.168.2.1/cgi-bin/luci/;stok=<stoken>/api/misystem/extendwifi_connect?ssid=<ssid>&password=<passwd>
  • 再构造一个地址(如下,其中为上面记录的stok值,为随机内容),同样打开新页面,执行完后会返回一个JSON,其中有:“code”: 0 即表示成功,若不成功则检查上述步骤是否有误(部分错误原因附后)
http://192.168.2.1/cgi-bin/luci/;stok=<stoken>/api/xqsystem/oneclick_get_remote_token?username=ß&password=ß&nonce=<nonce>
  • 最后就可以把电脑连接到CR6609,并把指定IP改为DHCP,然后就可以通过SSH连接CR6609,root密码在机器背面(联通版需要通过SN计算)

提供破解脚本的服务代码

提供脚本的服务程序,大部分网上资料提供的都是lua脚本,用于直接在临时路由器上提供服务(可以省掉用电脑伪装旧路由,但需要临时路由能够运行脚本,比如刷了OpenWRT),这里用的是《参考文献1》提供的python版。

import json

from flask import Flask
from flask import request

app = Flask(__name__)

res = {
    "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;'
}


@app.route('/cgi-bin/luci/api/xqsystem/token', methods=['POST', 'GET'])
@app.route('/cgi-bin/luci/api')
@app.route('/cgi-bin/luci/api/xqsystem')
def hello_world():
    if request.method == 'POST':
        print(request.form)

    return json.dumps(res)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

注意:因为需要监控80端口(低于1024),所以需要以root身份运行:

sudo python3 xxx.py

几个可能的脚本错误原因:

  • 1619: 检查临时路由的IP是否正确,或有其它设备接入
  • 1646: 检查DHCP是否关闭
  • 1655: 重试一下

正式刷机

获取OpenWRT固件

推荐在Openwrt 官方下载站,输入你的路由型号“CR6609”,选择”Firmware“类型的固件下载。

备份原版固件

备份原版固件包括分区 “Bootloader” “Nvram” “Bdata” “crash” “crash_log” “firmware” “firmware1” “overlay” “obr” 等。

不过要注意tmp空间只有100多M,每个分区备份后要立即下载删除,以免空间不足重启。

# 查看分区
cat /proc/mtd
# 备份分区
dd if=/dev/mtd2 of=/tmp/firmware.bin

刷机

先打开UART以防出错后无法刷回,启用uboot的fallback:

# 打开UART
nvram set boot_wait=on
nvram set bootdelay=3
# 启用uboot fallback
nvram set flag_try_sys1_failed=0
nvram set flag_try_sys2_failed=1
nvram commit

将OpenWRT固件上传到路由器的/tmp,然后执行刷机:

mtd -e firmware -r write /tmp/openwrt-22.03.5-ramips-mt7621-xiaomi_mi-router-cr6609-squashfs-firmware firmware

重启即可。第一次启动会比较慢,要耐心等待指示灯变蓝后再连接,OpenWRT初始状态未启用无线,需要先用有线连接任一LAN口,然后登录OpenWRT管理页面设置。

参考文献:

  1. 我用Mac、仅通过无线网给CR6609刷了OpenWrt
  2. 小米 CR660x 刷 Openwrt 教程
  3. 运营商版小米CR6606/CR6608/CR6609路由器刷机教程(openwrt/padavan)-家用路由器网
  4. 用mtd和sysupgrade刷机、备份、恢复路由器配置

推送到[go4pro.org]