1. 开启 Telnet
可以开启 Telnet 的原理是因为
2.28.62版本存在RCE
1.1. 升/降级
下载 miwifi_r4a_firmware_72d65_2.28.62.bin 后,将其传至管理界面更新即可。

1.2. 开刷
顺利运行 remote_command_execution_vulnerability.py 需满足:
- 版本为
2.28.62 - 需要通互联网
- 执行脚本的机器与路由器需要处于同一网段
git clone https://github.com/acecilia/OpenWRTInvasioncd OpenWRTInvasionpip install -r ./requirements.txtpython3 ./remote_command_execution_vulnerability.py有些原生的 python 环境不允许额外装包,可以先开一个虚拟环境再下载
python -m venv venvsource venv/bin/activate
运行脚本后,按照提示输入 IP 、口令、stok 值(管理界面的 url 处可获得),提示 done 即表示成功,默认账户口令为 root/root。
2. 刷入 Breed
为防止误操作变砖需先刷入 Breed
2.1. 备份
同网段的设备 telnet 上路由器后开始备份
┌──(root㉿kali)└─#telnet {route_ip}
root@XiaoQiang:/# mdkir /tmp/backuproot@XiaoQiang:/# cd /tmp/backupdd if=/dev/mtd0 of=/tmp/backup/mtd0-ALL.bindd if=/dev/mtd1 of=/tmp/backup/mtd1-Bootloader.bindd if=/dev/mtd2 of=/tmp/backup/mtd2-Config.bindd if=/dev/mtd3 of=/tmp/backup/mtd3-Bdata.bindd if=/dev/mtd4 of=/tmp/backup/mtd4-Factory.bindd if=/dev/mtd5 of=/tmp/backup/mtd5-crash.bindd if=/dev/mtd6 of=/tmp/backup/mtd6-cfg_bak.bindd if=/dev/mtd7 of=/tmp/backup/mtd7-overlay.bindd if=/dev/mtd8 of=/tmp/backup/mtd8-OS1.bindd if=/dev/mtd9 of=/tmp/backup/mtd9-rootfs.bindd if=/dev/mtd10 of=/tmp/backup/mtd10-disk.binFactory. bin是硬件厂商专为该硬件额外优化信号的重要配置文件
在 pc 上开启 9999 端口
┌──(root㉿kali)└─# nc -lvnp 9999 > backup.tar用 nc 命令将备份文件传回 pc
root@XiaoQiang:/tmp/backup#tar cf - backup | nc {pc_ip} 99992.2. 开刷
mkdir /tmp/flashingcd /tmp/flashing小米 4 a 千兆版的芯片是 mt7621,下载与其适配的固件:
wget https://breed.hackpascal.net/breed-mt7621-pbr-m1.bin验证一下完整性
md5sum breed-mt7621-pbr-m1.bin24e62762809c15ba3872e610a37451a3 breed-mt7621-pbr-m1.bin刷入
mtd -r write /tmp/flashing/breed-mt7621-pbr-m1.bin Bootloader等待一会后,可以将路由器的 WAN 口与主机相连接,访问 192.168.1.1 或者自己另外配 IP 再去访问
如果提示
请求的页面不存在,换个IE内核的浏览器就行了

2.3. 固件备份
将 eeprom 与编程器固件进行备份

3. 刷入 openwrt
Breed 的默认引导地址并不是从
4a的0x180000开始写的,因此使用 GUI 更新固件会导致设备一直重启
这里使用 25.12.4 版本的 openwrt
breed> wget https://{pc_ip}/25.12.4.bin...Length: 7733838/0x76024e (7MB) [] Saving to address 0x80001000...可见固件大小为 0x76024e,需要擦除出一个比 0x76024e 大的空间,这里凑个整选取 0x800000
4a的固件引导地址是从0x180000开始的,所以需要从0x180000开始
breed> flash erase 0x180000 0x800000写入
breed> flash write 0x180000 0x80001000 0x76024e从 0x180000 处启动
breed> boot flash 0x180000如果之前是选择接入
WAN口访问的192.168.1.1,重启后需接回LAN口才能访问
4. 优化
4.1. 启用 Breed 内部环境变量
正常情况下刷新网页后应该就可以见到 openwrt 的登录界面了,但我们需要通过拔插电源,长按 reset 键 5~10 s重新进入 Breed 页面(有任何意外都可通过此操作回到 Breed)。
在 环境变量设置 处选择启用控制,其余配置如下

4.2. 设置启动地址
在 环境变量编辑 处添加键值对,字段为 autoboot.command,值为 boot flash 0x180000
保存后直接重启即可
4.3. 恢复 eeprom
factory 是整个设备的生产信息分区,eeprom 是 factory 分区里的核心子数据(主要是无线校准数据)
wget http://{pc_ip}/Factory.bin擦除并写入
flash erase 0x50000 0x10000flash write 0x50000 0x80001000 0x100005. 总结
理想很丰满,显示很骨感。刷完才发现 overlay 空间小的可怜,根本无法正常跑 openclash,就当个普通的路由系统用吧~

6. Reference
部分信息可能已经过时