MIS OpenWrt固件刷入及相关实验
曲折的学习笔记
实验目的
- 为路由器刷入openwrt系统
- 在openwrt上安装软件,开通ssh,AP服务等;
- 在openwrt上安装auditord,配置相关文件,抓取ftp、telnet和无线网卡wifi信号嗅探的内容,发送到外置服务器,并接收。
- 在openwrt上安装privoxy,完成配置文件,实现对http协议的js代码注入功能。
实验环境
- 所用硬件:
TP-LINK WR840N v10.1TP-LINK WR841N v8小米路由器4A 100M小米路由器3G v1 - 主机:win 10
- 虚拟环境:kali 2021.4
实验步骤
一、刷机
写在前面:这篇文章是我第一次接触路由器固件刷机和相关知识,在一切开始之前我想要提醒所有初学者一句:如果你找不到完全对应你手上路由器相应版本的固件——从型号到版本号都是,千万不要认为可以随便找一个差不多的来用,这只会导致你的路由器因为接受了不正常的固件升级而导致损毁,通常这样的损毁在没有提前准备(例如breed)时是彻底的且不可逆的,俗称刷砖了,这会使你的路由器彻底无法使用。
ps: 要是实在搞不清楚怎么编译的话,就看看lean做的这个仓库吧,作为最终解决方案
欢迎来到Lean的Openwrt源码仓库!
踩坑的第一台(仅供参考,不建议学)
为虚拟机创建编译环境,依次输入以下指令
sudo apt-get install g++ sudo apt-get install libncurses5-dev sudo apt-get install zlib1g-dev sudo apt-get install bison sudo apt-get install flex sudo apt-get install unzip sudo apt-get install autoconf sudo apt-get install gawk sudo apt-get install make sudo apt-get install gettext sudo apt-get install gcc sudo apt-get install binutils sudo apt-get install patch sudo apt-get install bzip2 sudo apt-get install libz-dev sudo apt-get install asciidoc #这条的时间会久一点 sudo apt-get install subversion sudo apt-get install sphinxsearch sudo apt-get install libtool sudo apt-get install sphinx-common
下载OpenWrt源码
笔者在官网上找的最新的源码下载方式
git clone https://git.openwrt.org/openwrt/openwrt.git
下载完成后,在文件夹内打开终端,添加软件扩展包,但作为一个将feeds.conf.default修改为feeds.conf:
cp feeds.conf.default feeds.conf更新扩展,安装扩展:
./scripts/feeds update -a./scripts/feeds install -a测试编译环境:
make defconfig
接下来就可以直接用
make menuconfig编译自己的固件了,注意此时你的虚拟机屏幕不能太小,否则会报错,面板的解释可以看这篇文章
报错信息:
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make: *** [/home/kali/Desktop/openwrt/include/toplevel.mk:134:menuconfig] 错误 1
编译时,我选用的是ppt上有的TP-link WR840n,购买时只买到了v10版本,拆开路由器后,得知芯片型号为MEDIATEK MT7628KN,因此在界面选定相关数值:在
Target System选择MediaTek Ralink MIPS, 在Subtarget选择MT76x8 based boards, 在Target Profile选择TL-WR840N v5。 保存键上按两次回车然后退出。

上图的时间预计已经很能说明问题了,总之,在漫长的等待之后,我完成了固件编译,然而最后的结果却很不好——不论怎么尝试,都没有办法将固件正常刷入路由器。
在高强度搜索解决方案后,这篇链接或许能够解答我的疑惑——为何现在已经很少看到玩硬改路由器的了?硬件的大幅度缩水或许是主要原因,这款路由器甚至没有独立的内存,而全靠芯片内置的可怜的8M内存,以下是这位博主的原话:
这FlashROM规格是1M。不过不要指望用编程器刷个ROM换上去就行。这货内存没法硬改,而且这货可能有部分CFE数据是写在CPU里面的,编程器读下来的固件未必刷了能用。
换句话说,这路由器不能用来刷OpenWrt系统,我们必须换一台。
笔者后记:这篇文章是我第一次了解刷路由器的固件相关知识,比如刚写到这里时,我还不明白如果你在openwrt的官网上都只能找到这款840n型号路由器的v2-v5版本的固件、而且在源码里尝试编译都找不到同样的v10型号的话,你就基本可以断定这台路由器刷不了机了
踩坑的第二台
在意识到这款路由器无法使用后,新路由器的型号是TL-WR841N v8,你可以在官网这里下载到它的相关固件,注意第一次刷机要下载的是中间的“安装固件”而不是“升级固件”。

