杂话

我自己其实有过很久的时间想研究一下路由器怎么刷机跑自己服务了,因为自己的企鹅云快到期了而自己还需要一些比如 git 托管,私有网盘以及私有云音乐之类的服务要用,之前并没有折腾过这些东西所以完全不了解于是就想找个机会了解下,但由于不是刚需所以就一直拖着没动了。前不久换工作后,由于工作有做弱网测试需求的缘故需要折腾公司的某个斐讯路由器刷机,于是大战了一天的 openwrt 构建1,也熟悉了一下相关的一些东西,但其实还是没了解太多。后来和家里联系的过程了解到家里的路由器的断线变得愈加频繁,于是家里计划买个路由器,想了下索性我买得了,就开始打算买个能刷的路由器玩玩看。

因为其实对硬件行情本身不是特别感兴趣,所以还是去问了对这方面异常关注的特技狼童鞋。那边推荐的型号是小米的 红米路由器 AC2100 型号 ,理由是价格不贵,能刷,并且性能相对也说得过去。想了一下就它了,于是买了两个相同型号的路由器,一个寄到家一个寄到我这儿,就总算有东西能折腾了。因为确实不是刚需,所以东西到手后也没有立即开始折腾的欲望,而是拖到了现在,于是本篇目的就是大致记录下步骤,以备后续查阅。

步骤

不提国内乱七八糟论坛和视频教程里不明就里的步骤和操作,其实 OpenWrt 官网上的 Xiaomi Redmi Router AC2100 硬件信息页面 页面就非常完整的介绍了整个过程实际要做的事情以及原因了,于是大致步骤也是按那个步骤来的。我的操作环境是我的 KDE/Archlinux 中,而绝大多数步骤基本和官网没有任何出入,只需要照做就行了。如果你还没有看过 openwrt 官网的步骤描述,建议先过一遍在看下面的内容,下面也只概述大致步骤以及实际的意义。

首先准备环境,pacman 直装了 python-scapyopenbsd-netcat 之类的包,把步骤提及的 python 脚本也保存好备用,然后获取了列举的两个固件,mipsel 的 busybox 二进制文件以及 breed bootloader 固件,就可以准备开搞了。当然两个脚本写到的网络接口名称还是得改的,我的是 enp8s0,看实际情况改就是了。

步骤和官网的也基本没有出入,首先在 KDE 的网络设置里新建了个配置,填好 IP,然后两根网线一根环接 WAN 和 LAN1,另一根 LAN2 和电脑连接,然后连接刚刚配置好的网络,路由器通电开机,等一小会儿本机 ping 得通路由器了,就可以正式开工了。

由于是 PPPoE 漏洞利用,所以我们要做的事情就是启动 pppoe-simulator.py 脚本以及 netcat -nvlp 31337 开启监听,然后在希望利用时运行 cve.py 来利用漏洞以在 netcat 监听处获得一个反弹的 shell,用来把要刷的东西写进去之类。但由于利用后的反弹 shell 很不稳定,会在几秒内就断开,为了获得一个稳定的环境,我们做的事情就是在这个短暂的 shell 期间把我们准备好的 busybox 丢进去,然后用它启动一个 telnetd 来供我们后续稳定的连接。

能让路由器环境获取本地的资源,简单的方法就是本地跑一个 http 或 ftp 服务器来提供对应的文件了。接下来我们提前复制好脚本来做“wget 下载我们的 busybox ,添加可执行权限然后用它跑起来 telnetd”的事情,运行 cve.py 获得反弹 shell 并把脚本粘贴进去执行,接下来就可以 telnet 来连接一个稳定的 shell 了。当然这个步骤过程我还是遇到点小问题的,最初尝试并未在 netcat 下成功得到反弹的 shell,于是检查了 cve.py 中对 MAC 地址的判断,按实际情况追加了我的路由器的 MAC 前半段(... or src.startswith("54:48:e6")),再跑就正常了。

