Redmi AX6000 刷 OpenWrt

一直想尝试玩玩软路由,但是家里实在没有软路由的需求,外加不知道该入手什么机器来刷软路由,所以迟迟没有入手。最近研究生要开学了,但是学校的有线网要下载专用软件认证才能上网,终于找到合适的理由入手一款软路由了。经过一番搜索,我决定入手 Redmi AX6000

这次要往路由器中刷入的系统是 ImmortalWrt,这是一个 OpenWrt 的分支,更适合中国宝宝体质。刷入的流程和 OpenWrt 是一样的,所以下面用 OpenWrt 指代 ImmortalWrt。

前置条件:一台可以上网的旧路由器,一台 Redmi AX6000,一台电脑,一根取卡针,网线若干。

刷入 OpenWrt

开启并固化 SSH、Telnet

  1. 连网线:Redmi AX6000 WAN 口连旧路由器,LAN 口连电脑。

  2. 进入路由器 Web 配置页面 http://192.168.31.1 并设置密码。

  3. 获取 Session Token。重新进入 Web 配置页面,登录后注意浏览器地址栏会发生变化:

    http://192.168.31.1/cgi-bin/luci/;stok=d70928db7692d536cacb6feaf42154f0/web/home#router
    

    其中 ;stok= 后面的部分 d70928db7692d536cacb6feaf42154f0 就是我们本次登录的 Session Token。将其保存为 Shell 变量:

    stok=d70928db7692d536cacb6feaf42154f0
    
  4. 开启 Telnet。接下来我们要利用 URL 实现的命令注入攻击在路由器上执行命令。所有命令都应该返回 {"code":0}

    1. 开启调试模式

      要执行的攻击命令:

      curl "http://192.168.31.1/cgi-bin/luci/;stok=$stok/api/misystem/set_sys_time?timezone=%20%27%20%3B%20echo%20pVoAAA%3D%3D%20%7C%20base64%20-d%20%7C%20mtd%20write%20-%20crash%20%3B%20"
      

      实际注入的命令(上面命令的解释,不用执行):

      echo pVoAAA== | base64 -d | mtd write - crash
      

      参考:Enable Development/Debug Mode | OpenWrt

    2. 重启路由器以应用更改

      要执行的攻击命令:

      curl "http://192.168.31.1/cgi-bin/luci/;stok=$stok/api/misystem/set_sys_time?timezone=%20%27%20%3B%20reboot%20%3B%20"
      

      实际注入的命令(上面命令的解释,不用执行):

      reboot
      

      等待路由器重启。注意路由器重启后旧的 Session Token 会失效,重新登陆 http://192.168.31.1 以获取新的 Session Token。

    3. 设置 Bdata 永久开启 Telnet

      要执行的攻击命令:

      curl "http://192.168.31.1/cgi-bin/luci/;stok=$stok/api/misystem/set_sys_time?timezone=%20%27%20%3B%20bdata%20set%20telnet_en%3D1%20%3B%20bdata%20set%20ssh_en%3D1%20%3B%20bdata%20set%20uart_en%3D1%20%3B%20bdata%20commit%20%3B%20"
      

      实际注入的命令(上面命令的解释,不用执行):

      bdata set telnet_en=1
      bdata set ssh_en=1
      bdata set uart_en=1
      bdata commit
      
    4. 重启路由器以应用更改

      要执行的攻击命令:

      curl "http://192.168.31.1/cgi-bin/luci/;stok=$stok/api/misystem/set_sys_time?timezone=%20%27%20%3B%20reboot%20%3B%20"
      

      实际注入的命令(上面命令的解释,不用执行):

      reboot
      

      等待路由器重启。

  5. 开启 SSH。

    1. 使用 Telnet 登录路由器:

      telnet 192.168.31.1
      
    2. 修改 root 帐户密码:

      echo -e 'admin\nadmin' | passwd root
      
    3. 固化 SSH:

      nvram set ssh_en=1
      nvram set telnet_en=1
      nvram set uart_en=1
      nvram set boot_wait=on
      nvram commit
      
      sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear
      /etc/init.d/dropbear restart
      
    4. 设置 SSH 永久开启:

      mkdir /data/auto_ssh && cd /data/auto_ssh
      curl -O https://cdn.jsdelivr.net/gh/lemoeo/AX6S@main/auto_ssh.sh  # 这步需要 Redmi AX6000 连接网络才能执行
      chmod +x auto_ssh.sh
      
      uci set firewall.auto_ssh=include
      uci set firewall.auto_ssh.type='script'
      uci set firewall.auto_ssh.path='/data/auto_ssh/auto_ssh.sh'
      uci set firewall.auto_ssh.enabled='1'
      uci commit firewall
      
    5. 用上述方法开启 SSH 后,可能会导致路由器时区异常。可以通过以下命令修复:

      uci set system.@system[0].timezone='CST-8'
      uci set system.@system[0].webtimezone='CST-8'
      uci set system.@system[0].timezoneindex='2.84'
      uci commit
      
    6. 关闭调试模式:

      mtd erase crash
      
    7. 重启路由器:

      reboot
      

      等待路由器重启。

刷入 U-Boot