看得出来这个东西也有些年头了,不仅自带的管理版本较低,而且刚到手上的时候也特别脏。
虽然和实验无关,但我还是特别想强调一下它有多脏——上面灰尘遍布;下面还有血污,可能是被压死的蚊子;里面还有异响,可能是进了小石子;连带着配的电源线和网线都像是从土坑里刨出来的,擦了我半包湿纸巾才看清楚具体型号和指示灯,不论是谁在读这篇文章,我个人建议还是买新的好,不论是openwrt网站的支持还是实际使用体验都会好不少,真的贵不了几个钱

在官网上我们可以看到这个路由器因为硬件的落后已经不推荐在未来使用了,当前的固件版本(17.01.7)就是它最后一次被支持的版本。通电后长按RESET键直到指示灯开始闪烁,路由器会自动完成重置,在浏览器中输入192.168.1.1,用户名密码都是admin,我们就正常进入路由器管理页面了。

然后我们就发现问题所在了——内带的管理系统版本实在是太老了,事实上,我翻了它的日志,上面写着它是06年1月份装入系统的。所以和网上的大多数教程不一样,我们不能在系统工具-软件升级处直接选择固件传bin文件上去,配置处倒是可以选择文件,但是它会给你说直接传固件这样太大了,经查询笔者了解到只能先将其交叉编译成ipk文件,上传进去然后再做打算。
实在有点超纲了,我决定再搞一台来。
踩坑的第三台
这次的路由器是小米路由器4A百兆版,它的后台管理页面是192.168.31.1,用网线连接LAN口即可访问。要特别注意的是,接下来采用的刷机方法需要用到小米路由器自身固件存在的漏洞,据社区讨论,该型号的路由器适用于固件版本:2.18.51 和 2.18.58,本次实践将在 2.18.58 环境下运行,对应的固件包我已经传到网盘上了,其中有小米路由器 2.18.58 的固件以及适用于该型号路由器的openwrt固件 19.07.4 ,有需要的可以自取:
链接:https://pan.baidu.com/s/1cgCbJFs1YtZDqSDfwFQ7-Q
提取码:n6gm
官网下载:https://www.miwifi.com/miwifi_download.html #如下图

那么在下载好后点击常用设置->系统状态->手动升级即可,详细步骤可以参考官网教程,非常简单,笔者这里就不赘述了。正式开始执行脚本之前我们还需要拿到一个东西,stok,打开我们的路由器管理后台,登录上去,找到地址栏形如 stok=d603030fa96037b4fe9a10173e2e6e24 的这一串东西,其中的 d603030fa96037b4fe9a10173e2e6e24 就是 stok,也就是我们登录的凭证,待会儿的脚本会需要用到这个参数来绕过路由器的登录认证限制,这也是我们需要特定版本固件的原因。
当确认固件版本之后 不用确认了……笔者在完全按照官网教程的操作下,把路由器刷砖了,系统状态灯橙色常亮,重置键没有反应,问题不明,笔者报了返修,已经送走了,希望小米工程师能解答我的疑惑。
有机会再尝试吧,事到如今,只能再搞一台了?

后续:三天后,工程师收到了货,于是看都没看,直接甩了一台新的给我?
第四台
这一台是二手的小米路由3G,v1版本。管理后台仍是192.168.31.1,固件选择开发板(最新的更新于2018年10月30日),网址仍是这个,然后登入路由器后台在线升级,常用设置->系统状态->手动升级即可,详细步骤可以参考官网教程,不过多赘述了,到常用设置->系统状态->系统版本,确认路由器ROM版本变成了2.25.124,继续下一步。

