Redmi AX6000 路由器解锁 SSH 记录, 主要参考了恩山论坛: [小米其它型号路由器] 【解锁SSH】红米Redmi AX6000开启并固化SSH、Telnet的简单方法(RB06) 这篇文章.
一. 刷入指定系统版本
Redmi AX6000 的系统版本分两个系列: 1.2.X 代表开发版本, 1.0.XX 代表稳定版本, 消费者买到时系统版本都为 1.0.XX
下图是我拿到手之后的版本(1.0.67):
根据恩山论坛帖子介绍, 1.0.67 支持解 SSH, 无需刷入其他版本(若有特殊版本需求可以进入固件集合链接下载).
二. 开启调试模式
登录路由管理后台, 通过 url 拿到 stock, 例如链接为: http://192.168.31.1/cgi-bin/luci/;stok=2193ac10ff21f3278dea441e19a94c123/web/setting/upgrade
,
stock 就是: 2193ac10ff21f3278dea441e19a94c123
.
然后构造请求:
http://192.168.31.1/cgi-bin/luci/;stock={token}/api/misystem/set_sys_time?timezone=%20%27%20%3B%20zz%3D%24%28dd%20if%3D%2Fdev%2Fzero%20bs%3D1%20count%3D2%202%3E%2Fdev%2Fnull%29%20%3B%20printf%20%27%A5%5A%25c%25c%27%20%24zz%20%24zz%20%7C%20mtd%20write%20-%20crash%20%3B%20
这条命令利用了路由器设置时区的漏洞, 漏洞详情可以参考 OpenWrt 论坛: add-openwrt-support-for-xiaomi-redmi-ax6000.
路由器收到请求后会执行:
zz=$(dd if=/dev/zero bs=1 count=2 2>/dev/null) ; printf '\xA5\x5A%c%c' $zz $zz | mtd write - crash ;
将\xA5\x5A\x00\x00
写入crash分区.
三. 重启
执行: http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3b%20reboot%20%3b%20
等待重启完成, 重启完成后路由器指示灯为蓝色闪烁状态.
将
%20%27%20%3b%20reboot%20%3b%20
URL 解码之后得到:' ; reboot ;
.
四. 开启 Telnet
执行:
http://192.168.31.1/cgi-bin/luci/;stok={token}/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 ;
五. 重启
将步骤三的命令重新执行即可, 然后等待重启完成.
六. 开启SSH
电脑端使用命令行工具执行: telnet 192.168.31.1
, 可以无密码登录到路由器, 如图:
执行以下 shell:
# 1. 将 root 用户的密码设置为 admin
echo -e 'admin\nadmin' | passwd root
# 2. 固化 SSH
nvram set ssh_en=1
nvram set telnet_en=1
nvram set uart_en=1
nvram set boot_wait=on
nvram commit
# 3. 永久开启 SSH 登录
mkdir /data/auto_ssh && cd /data/auto_ssh
curl -O https://cdn.jsdelivr.net/gh/lemoeo/AX6S@main/auto_ssh.sh
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
#
如果不想支持 SSH 永久登录, 仅临时性开启, 可以将上面的第三部分命令替换成这个:
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear /etc/init.d/dropbear restart
七. 恢复正常模式
执行:
# 将时区设置成正常值
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
# 关闭调试模式
mtd erase crash
# 重启
reboot
重启完成后, 路由器指示灯由蓝灯闪烁变成长亮. 此时可以通过 ssh 命令登录: ssh root@192.168.31.1
.
若出现提示:
Unable to negotiate with 192.168.31.1 port 22: no matching host key type found. Their offer: ssh-rsa
, 可以 增加参数:ssh root@192.168.31.1 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa
即可.
若觉得麻烦, 不想每次都输入这么长的命令, 可以在配置文件中追加(配置文件在 ~/.ssh/config
):
HOST ax6000
Hostname 192.168.31.1
UseKeychain yes
ServerAliveInterval 30
Port 22
User root
HostKeyAlgorithms = +ssh-rsa
PubkeyAcceptedAlgorithms = +ssh-rsa
保存以后可以直接用: ssh ax6000
命令登录.