U-Boot 相当于路由器的 BIOS

  1. 使用 SSH 登录路由器:

    ssh root@192.168.31.1
    

    密码为 admin

  2. 备份原厂分区:

    dd if=/dev/mtd1 of=/tmp/mtd1_BL2.bin
    dd if=/dev/mtd2 of=/tmp/mtd2_Nvram.bin
    dd if=/dev/mtd3 of=/tmp/mtd3_Bdata.bin
    dd if=/dev/mtd4 of=/tmp/mtd4_Factory.bin
    dd if=/dev/mtd5 of=/tmp/mtd5_FIP.bin
    
  3. 下载备份到本地计算机:

    scp mtd* USER@HOST:Downloads
    

    USER@HOST 修改为本地计算机的用户名和密码

  4. 上传 U-Boot 文件到路由器。我们使用的是 @hanwckf 大佬开发的 U-Boot。首先进入 U-Boot 发布页面,下载 bl-mt798x-release-20xxxxxx.7z,解压后找到 mt7986_redmi_ax6000-fip-fixed-parts-multi-layout.bin 就是我们需要的 U-Boot 文件。

    接下来上传 U-Boot 文件。在本地计算机执行:

    scp mt7986_redmi_ax6000-fip-fixed-parts-multi-layout.bin root@192.168.31.1:/tmp
    
  5. 刷入 U-Boot。注意在此过程中一定不要断电,否则会变砖。

    # 校验文件
    md5sum /tmp/mt7986_redmi_ax6000-fip-fixed-parts-multi-layout.bin  # 608e72bd18d4e605f72aac8828a1c82e
    # 擦除 FIP 中的内容
    mtd erase FIP
    # 将 U-Boot 写入 FIP
    mtd write /tmp/mt7986_redmi_ax6000-fip-fixed-parts-multi-layout.bin FIP
    # 校验 mtd
    mtd verify /tmp/mt7986_redmi_ax6000-fip-fixed-parts-multi-layout.bin FIP
    

刷入 OpenWrt

  1. 设置电脑的静态 IP 地址。在 U-Boot 模式下路由器无法提供 DHCP 功能,因此需要我们手动设置 IP 地址:

    IP 地址:192.168.31.100

    子网掩码:255.255.255.0

    网关:192.168.31.1

    首选 DNS 服务器:192.168.31.1

  2. 路由器进入 Failsafe 模式。拔掉路由器电源,用牙签按住路由器 RESET 按钮不放,接通路由器电源,15 秒后松开 RESET 按钮,此时就进入了 U-Boot 模式。接下来打开路由器 Web 配置界面 http://192.168.31.1

  3. 上传 OpenWrt 固件。我们使用恩山大佬 @237176253 编译的 ImmortalWrt 固件。进入固件发布帖 [9-30]红米ax6000闭源驱动op,打开网盘链接,下载带有 redmi ax6000 u-boot 字样的固件并解压。

    先选择 mtd layout 为 immortalwrt-110m,接下来点 Upload 上传我们解压出来的 ImmortalWrt 固件,上传成功后点 Update 更新固件。整个过程会持续 1 分钟左右。

    更新成功后将电脑网络的 IP 设置改为 DHCP,此时路由器的 Web 配置界面变为了 http://192.168.6.1,用户名 root,密码 password。此时我们就完成了整个刷机过程。

    如果刷固件后等很久系统都没有起来,可以断电重新进 U-Boot 再刷一次。

配置 OpenWrt

设置 Wi-Fi 密码

ImmortalWrt 默认没有设置 Wi-Fi 密码。如果要设置 Wi-Fi 密码,进入 Web 配置页面 http://192.168.6.1,在 网络 > 无线 中找到你要配置的无线接口:

image

认证模式建议选择 WPA2-PSK/WPA3-SAE Mixed Mode,然后设置你的密码:

image

禁用 IPv6

开启 IPv6 可能会产生一些网络问题,因此建议关闭 IPv6。在 网络 > DHCP/DNS > 高级设置 中找到 禁止解析 IPv6 DNS 记录 项并勾选。

开启 IPv6 可能导致的问题有:

  • 由于 IPv6 路由优化不佳,导致 IPv6 流量经常绕地球一圈使得延迟爆涨。而大多数系统会在 IPv6 可用时优先使用 IPv6,因此你可能会发现开启 IPv6 之后网速变得很慢。

  • 大多数机场不支持转发 IPv6 流量,导致代理失效。

恢复原厂系统

如果你不想玩 OpenWrt 了,想恢复原厂系统,可以这么做:

  1. 上传备份的 FIP 分区文件 mtd5_FIP.bin

    scp -O mtd5_FIP.bin root@192.168.6.1:/tmp
    
  2. 写入 FIP 分区:

    insmod mtd-rw.ko i_want_a_brick=1
    md5sum /tmp/mtd5_FIP.bin
    mtd write /tmp/mtd5_FIP.bin FIP
    mtd verify /tmp/mtd5_FIP.bin FIP
    
  3. 下载小米路由器修复工具并运行。

  4. 拔掉路由器电源,用牙签按住路由器 RESET 按钮不放,接通路由器电源,15 秒后松开 RESET 按钮进入恢复模式。路由器将自动写入原厂系统。

参考:

Troubleshooting

scp 无法传输文件

解决方法:

scp -O file USER@HOST:/path/to/dest

参考:使用 scp 复制文件到 openwrt 出现错误 ash: /usr/libexec/sftp-server: not found | 漳木容

posted @ 2024-08-14 06:33  Undefined443  阅读(1186)  评论(0编辑  收藏  举报