刷好开发版固件后,准备刷openwrt,首先要做的是开启路由器的SSH访问,方便后续操作。
这里需要注意,路由器必须绑定一个小米账户,才能开SSH,不然就会像这样。

去这里 https://d.miwifi.com/rom/ssh 找到路由器开启SSH的ROM,点击下载工具包,按照提示操作即可。这个页面里有详细步骤,笔者这里偷懒就不写了
路由器重启完成之后就可以通过下面的命令连接到路由器上折腾了,密码就是工具包下载页面提供的密码,每个路由器都不一样。
ssh root@192.168.1.1
正常的话,输入上面的代码之后,你应该能看到下面的样子,这是在主机上做的测试,所以是dos画面

接下来我们准备一下编译固件,openwrt文件夹里打开终端,make menuconfig编译,选项如下图所示

同时,我希望能安装上luci,方便为openwrt做中文化,如下图所示

因此在编译前,需要在make menuconfig里加上一些东西,如下图所示

LuCI --->
Collections --->
<*> luci
<*> luci-ssl
Translations--->
<*> luci-i18n-chinese //支持中文
<*> luci-i18n-english
保存之后输入make V=99,等吧。
当然你也可以选择在官网上直接下载固件,这样会快很多,只是luci要用opkg的方式重新编译,链接在此
此时,接下来的操作务必用网线连接你的路由器进行,因为OpenWrt刚刷好之后,wifi是disable的状态,连不上的
最后用如下的命令把固件复制到路由器上:
scp *你的固件* root@192.168.1.1:/tmp
如果你最后用的是官网的固件,那么注意,两个固件都要有
scp openwrt-21.02.2-ramips-mt7621-xiaomi_mi-router-3g-* root@192.168.1.1:/tmp # 批量复制> mtd write openwrt-21.02.2-ramips-mt7621-xiaomi_mi-router-3g-squashfs-sysupgrade.bin kernel1 > mtd write openwrt-21.02.2-ramips-mt7621-xiaomi_mi-router-3g-rootfs0.bin rootfs0 > nvram set flag_try_sys1_failed=1 > nvram commit > reboot用的是自己编译的软件同理,不多赘述了
耐心等待,路由器不能断电,电脑提示网络连接之后,如果你用的是和我一样的luci过的固件应该可以直接上后台了,如果你用的是官方网站的固件可以先用ssh连上路由器,OpenWrt默认是没有root密码的,我们连上去之后用passwd设置一下:
ssh root@192.168.1.1
passwd # 之后按照提示操作就好了
设置好密码之后,执行web界面的安装:
opkg update # 这一步是在更新软件源,跟ubuntu下的apt update命令是一样的作用
opkg install luci # 安装web界面
opkg install luci-i18n-base-zh-cn # 安装web界面的中文语言包
到这里,OpenWrt的安装和初步设置就完成了。可以去192.168.1.1打开web界面进行进一步的设置了,参照上一次的作业,通过 vim 直接编辑 /etc/config/network 配置文件来设置好远程管理专用网卡的 IP 地址,在config interface 'lan'一栏将option ipaddr改为'192.168.8.1',保存退出,用ifdown eth0 && ifup eth0完成指定网卡 eth0 的重新加载配置生效,无需重新启动系统。
在主机上浏览器输入192.168.8.1验证,完成刷机。

写到这里,光是刷机我就写了3460+词了,参考链接就9条……真不容易啊
二、设置ssh,AP

