最近小米有品上再次开始售卖起了红米AX6,由于这是小米出品的,能刷Openwrt的机器中较为便宜的一款,便购买了一台。根据网上的一些帖子,解锁AX6的SSH需要额外找一台运行Openwrt的路由器来跑脚本。不过经过研究,理论上任何能够开Wi-Fi热点(AP),且能够配置静态IP的设备都能用于路由器的解锁。

准备

  • 一台能够开Wi-Fi热点(AP),且能够配置静态IP的设备。(笔者使用了安装Ubuntu的树莓派开热点,理论上Linux虚拟机+能够开热点的无线网卡或者Windows电脑直接开热点都能达到类似的效果)。
  • 设备上需要能运行web服务器(笔者用的nginx),或者能运行python(能监听本地端口即可)
  • 未解锁的红米AX6路由器。
  • (可选)随便找台路由器,让操作的电脑,AX6和树莓派处在同一内网内方便ssh操作。

接线拓扑图
接线拓扑图

启用树莓派的热点

参考其他作者写的在openwrt上运行的脚本(Github Link),解锁所需的操作可被简化为设置一个静态IP,网关为169.254.31.1的无线网络,同时在网关上开一个接受POST的api server,路径为/cgi-bin/luci/api/xqsystem/token

这一步只要做到开启热点和配置静态IP即可。配置静态IP的软件与Linux的发行版有关,笔者的树莓派使用的是netplan。具体步骤可请参考自己的Linux使用的网络配置软件。

使用hostapd配置热点

(如果使用的是外接网卡,可自行解决驱动等问题)

首先安装hostapd

apt install hostapd

建立热点配置文件 /etc/hostapd/hostapd.conf (这里使用的SSID为xiaomirouterssh,密码为xiaomi12345,可自行修改:

interface=wlan0
driver=nl80211
ssid=xiaomirouterssh
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=xiaomi12345
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

之后修改/etc/default/hostapd,在里面添加一行:

DAEMON_CONF="/etc/hostapd/hostapd.conf"

之后启动使用hostpad开的热点:

systemctl unmask hostapd
systemctl start hostapd

配置静态IP

笔者的树莓派使用的网络配置软件为netplan。

修改/etc/netplan/50-cloud-init.yaml,加一个wlan0的接口,配置静态IP为169.254.31.1/24

network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
        wlan0:
            dhcp4: no
            addresses:
                - 169.254.31.1/24
    version: 2

之后使用netplan generate 50-cloud-init.yaml && netplan apply应用配置。

配置树莓派上的api server

方法1:nginx

参考配置文件如下:

server {
	listen 80 default_server;
	listen [::]:80 default_server;

location /cgi-bin/luci/api/xqsystem/token {
    if ($request_method != POST) { return 404; }
    return 405;
    error_page 405 =200 /test/response.json;
}	

location = /test/response.json {
    root /opt;
}

}

同时将解锁用的payload放在/opt/test/response.json下:

{"token":"; nvram set ssh_en=1; nvram set uart_en=1; nvram set boot_wait=on; nvram commit; uci set wireless.@wifi-iface[0].key=`mkxqimage -I`; uci commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;","code":0}

方法2:Python

先保证系统内安装了flaskrequestsjson这几个包。

并运行下面的python脚本:

# app.py
from flask import Flask, request, jsonify

app = Flask(__name__)

payload = {"token":"; nvram set ssh_en=1; nvram set uart_en=1; nvram set boot_wait=on; nvram commit; uci set wireless.@wifi-iface[0].key=`mkxqimage -I`; uci commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;","code":0}

@app.post("/cgi-bin/luci/api/xqsystem/token")
def return_payload():
  return payload, 200

if __name__ == '__main__':
      app.run(host='169.254.31.1', port=80)
python3 app.py

如果运行成功,可以看到:

 * Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://169.254.31.1/ (Press CTRL+C to quit)

这样的log,这时可以用curl确认一下运行的正不正常(如果返回了上方payload中的那个json就是正常的):

curl -X POST http://169.254.31.1/cgi-bin/luci/api/xqsystem/token   

解锁SSH

这部分写的比较简单,如果有不清楚的地方可以参考这篇文章

首先,登入AX6的后台,找到url里的STOCK

http://192.168.31.1/cgi-bin/luci/;stok=xxx 其中的 xxx 即为 STOK)

然后 依次 访问下面的 URL(STOK 不含尖括号):

http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/extendwifi_connect?ssid=xiaomirouterssh&password=xiaomi12345

如出现 connect success 则代表路由 B 已成功连接到路由 A,可以继续访问下一个 URL:

http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx

如出现下图中的内容,则代表 SSH 开启成功

随后打开管理界面,查看5GHz的Wi-Fi的密码,5GHz Wi-Fi的密码即为路由器ssh的密码。可通过ssh [email protected]登录。

至此就可以衔接其他作者写的刷机教程了。

固化SSH(可选)

引用这篇文章里的操作:

进入源码(前面提到的 https://github.com/shell-script/unlock-redmi-ax3000/ ,可以clone下来备用)目录,在电脑上执行下列命令:

scp ax3000.sh [email protected]:/etc/ax3000.sh
scp fuckax3000 [email protected]:/etc/fuckax3000

然后通过 SSH 连接,执行下列命令:

sh /etc/ax3000.sh dump

ax3000 dump
ax3000 dump
脚本会自动导出备份数据,请通过下面的地址保存以防万一:

http://192.168.31.1/backup/log/bdata_mtd9.img

\5. 固化 Telnet/SSH 访问权限 默认情况下,当路由器恢复出厂设置或者升级后,相关权限将会丢失,因此我们需要额外的操作以保留它们 通过 SSH 连接路由 B,执行下面的命令:

sh /etc/ax3000.sh unlock
路由器会自行重启,重启后执行
sh /etc/ax3000.sh hack

\6. 挂载 overlay 空间 方便安装各种软件包和你想要的一些功能 通过 SSH 连接路由 B,执行下面的命令:

sh /etc/ax3000.sh mount
自行重启路由器,然后执行
sh /etc/ax3000.sh keep

\7. (可选)更换 dists 源 小米固件内的 dists 源已经非常老旧且不推荐使用,更换到最新源即可享受在线安装 xray-core 等权利 将路由 B 的 /etc/opkg/distfeeds.conf 文件更改为如下内容:

src/gz openwrt_base http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/base
src/gz openwrt_luci http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/luci
src/gz openwrt_packages http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/packages
src/gz openwrt_routing http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/routing

运行 opkg update 后即可愉快食用。


参考资料