小米路由器4A百兆版刷OpenWRT

我其实不怎么喜欢写这种教程类的博客,不过苦于刷机过程中资料过少,踩坑过多,特此系统性的捋一下,分享给有缘人,我手上的型号是百兆版的,4A千兆版刷OpenWRT的流程也基本一样,不过需要注意镜像地址什么的自行替换一下。

前提:需要安装 gitpython3 以及熟悉基本的终端操作。

OpenWRT

首先我们要对 OpenWRT 有一些最基本的概念,OpenWRT 是一种 Linux 发行版,本质上是一个操作系统,和我们的常见的 WindowsAndroid 等概念是一类的,只是针对路由器这种场景做了特殊的优化。

路由器虽然比较小,很迷你,但是CPU、内存、IO等五脏都是俱全的,只是通常来说会阉割掉一些不必要的功能,以便于降低配置和功耗这样我们才能以百元左右的价格买到,同时就算 24h 长期开机也太过担心电费。

理论上我们也能在配置足够,硬件兼容的路由器上跑 Windows 系统,同时我们也可以用一台现成的大电脑改改配置来当路由器使用,这都是可以的。

所以我们给路由器刷 OpenWRT 的行为,其实和我们平常给 PC 重装 Windows 的操作本质是一样的:给一台冯诺依曼架构的机器装载一个操作系统来更好地控制其硬件行为。

找固件(系统镜像)-> 刷入,即可,只是固件可能没那么通用,刷入的流程也没有统一的标准而已。

找到合适的OpenWRT固件

首先,我们需要一个 OpenWRT 的系统镜像,不同的路由器可能 CPU、网卡等硬件设备都不一样,所以需要不同的指令集和驱动,同时嵌入式的小空间决定了我们不能写一个超级大的镜像兼容所有的场景,因此我们需要找到最适合我们路由器的那一款固件。

固件可以自己编译,参考官网教程:https://openwrt.org/zh/docs/guide-developer/quickstart-build-images,OpenWRT提供了一个可视化的CLI编译配置工具,照着来就是了,自由度会高一些,可以自己提前把一些特性打开,编入一些内核模块等。

同时 OpenWRT 也提供了一些已经编译好的固件供大家使用:https://openwrt.org/toh/views/toh_fwdownload,图省事的话,我们直接使用即可。

image-20201208184834711

可以搜到我们的小米4A百兆版也在列表中(注意和 Gigabit Edition千兆版区分开),使用了一颗联发科MT7628的处理器,我们在表格后面找到它的稳定版固件下载即可,注意尽量不要下 snapshot 版本的,snapshost 是主分支最近打出来的包,我之前下了一个最新的分支,Linux内核版本居然是才发布半个月的 5.4.80,稳定性和兼容性都有待验证。

我们就直接用这个稳定版的固件:

http://downloads.openwrt.org/releases/19.07.4/targets/ramips/mt76x8/openwrt-19.07.4-ramips-mt76x8-xiaomi_mir4a-100m-squashfs-sysupgrade.bin

先记住这个下载地址。

image-20201208185510933

另外考虑到国内下载速度,如果觉得很慢的话,可以使用中科大的镜像源,把URL中 downloads.openwrt.org 替换成 mirrors.ustc.edu.cn/openwrt即可:

http://downloads.openwrt.org/releases/19.07.4/targets/ramips/mt76x8/openwrt-19.07.4-ramips-mt76x8-xiaomi_mir4a-100m-squashfs-sysupgrade.bin

=>

http://mirrors.ustc.edu.cn/openwrt/releases/19.07.4/targets/ramips/mt76x8/openwrt-19.07.4-ramips-mt76x8-xiaomi_mir4a-100m-squashfs-sysupgrade.bin

远程登录到路由器

不像其他小米路由器升级到开发版固件即可直接开启远程登录功能(SSH),小米4代的路由器可能因为都比较新还没来得及维护,所以都没有开发版的固件,我们只能尝试通过其他的方式来登录到路由器。

小米路由器系列路由器存在一个远程执行漏洞:CVE-2019-18370 ,小米魔改的 luci 管理后台有一个接口可以注入 shell 命令执行,我们就可以通过这个漏洞远程执行脚本开启 ssh、telnet 等远程登录服务,或者通过 nc工具配合管道反向shell登录。有人写了一个开放远程登录的脚本:https://github.com/acecilia/OpenWRTInvasion,我们可以利用这个脚本来一键登录到路由器上执行我们的刷机命令。

这个脚本有 0.0.20.0.1 两个版本,默认是推荐 0.0.2 版本会省事一点,但是我使用 0.0.2 版本并没有成功,可能是依赖的一些 github 上面的脚本下载失败了,不过通过 0.0.1 倒是登上去了,也就没有仔细琢磨了,这里都把过程给大家列一下,可以都试试。

升级到有漏洞的版本

同时经过社区验证,适用于固件版本:2.18.512.18.58,其他版本可以先试一下如果不行的话刷到这两个版本就好,我自己实践在 2.18.58 成功运行了,对应的固件包我传到网盘上了大家有需要的可以自取:

小米4A路由器百兆版2.18.51固件:https://pan.baidu.com/s/1DXHZx9puoN9kEY7BDymxqA
小米4A路由器百兆版2.18.58固件:https://pan.baidu.com/s/1DXHZx9puoN9kEY7BDymxqA
提取码:debw

下载好后点击常用设置->系统状态->手动升级即可,详细步骤可以参考官网教程,这里就不赘述了。 img

执行脚本

正式开始执行脚本之前我们还需要或者一个东西 stok,打开我们的路由器管理后台,登录上去,找到地址栏形如 stok=ef443ae52875a6a442913bbbf38872 的这一串东西,其中的 ef443ae52875a6a442913bbbf38872 就是 stok,也就是我们登录的凭证,待会儿的脚本会需要用到这个参数来绕过路由器的登录认证限制。

image-20201208221513260

我们继续,先下载这个代码仓库:

git clone https://github.com/acecilia/OpenWRTInvasion
cd OpenWRTInvasion

下面我们就可以来运行脚本了。

方式一:0.0.2

  1. 安装依赖

    pip3 install --upgrade pip
    pip3 install -r requirements.txt
    
  2. 执行脚本

    python3 remote_command_execution_vulnerability.py
    

按照提示输入路由器IP地址,如果没有改过的话不用管直接回车就行,然后输入 stok 值。

  1. 尝试远程登录

    telnet 192.168.31.1
    

用户名为 root 密码为空,如果能成功登录的话那就直接跳到“安装固件”部分即可,如果提示 Connection Confused,说明启动 telnet 服务失败了,我们可以尝试第二种方式。

Alt Text

方式二:0.0.1

我们需要先切换到0.0.1版本然后再执行脚本:

# 切换版本
git checkout -f 0.0.1
# 安装依赖
pip3 install --upgrade pip
pip3 install -r requirements.txt
# 运行脚本
python3 remote_command_execution_vulnerability.py

image-20201211160654006 然后这里提示会需要在另一个窗口开一个Shell 用 nc 工具监听指定的接口,等待路由器将shell界面反向连接过来:

/usr/bin/nc -l 4444

开好了之后回到这个Shell继续输入路由器IP,stok即可,我使用这种方式成功了,脚本执行完后回到 nc 的那个窗口会发现已经可以执行命令了。 Alt Text

安装固件

切换到 tmp 目录(其他分区空间不够放不下镜像):

cd /tmp

翻出来我们上面复制的那个固件地址,下载固件,如果是自己编译的话,找个地方放着把地址填进来就行:

curl -o firmware.bin http://mirrors.ustc.edu.cn/openwrt/releases/19.07.4/targets/ramips/mt76x8/openwrt-19.07.4-ramips-mt76x8-xiaomi_mir4a-100m-squashfs-sysupgrade.bin

安装:

# 刷机有风险,请慎重
mtd -e OS1 -r write firmware.bin OS1

等待命令执行完成后,我们安装 OpenWRT 就成功了~ 我们可以 ssh 登录到路由器上验证一下:

image-20201211161225985

扩展OpenWRT

OpenWRT 装好之后,是开箱即用的,我们连上网线就能直接上网了,不需要什么额外的配置,不过我们肯定不是冲着温饱来的,可以尽情的运行自己的代码才是最吸引我们的。

Ubuntu 有 apt,CentOS 有 yum,而 OpenWRT 则使用 opkg 来管理软件包,所以我们可以直接使用 opkg 命令来安装一些有用的插件,比如神器Luci:

ssh root@192.168.1.1
opkg update && opkg install luci

然后我们就可以打开管理页面(默认是:http://192.168.1.1)来对路由器系统进行可视化的管理了。

image-20201211161301530

想要安装其他插件的话,到控制台打开软件包管理界面,点击下载软件列表,然后自行搜索安装即可: image-20201223113944508

OpenWRT 本质上是一个图灵完备的Linux系统,所以除了官方提供的软件包之外,我们也可以运行自己的代码,不过我们这款路由器的 CPU 是 mips 架构的,跟我们个人电脑通常使用的x86架构不同(Apple Silicon mac 除外),而路由器那一点点空间用不足以进行编译,所以我们需要在自己的电脑上交叉编译出对应的二进制包然后 scp 上去才行。

Golang 代码的交叉编译就非常简单,加几个环境变量就行:

# 开启软浮点 & 小端mips架构 & linux内核API
GOMIPS=softfloat GOARCH=mipsle GOOS=linux go build main.go

如果是 C/C++的话,可以在官网下载SDK工具链进行交叉编译:https://openwrt.org/docs/guide-developer/using_the_sdk,或者自己从源码编译也是可以的。

OpenWRT 还有很多的功能可以去探索,比如:

  • frp内网穿透: 你可以在自家电脑或者路由器上部署一个公网可达的服务
  • 广告过滤:网络级别的广告过滤
  • VPN:路由器上装一次,所有设备皆可获得VPN能力
  • 更强大的网络管控:iptalbes、dnsmasq 能帮助你为所欲为的管控你的网络
  • 私有云盘搭建:找一块闲置的硬盘挂载上去,就可以获得安全不限速的云端数据存储服务

Have fun on OpenWRT~