固件降级

首先需要降级固件版本到 1.0.336,下载地址

开启 ssh

降级成功后从网页登录小米路由器后台,F12 进入控制台,粘贴如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function getSTOK() {
let match = location.href.match(/;stok=(.*?)\//)
if (!match) {
return null
}
return match[1]
}

function execute(stok, command) {
command = encodeURIComponent(command)
let path = `/cgi-bin/luci/;stok=${stok}/api/misystem/set_config_iotdev?bssid=SteelyWing&user_id=SteelyWing&ssid=-h%0A${command}%0A`
console.log(path)
return fetch(new Request(location.origin + path))
}

function enableSSH() {
stok = getSTOK()
if (!stok) {
console.error('stok not found in URL')
return
}
console.log(`stok = "${stok}"`)

password = prompt('Input new SSH password')
if (!password) {
console.error('You must input password')
return
}

execute(
stok,
`
nvram set ssh_en=1
nvram commit
sed -i 's/channel=.*/channel=\\"debug\\"/g' /etc/init.d/dropbear
/etc/init.d/dropbear start
`
)
.then((response) => response.text())
.then((text) => console.log(text))
console.log('New SSH password: ' + password)
execute(stok, `echo -e "${password}\\n${password}" | passwd root`)
.then((response) => response.text())
.then((text) => console.log(text))
}

enableSSH()

回车,并在弹出的窗口输入 ssh 密码

连接 ssh

终端输入 ssh root@192.168.31.1,输入密码后建立连接

支持升级

方案一

每次升级后手动开启 SSH 和 dropbear

原理:小米路由器固件升级后, /etc/firewall.user,此文件在系统升级后不会被重置

终端输入

1
echo -e "\nsource /etc/basic_settings/basefile.sh" >> /etc/firewall.user

创建 basic_settings 文件夹、basefile.sh 文件、my_script.sh 文件

1
2
3
4
5
mkdir /etc/basic_settings
touch /etc/basic_settings/basefile.sh
touch /etc/basic_settings/my_script.sh
chmod 755 /etc/basic_settings/basefile.sh
chmod 755 /etc/basic_settings/my_script.sh

编辑 /etc/basic_settings/basefile.sh 填写以下内容

1
2
#!/bin/sh
echo "source /etc/basic_settings/my_script.sh; exit 0" > /etc/rc.local

编辑 /etc/basic_settings/my_script.sh 填写以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh

#check ssh
ver_flag="$(uci -c /usr/share/xiaoqiang get xiaoqiang_version.version.CHANNEL)"
if [ "$(nvram get ssh_en)" != "1" -o "$ver_flag" == "release" ]; then
nvram set ssh_en=1
nvram commit
uci -c /usr/share/xiaoqiang set xiaoqiang_version.version.CHANNEL='stable'
uci -c /usr/share/xiaoqiang commit xiaoqiang_version.version
/etc/init.d/dropbear enabled
if [ $? == "1" ]; then
/etc/init.d/dropbear enable
fi
/etc/init.d/dropbear restart
echo -e "admin\nadmin" | passwd root
fi

之后可以选择手动从官网下载安装包升级,默认的 ssh 密码为 admin

方案二

直接固化 SSH

首先查看 bdata 分区的位置,刷入解锁脚本(A5 5A 00 00)

1
sh -c "nanddump -f /tmp/crash.bin /dev/$(cat /proc/mtd | grep '"crash"' | grep -oE '^mtd[0-9]{1,2}') >/dev/null 2>&1 && echo -en '\xA5\x5A\x00\x00'>/tmp/unlock.bin&&tail -c+5 /tmp/crash.bin|cat /tmp/unlock.bin - > /tmp/crashunlock.bin && mtd write /tmp/crashunlock.bin crash"

重启

1
reboot

开启 telnet、ssh、uart

73 73 68 5F 65 6E 3D 31 00 75 61 72 74 5F 65 6E 3D 31 00 74 65 6C 6E 65 74 5F 65 6E 3D 31 00

ssh_en=1.uart_en=1.telnet_en=1.

1
2
3
4
5
6
sh -c "nanddump -f /tmp/bdata.bin /dev/\`cat /proc/mtd|grep -i 'Bdata'| grep -oE '^mtd[0-9]{1,2}'\` >/dev/null 2>&1"
sh -c "dd if=/dev/zero of='/tmp/bdata1.bin' ibs=65532 count=1 > /dev/null 2>&1 "
sh -c " echo -en '\x73\x73\x68\x5f\x65\x6e\x3d\x31\x00\x75\x61\x72\x74\x5f\x65\x6e\x3d\x31\x00\x74\x65\x6c\x6e\x65\x74\x5f\x65\x6e\x3d\x31\x00' > /tmp/bdata2.bin"
sh -c "head -c1000 /tmp/bdata.bin|tail -c+5|tr '\x00' '\n'|sed -E ':a;N;\$!ba;s/\n+/\n/g'|head -n-1| sed -r '/^(telnet_en|ssh_en|uart_en)=/d' > /tmp/bdata3.bin"
sh -c "cat /tmp/bdata3.bin|tr '\x0a' '\x00'| cat - /tmp/bdata2.bin > /tmp/bdata4.bin"
sh -c "dd conv=notrunc if=/tmp/bdata4.bin of=/tmp/bdata1.bin >/dev/null 2>&1 && gzip -1 -c /tmp/bdata1.bin | tail -c8 | head -c4 | cat - /tmp/bdata1.bin > /tmp/bdata.mod.bin"

重新写入修改好的脚本

1
mtd write /tmp/bdata.mod.bin Bdata||mtd write /tmp/bdata.mod.bin bdata

重启以后可以通过

1
bdata show

查看是否开启成功,即末尾有显示:

……..
……..
ssh_en=1
uart_en=1
telnet_en=1

最后执行清除解锁命令:

1
2
3
mtd erase crash

reboot

结束以后恢复出厂设置

AX1800 的 ssh 固化已完成,每次升级固件或重置固件都需要登录 telnet

telnet 的账号密码

账号:root

密码:根据 SN 号计算,见:小米 AX1800 通过 SN 计算初始密码)

在 telnet 中开启 ssh

1
2
3
4
5
sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear

/etc/init.d/dropbear start

echo -e 'admin\nadmin' | passwd root

设置之后,telnet 和 ssh 的账号密码如下

用户名:root

密码:admin

方案三

前提条件:固件自带 bdata 命令,执行命令查看

1
which bdata

有输出就说明固件自带 bdata 命令,接着执行,之后重启

1
2
3
4
bdata set telnet_en=1
bdata set ssh_en=1
bdata set uart_en=1
bdata commit

我测试没有通过,重启失效

参考

小米 AX1800 开 SSH 权限

关于小米路由器升级系统保留 SSH 的简单方法(RedmiAX5 实验)

命令行解锁 Crash 分区及 Bdata 分区固化