完毕后 telnet 连接我们刚刚准备好的稳定的 shell 环境,做后续处理就好了。仍然是 wget 把固件下好,做一些配置,写入固件然后重启路由器。当然这一步除了官网所做的写入固件操作外,我还顺带把 breed 也写进去了(官网页面下面有单独的 breed 一节写做法),后续重启就算大功告成了。

不过有一件事其实我没有意识到,截至目前(2020/08/02)openwrt 官方并没有提供适用于红米 AC2100 设备的稳定版固件,所以我下到并刷入的其实是 snapshots 快照版,而快照版和稳定版的区别就是快照版不带 LuCI。于是我就 ssh 连上 openwrt 后尝试配置成 AP 模式(参考),但完事儿反应过来 IP 变了(因为由上层路由分配 IP 了),但上层路由是运营商提供的猫,后台看不到所连接的所有设备的情况2,我没法重新连上路由器3,于是只得想别的办法。

由于路由器确实不是刚需,我也有计划做一些别的事情,所以就打算先选一些比较懒省事儿的办法,自然而然就回落到了我不太想选的方案——刷现成包。于是找到了 padavan 的对应包(RM2100),进 breed 重刷,然后就顺利的可以用了。

其它杂话

尽管刷了 padavan 但这里只是最近不想花太多时间在这个路由器上而选择的方案,如果有时间的话可能还是会去折腾 openwrt,自己动手的话,很多地方会了解的更透彻一些,也更方便我自己灵活利用这个设备。

在着手开刷之前,自然是检索资料。因为是国内的设备,自然而然选择了使用国内的搜索引擎进行搜索,得到的却是非常失望的结果——不写原因,提供特定平台的步骤——如果完全不知道自己在做什么就去做,如果中间出现故障,我怎么知道我应该怎么处理?后来甚至翻到了一个老毛子的教程帖写的都比国内检索到的结果步骤要清晰。当然,今天开刷前还是鼓哥了一下,直接找到了 OpenWrt 官网硬件页面的描述,非常清晰明了,于是感叹,国内的东西,文档也不是国内写的好,确实可悲。

说起来我其实一直很讨厌国内网络搜索资料的结果,要么是视频教程(信息熵过低的二手资讯,有的还很少讲做法的实质原因4),要么是各地转载的内容,不写原因只写怎么做,再配上乡土特色推广网盘转载而不标注来源,再配上什么注册可见回复可见的就更恶心了。若不是 padavan 在固件内附的路由后台写了官网地址,我甚至不知道 padavan 固件的正常获取渠道是哪里。检索信息却找不到来源,看到原理一探究竟的难度也变得越来越大,这样的事情似乎随着时间的推移变得越来越严重了…这种情况,会有好转的一天吗?

参考资料

惯例,2020年8月2日,20点05分。

  1. 其实给公司的斐讯装 openwrt 的过程一半多的时间花在 make download 上,显而易见的特色网络缘故。当然,公司那次选择折腾 openwrt 并非因为我想折腾才去折腾的,而是因为斐讯的 ROM 太小了,同事从网上翻到的现成包(不是 openwrt 官网的包)又太大,不仅不带弱网测试工具而且还没法手动装。尽管解决这种问题的最简单的办法是找 openwrt 官方的版本(不带乱七八糟的功能所以不会撑满 ROM 空间)然后 opkg 装对应的工具,但当时经验并不多,甚至不知道官网提供了那款路由器的适配,于是当时还是选择了手动从源码构建的方式,直到后来才知道有简单办法… 

  2. 其实是可以的,机器后面所附的用户名密码进去是看不到的,从网上搜到实际有管理员账号,用那个登上可以看到,当然这个是我刷 padavan 后才反应过来的事情。 

  3. 其实也是可以解决的,比如找个工具扫 IP 或者干脆重刷。但确实比较懒,不想花太长时间在这个上,如果这样搞好后接下来可能还有一堆东西要处理,就决定选一些比较省事的方案处理了。 

  4. 并不是全盘否定视频教程,在介绍操作向的内容时,以及一些别的场景下,视频会是更合适的载体,但类如编程,用xx库,以及这里的刷路由器的步骤,显然视频教程不是好的选择,学什么都要找视频教程的风气到底是啥时候开始大肆流行的呢?