如上图,ssh在安装完成后就已然自带,接下来主要讲述AP设置,首先我们要安装好 usbutils
# 每次重启 OpenWRT 之后,安装软件包或使用搜索命令之前均需要执行一次 opkg update
opkg update && opkg install usbutils
默认情况下,OpenWrt 只支持 WEP 系列过时的无线安全机制。为了让 OpenWrt 支持 WPA 系列更安全的无线安全机制,还需要额外安装 2 个软件包:wpa-supplicant 和 hostapd 。其中 wpa-supplicant 提供 WPA 客户端认证,hostapd 提供 AP 或 ad-hoc 模式的 WPA 认证。
opkg install hostapd wpa-supplicant # 安装完成后重启系统
接下来的配置我建议用Luci界面完成,更简单一些。找到网络-无线,为了使用其他无线客户端可以正确发现新创建的无线网络,以下还有 3 点需要额外注意的特殊配置注意事项:
- 无线网络的详细配置界面里的
Interface Configuration表单里Network记得勾选wan; - 虚拟机的 WAN 网卡对应的虚拟网络类型必须设置为
NAT而不能使用NatNetwork,无线客户端连入无线网络后才可以正常上网。 - 不要使用 Auto 模式的信道选择和信号强度,均手工指定 才可以。

三、编译使用auditord(未成功)
在官网上下载sdk,笔者用的是21.02.2这里的sdk,直接拉到最下方或者在页面内搜索sdk,下载完之后放进linux虚拟机里用下面的命令解压缩
tar Jxvf *openwrt-sdk-21.02.2-ramips-mt7621_gcc-8.4.0_musl.Linux-x86_64*.tar.xz

解压完成之后,我们需要加入环境变量,因为在编译过程中我们需要使用交叉编译环境,才能在Kali中编译出可在Openwrt中运行的程序
vim $HOME/.zshrc
# 将SDK中staging_dir/toolchain/bin添加进环境变量中
# 保存环境变量并使其生效
source $HOME/.zshrc
# 确定环境变量生效
echo $PATH
mipsel-openwrt-linux-gcc -v # 可以先尝试tab补全,如果有输出就说明生效了
export CC=mipsel-openwrt-linux-gcc # 声明所用的交叉编译器环境,保证可兼容

在sdk文件夹中打开终端,输入以下指令
./scripts/feeds update -a #更新包
./scripts/feeds install libuci #安装依赖项libuci
./scripts/feeds install -a #使所有包可用
完成包管理后,在SDK文件夹下 make menuconfig ,键入“/”搜索auditord,可以找到package的位置,进入Utilities,将auditord勾选上,save退出,开始编译


make package/auditord/compile V=99

不出意外的失败了,在仔细查看了报错信息后我发现完全无法解决……不仅是编译环境的问题,还有因为部分依赖包无法访问(可能被墙了,换源也没能解决)导致最后失败,因此实验第三步到此结束。
四、privoxy安装使用
使用opkg管理下载privoxy,并进行以下操作
opkg update
opkg install privoxy
vim /etc/config/privoxy # 修改配置文件,我个人的路由地址为192.168.8.1
# 更改如下内容
list listen_address '192.168.8.1:8118'
list permit_access '192.168.8.0/24'
#保存退出
vim /etc/privoxy/user.filter # 添加js注入内容
# 末尾添加如下内容
FILTER:block-weeds
s|</head>|<script type="text/javascript" src="http://www.tbc.com/tbctest/js/floating/js"></script>$0
# 保存退出
vim /etc/privoxy/user.action # 在action文件中加入过滤绑定
# 末尾添加如下内容
{+filter {block-weeds}}
.*
#保存退出
ptables -t nat -A PREROUTING -s 0.0.0.0/0.0.0.0 -p tcp --dport 80 -jREDIRECT --to-ports
8118 # 添加路由规则
/etc/init.d/privoxy restart # 重启privoxy服务



接下来,随意选择一个还在使用http协议的网站,在网站域名前添加 view-source: 查看源代码,找到我们注入的js语句即可,这里笔者选择的是 by.cuc.edu.cn ,成功完成实验。

至此,本次实验完成。
参考链接
openwrt的sysupgrade和factory固件的区别
在TP-LINK WR841N v7上安装OpenWrt和U-Boot/Breed教程
小米路由器3G刷机教程——不死Breed后台+Padavan固件
