操作原理

小米路由器的一键换机功能会尝试从上级路由器的指定URL上获取宽带信息,然后执行指定指令设置这一信息。设置信息的过程中没有对输入字符串转义,导致其可能被shell注入,从而执行任意命令。

根据原理可知,我们需要一个能够提供这一信息的设备。在大多数教程中,这里使用的是另一台OpenWrt的路由器。我手上没有另一台带Wifi的路由器,也不想改现有路由器的设置,所以在这里我使用了一个ESP32模块作为这一信息的提供者。

准备

在刷机前,我们要:
1. 准备好root密码
2. 准备好Openwrt固件。访问Openwrt 官方下载站,输入你的路由型号,选择”Firmware“类型的固件下载。

三种型号的区别如下:

型号 CR6606 CR6608 CR6609
运营商 联通(公开版) 移动 电信
管理IP 192.168.31.1 192.168.10.1 192.168.2.1
root密码 根据SN计算 背面标签 背面标签

操作步骤

  1. 准备好你的信息提供设备。这里我用的是ESP32模块,固件见此
  2. 将你的CR660x路由器使用网线连接到你的电脑(不要用Wifi连了)。如果你的路由是新的,请完成全部的初始化工作。
  3. (可选)将你的电脑连接到解锁信息提供的设备。由于解锁信息提供的设备关闭了DHCP,你需要手动设定电脑的IP地址为 169.254.31.x/24,网关为 169.254.31.1。
  4. 如果你是使用了上面提到的ESP32模块:
    • 访问 169.254.31.1,你现在应该能看到一个帮助页面。
    • 点击第一步的链接,确认模块工作正常。
    • 连接到你的CR660x路由器,登录到管理后台,然后将管理后台的URL复制并粘贴到第二步的输入框中。
      帮助页面会自动解析你提供的URL获取STOK和管理IP,然后拼合需要的URL。
    • 点击第三步的链接,将路由器连接到ESP32的Wifi
    • 点击第四步的链接,在路由器上执行Shell注入
  5. 如果你使用的是其他设备,或无法看到帮助页面
    • 连接到你的CR660x路由器,登录到管理后台。记录下后台管理页面的地址和STOK。
      例如,你的地址为http://192.168.10.1/cgi-bin/luci/;stok=ABCDabcd1234/web/home#router,仅留下http://192.168.10.1/cgi-bin/luci/;stok=ABCDabcd1234,这里记为${HOST}
    • 访问 ${HOST}/api/misystem/extendwifi_connect?ssid=${SSID}&password=${PASSWORD},将路由连接到解锁信息提供的Wifi。其中, ${SSID}是你的wifi名字,${PASSWORD}是你的wifi密码。
    • 访问 ${HOST}/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx,执行注入指令。
  6. 使用SSH连接到路由器,账号为root,密码为上面提到的密码。
  7. 执行以下命令开启UART,防止刷机错误后无法刷回
    nvram set boot_wait=on
    nvram set bootdelay=3
    nvram commit
    
  8. (可选)备份原厂系统,以备不时之需。包括分区 “Bootloader” “Nvram” “Bdata” “crash” “crash_log” “firmware” “firmware1” “overlay” “obr” 等。
  9. 刷OpenWrt
    1. 将固件上传到到路由器的 /tmp 文件
    2. 执行以下命令启用uboot的fallback启动
      nvram set flag_try_sys1_failed=0
      nvram set flag_try_sys2_failed=1
      nvram commit
      
    3. 执行 mtd -r write /tmp/squashfs-firmware.bin firmware 刷机。(请自行替换你的固件文件名)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。