标签 OpenWrt 下的文章

为路由器刷入第三方固件——以ASUS ACRH17刷OpenWrt为例简述其思路

前言

最近翻出一个之前不知放在哪的ASUS ACRH17路由器,而且K2P、新三之类的路由器已经用了很多年了,是时候换一换了。同时感觉华硕原厂的固件功能太少,于是有了刷OpenWrt系统的想法。很多人都知道给电脑重装系统、给手机刷机,但不一定听说过给路由器刷机。那么给路由器刷第三方固件这项活动是因何而起的呢?

当Linksys在2002年发布了使用Linux作为系统内核设计的WRT54G路由器,就为后来第三方固件的流行埋下了种子。转眼2003年3月Cisco收购Linksys。同年6月,Linux内核开发组听说WRT54G固件使用了包含GPL开源协议的Linux代码,遂要求Linksys开源相关部分代码,为此FSF还因此起诉Cisco,最终7月Cisco迫于外界压力开源了WRT54G的固件。至此,极客行动了起来,各种定制的固件和给路由器刷机的行为就流行了起来。后来大浪淘沙,其中OpenWrt、DD-WRT、Padavan、Asuswrt-Merlin(梅林)、Tomato、PandoraBox等固件成为了主流第三方固件项目。

注意:本文主要记录路由器刷入第三方固件的思路,以备日后刷其他型号路由器时参考,而刷固件的操作是因机而异的,随着相关项目的更新,某些操作可能会有变化。为路由器刷入第三方的固件的操作是个需要细心的活。您可能因为误操作、意外等情况损坏设备,所以务必小心操作!笔者不承担您的任何相关风险。

软件和硬件的准备:

  • 连接shell的终端软件:用于通过SSH协议或串行口连接到路由器shell,可以使用PuTTY或其他熟悉的工具。
  • SCP客户端或一个U盘:备份出厂数据或固件时,用于通过网络传输文件到本地,使用scp(Linux),WinSCP (Windows)或其他自己熟悉的软件。或存储到U盘中(需要路由器有USB接口)。
  • 网线、USB TTL转换器:通过网线连接以支持SSH登录、SCP传输文件等。USB TTL线可用于连接路由器主板的TTL调试接口,以访问Shell。

步骤

  1. 准备固件映像
  2. 建立到路由器的shell连接
  3. 备份原厂数据
  4. 刷入新固件

准备固件映像

刷机自然是要先把新固件准备好,这一般来源于论坛或Q群,比如恩山、OP大群、OpenWrt官方Wiki;也可以自己从GitHub拉取项目代码编译,这需要Linux系统并且有些难度。

根据不同机型,我们可能需要准备:

  • 最终使用的系统固件(一般为后缀包含squashfs-sysupgrade的固件)
  • 中转固件(一般是类似Linux Live CD那种RAM加载的临时系统固件,后缀为initramfs-kernel.bin;或是专用于从官方固件过渡到OpenWrt的系统固件,后缀包含factory字样)
  • Bootloader固件(某些情况下我们需要刷入新的Bootloader,比如不死Uboot、Breed等)

并非在所有情况都需要准备以上所有固件,具体选择哪些文件,需要视情况而定。

比如,之前接触的Cisco Meraki Z1,其原厂固件非OpenWrt,不支持直接刷入sysupgrade,便有大佬编译了initramfs-kernel固件供大家使用DD指令刷入作为中转,然后通过该固件中提供的sysupgrade指令支持刷入最终的squashfs-sysupgrade固件。

而像ACRH17,虽然该机器保留原厂的Bootloader可以使用原厂提供的救援工具刷回原厂,但网友大多都是要刷第三方的Bootloader以实现通过Bootloader随意刷机的需求。需要注意的是,Bootloader对于路由器这类嵌入式设备是非常重要的 ,所以无论原厂固件还是一般的OpenWrt固件都是不允许重写Bootloader区域的,于是有网友编译了解锁Bootloader的squashfs-flash-factory固件。通过在原厂固件的固件升级页面中直接刷入该固件,便可以在Shell中执行重写Bootloader的命令了,最后便可通过第三方的Bootloader进行刷固件或一些其他的高级功能。

建立到路由器的shell连接

建立到路由器的Shell连接的方法,可以分为免拆机法和拆机法。不同型号能使用的方法不同,因为拆机法对于动手能力和工具有一定要求,所以优先选择免拆机的方法。

路由器的主板在设计时大多会留出四个排在一起的焊盘,这时为硬件调试留出的TTL串口,需要通过一定的电路分析经验找出其GND、TXD、RXD,然后通过USB-TTL转接器连接到电脑,在电脑的设备管理器中确认其串口号,然后使用Putty或SecureCRT等工具通过端口号连接。根据不同机型,有的可能需要提升Root权限,有的可能需要登录。

有些路由器厂商屏蔽了开启SSH远程登录的功能,但它的固件是使用OpenWrt固件定制的,这类便有机会通过浏览器注入等方式打开屏蔽的SSH。然后利用IP地址和端口号(默认22)使用Putty、Xshell等工具建立Shell连接。

而像ACRH17,华硕官方本身提供了打开SSH的设置,我们在系统管理->系统设置中将启用SSH选项设置为是即可打开SSH。然后利用IP地址和端口号(默认22)使用Putty、Xshell等工具建立Shell连接。

备份原厂数据

备份原厂数据也有拆机和免拆机两种方法。

目前路由器存储固件采用的存储器通常是SPI Flash或NAND Flash。SPI Flash一般会是8MB或16MB,容量较小;而NAND Flash容量相对大一些,比如ACRH17的NAND Flash容量为128MB。拆机取下存储器,通过烧录器连接电脑直接读取整个存储器的二进制映像以备份的方法是一种可靠的方法,但其需要的技术和工具也是个麻烦,SPI Flash的烧录器约20元左右即可买到,而NAND Flash的烧录器价格几百上千,这绝不是电子爱好者可以承受的。

ACRH17采用的128M NAND Flash方案,笔者家贫,没有NAND Flash烧录器,上文种已经获建立了SSH的连接,本文主要介绍的便是通过Shell备份。

  1. 使用以下命令查看分区结构,从回显的信息我们可以得知有mtd0~8共九个分区,以及其对对应的名字。
admin@RT-ACRH17:/tmp/home/root# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00400000 00020000 "Bootloader"
mtd1: 07c00000 00020000 "UBI_DEV"
mtd2: 0005d000 0001f000 "nvram"
mtd3: 0001f000 0001f000 "Factory"
mtd4: 0001f000 0001f000 "Factory2"
mtd5: 03013000 0001f000 "linux"
mtd6: 02e11440 0001f000 "rootfs"
mtd7: 03013000 0001f000 "linux2"
mtd8: 02e11440 0001f000 "rootfs2"
  1. 使用 dd if=/dev/mtd* of=/tmp/mtd*_NAME.bin 命令依次备份各分区,备份文件的名字建议使用分区序号加名称。例如备份Bootloader的命令如下:

    admin@RT-ACRH17:/tmp/home/root# dd if=/dev/mtd0 of=/tmp/mtd0_Bootloader.bin
    8192+0 records in
    8192+0 records out
  2. WinSCP使用SSH的连接信息登录,然后从 /tmp 目录复制到本地进行妥善保存即可。需要注意的是, /tmp 目录是存在于路由器的RAM中的,断电后会丢失,所以在操作完毕前不要断电或重启路由器。

  3. 实践发现因为UBI_DEV分区太大,临时分区的剩余空间不足以存储其备份文件,这时我们可以借助一个U盘来存储备份的文件。插入U盘后可以在 /mnt/ 目录下看到U盘,使用U盘存储空间的路径替换上文命令的 /tmp/ 即可将文件备份到U盘中。此方法便不需要WinSCP来传输备份文件了。

  4. 虽然备份的文件大概率我们是不会用到,但是有了备份后我们便可以更放心的为其刷入固件了。

注意:ACRH17较重要的便是Factory区,其称为ART分区。据说其存储了该机器的无线校准数据,此为备份的重点关注对象。将所有分区全部备份后, 我们可以根据其名称和大小分析其具体的功能,有经验的大佬甚至能将其切割拼接做成编程器固件(可使用WinHex工具处理)。

刷入新固件

这次刷的是ACRH17,参考多数大佬的方案,刷不死OpBoot和OpenWrt。因为原厂系统以及默认的OpenWrt固件均不允许修改Bootloader,所以需要先刷入允许写入Bootloader的特殊OpenWrt固件,此功能是在OpenWrt固件编译时配置的。

  1. 在ACRH-17原厂固件升级页面上传并刷入解锁Bootloadder的 squashfs-flash-factory 固件并重写启动。

    用户名:root 密码:password

  2. 使用U盘或WinSCP将opboot文件传输到路由器的 /tmp 目录下,参考使用以下格式命令计算其MD5并核对是否损坏,如有损坏切勿刷入。

    md5sum /tmp/rt-acrh17-opboot-XXX.bin
  3. 校验无误后参考使用以下命令格式解锁Bootloader并使用OpBoot覆写。

    mtd unlock /dev/mtd0
    mtd -r write /tmp/rt-acrh17-opboot-XXX.bin Bootloader
  4. 按住WPS键接通电源,即可通过浏览器访问OpBoot固件更新页面,按页面提示上传固件即可刷入。

不同机型会有不同的方法。其他机型,有可以在原厂Bootloader中直接通过命令刷入新固件的,这种机型一般可在连接TTL串口时通过特定按键中断以进入Bootloader,也有可通过按键组合进入Web固件更新页面,但大多数的厂商会限制Bootloader只能刷入或引导原厂固件,这类情况一般通过更换第三方的Bootloader解决。具体可以参考Installing OpenWrt

如何将ACRH17刷回官方固件:本文方案已经将Bootloader和系统都刷写成了第三方,如果只需要将系统刷回第三方可直接在华硕官网下载该路由器的最新固件,然后解压并在OpBoot页面刷入即可。如果需要将Bootloader也刷会原厂,可通过OpBoot的高级功能刷写Boot loader实现,mleaf大佬在此处提供了相关文件。

参考

[译]Cisco Meraki Z1刷入LEDE固件教程

前言:

本文内容主要是对OpenWrt论坛的一个帖子的翻译,原帖地址:https://forum.openwrt.org/t/build-for-cisco-meraki-z1/7939
原文:LEDE firmware for Cisco Meraki Z1
原文作者:vuhuy
(如有出入请以原帖内容为准,若能看懂英文,建议先看原帖;本文仅供参考,刷机风险自担,本人概不负责)

读懂并实践本文,你可能需要在技能树中点亮以下技能:

1:基本的Windows系统与Linux系统操作;
2:基本的路由器组网知识;
3:至少拥有一个USB转TTL工具,并且会使用它;
4:必要的情况下,可能需要科学上网技能

为Cisco Meraki Z1刷入LEDE固件

操作警告:

使用和刷入自定义固件是一个细活。您可能会因此损坏您的设备,所以请务必小心操作!使用本指南和固件需要您自担风险。LEDE和我都不对您路由器可能发生的损坏负责。

关于本编译:

LEDE已经支持Cisco Meraki Z1。但是,我需要编译一个额外的initramfs映像,以用于第一次为路由器刷机。此外,此设备在OpenWRT的TOH条目不完整且具有无效链接。我就把它放在这里以防有人需要它。

软件和硬件准备:

以下列出了所需的软件和硬件及其示例
串行终端(Serial terminal):使用minicom(Linux系统),PuTTY 3 (Windows系统)或其他自己熟悉的软件。
SCP客户端(SCP client):使用scp(Linux),WinSCP 1 (Windows)或其他自己熟悉的软件。
USB TTL转换器(USB TTL converter):基于FTDI FT232RL的主板是优质廉价的USB TTL转换器(在您最喜欢的中国网店上1.5欧元)。
(译者注:USB TTL转换器,俗称USB转串行口,我用的模块用的CP2102方案,软件使用的SecureCRT)

步骤

1:下载固件映像
2:建立root访问权限
3:备份原始固件
4:刷入 initramfs 映像
5:删除存储分区
6:刷入 sysupgrade 映像
7:更新LEDE

下载固件映像

访问我的 [OneDrive][1] 以下载预编译的二进制文件。提供了基于 LEDE 17.01.4 使用默认配置编译的initramfs和sysupgrade映像。
Meraki Z1的initramfs映像LEDE网站上是没有提供下载的,您需要在这下载以能够完成LEDE固件的第一次刷入(译者注:因为要先刷initramfs才能再刷sysupgrade)

LEDE网站会自动编译Sysupgrade映像,并可在LEDE网站上获取。从[LEDE网站][2] (目录/ ar71xx / nand / z1-squashfs-sysupgrade.tar)下载(较新的)sysupgrade映像,或使用我的 [OneDrive][3] 上的映像 。

建议使用LEDE网站提供的sysupgrade映像。Opkg可能会针对(任何)自定义sysupgrade映像上的内核依赖性失败。如果您使用的是自定义编译映像,请使用--force-depends标志忽略此项。

建立root访问权限

为了开始刷入固件,我们需要获取路由器的root访问权限。

1:关闭设备电源并拔下所有以太网电缆。
2:拆开设备。注意拆掉橡胶垫下方的四个螺钉。
3:将USB TTL转换器连接到JP1的串行UART接口。
J1 = GND(连接到USB TTL转换器的GND)
J2 = RxD(连接到USB TTL转换器的TxD )
J3 = TxD(连接到USB TTL转换器的RxD)
J4 = Vcc(不要连接,这是最靠近USB端口的跳线)
4:打开设备电源并打开USB TTL转换器的终端软件。波特率(速度)为115200。
5:按住重置按钮10-15秒,直到设备上的LED熄灭。
6:让设备启动,几分钟后在串行终端界面输入回车。它应该输出
7:检查您是否可以使用该odm help命令:

odm help *(译注:以上内容假设您已点亮“USB TTL转换器使用”技能,并有一定电子技术常识,否则您可能难以看懂,那就不要继续了)*
8:如果路由器输出帮助文本,请跳至步骤14.否则,重复步骤5-7几次,如果路由器继续输出UNRECOGNIZED COMMAND LOGGED TO CLOUD SERVERS消息,则继续执行下一步。 9:将Z1的WAN端口连接到另一台路由器的LAN端口。此路由器还必须与Internet断开连接(拔下WAN以太网电缆)。 10:按住重置按钮10-15秒,直到设备上的LED熄灭。 11:让设备启动,几分钟后在串行终端输入回车。它应该输出。 12:通过键入odm help命令来检查是否可以使用ODM命令。 13:如果路由器输出帮助文本,请跳至步骤14.否则,如果路由器继续输出UNRECOGNIZED COMMAND LOGGED TO CLOUD SERVERS信息,请多次尝试重复步骤10-12。在这一步,odm help命令对我有用。如果您继续看到此信息,那么很遗憾,您当前版本的固件不能使用此方法获取root权限。 14:首先我们要更改设备的序列号为Q2XX-XXXX-XXXV以准备获取root权限,这是漏洞利用的一部分。如果您不知道您原来的序列号,请写下您的原始序列号。它通常印在Z1底部的标签上(或使用步骤15中的命令直接读取)。*(译者注:意思可以先用步骤15的方式读出原来的序列号,自己找个地方记下来。因为待会儿完事要重新把原来的序列号写回去,现在我们为了利用漏洞,临时先改一下序列号)* odm serial_num write Q2XX-XXXX-XXXV 15:检查序列号是否更改为Q2XX-XXXX-XXXV。 odm serial_num read 16:如果序列号已经正确更改,请关闭设备电源并在重新打开设备电源时在电脑串行终端中按住“s”键,直到出现Busybox提示符。 Got magic key s BusyBox v1.20.2 (2014-09-19 12:42:33 PDT) built-in shell (ash) Enter 'help' for a list of built-in commands. / # 17:请依次运行以下命令获取固件的root权限。这些命令将删除路由器中一些配置文件和日志文件。如果你想保留这些文件,请复制一份!*(译者注:文中没有提供配置文件备份方式)* / # cd /storage/ / # rm ./config* / # rm ./odm_test.log / # echo "serial_allow_odm true" > ./config / # echo "serial_access_enabled true" >> ./config / # echo "serial_access_check false" >> ./config / # echo "valid_config true" >> ./config / # cp ./config ./config.local / # exit 18:输入exit命令后,设备将继续引导。 19:将序列号更改回原始序列号。 m001122334455:/# odm serial_num write 20:您现在已经拥有root访问权限。请注意,如果您将路由器连接到互联网,您可能会再次失去root权限。 ###备份原始固件 通过root权限,我们现在可以创建原始固件的备份。如果出现问题,或者您想恢复原厂固件时,可以使用它。 1:如果您使用其他路由器来获取root权限,现在请断开所有网线。 2:通过网线将电脑连接到路由器Z1上的LAN1网口。 3:重新获取路由器IP地址(提示:它是网关地址)。 4:使用串行终端设置root密码。 m001122334455:/# passwd 5:输入cat /proc/mtd命令以列出所有分区。您的分区方案可能不同,但对于mtd0到mtd4(包括mtd4)应该是相同的。 m001122334455:/# cat /proc/mtd mtd0: 00020000 00020000 "loader1" mtd1: 007e0000 00020000 "bootkernel1" mtd2: 00020000 00020000 "loader2" mtd3: 007e0000 00020000 "bootkernel2" mtd4: 06fe0000 00020000 "ubi" mtd5: 00020000 00020000 "origcaldata" mtd6: 0001f800 0001f800 "board-config" mtd7: 0087d800 0001f800 "rootfs-wired-9-144173-1-2" mtd8: 0086a000 0001f800 "rootfs-wired-9-144173-1-1" mtd9: 0501a800 0001f800 "storage" mtd10: 0003f000 0001f800 "caldata" 6:为loader1通过使用cat命令来创建备份并将其存储在/storage/文件夹上。 m001122334455:/# cat /dev/mtd0 > /storage/mtd0 //译注:mtd0就是loader1分区,后面的bootkernel1对应使用mtd1,以此类推 7:使用SCP客户端检索备份。使用SCP协议建立连接,用户名为root,密码为步骤4中设置的密码。 8:当你在本地PC上检索并存储备份后,从路由器中删除备份。使用SCP客户端功能或在串行终端中使用rm命令来删除它。 m001122334455:/# rm /storage/mtd0 *(译注:作者没有给出SCP软件使用方法,因为您可以使用带GUI的软件,否则您的技能树可能不支持您学习本文内容)*
9:为bootkernel1,loader2,bootkernel2,board-config和caldata分区重复步骤6-8的操作。如果一次执行此操作,您可能会因此耗尽内存。*(译注:所以请一个一个来,避免在删除上一个备份前创建下一个备份)* 10:另外,需要备份storage分区。这是一个很大的分区,所以只需使用 SCP 将/storage/文件夹中的所有文件传输到本地PC即可。*(译注:没法用前面步骤6-8办法)* 11:要验证备份数据是否正确,请再次重复步骤6-9,并比较(例如运行checksum软件或在Linux系统中使用cmp命令)两次获取的文件结果是否相同。(译注:作者没有提供具体操作,只提供了个方法) ###刷入initramfs映像 重刷该路由器固件由两部分操作组成:刷入initramfs映像和刷入sysupgrade映像。 1:将PC连接到Z1上的LAN1端口。它应该之前已经连上了,你刚才确实已经做了备份,不是吗? 2:在本地计算机上搭建HTTP服务器以提供initramfs映像。 *(译注:作者没有给出具体操作过程,如果您之前给别的路由器刷过第三方固件,应该是会这个操作的,否则可以考虑先通过搜索引擎学习一下,或参考下一条译注。)* 3:检查您的计算机本地IP地址(提示:它的IP地址是由Z1的DHCP分配的) 4:串行终端中使用wget命令将initramfs映像下载到路由器中的/storage/文件夹中。 m00180A167ED0:/# wget http:/// -O /storage/initramfs.bin *(译注:译者本人不是通过这种方式将映像下载到/storage/文件夹的,其实可以使用SCP软件直接上传的方式,取代上面2-4的操作。另外,您没看错,我也没翻译错,下面又出现了一个步骤4,原文中就是写了两个步骤4。这个是教您校验映像文件,您可以使用SCP软件再上传一个initramfs映像文件,改名为:initramfs2.bin,取代下面条目4中第一条命令)*
4:您可能想验证下载的 initramfs 映像。下载第二个并比较是否存在任何差异(它不应该存在差异,而cmp命令也不应该返回任何输出)。 m001122334455:/# wget http:/// -O /storage/initramfs2.bin m001122334455:/# cmp /storage/initramfs.bin /storage/initramfs2.bin m001122334455:/# rm /storage/initramfs2.bin 5:使用 dd 命令将下载的 initramfs 映像写入 bootkernel1 分区。 m001122334455:/storage# dd if=/storage/initramfs.bin of=/dev/mtdblock1 6:使用rm命令删除下载的initramfs映像。 m001122334455:/# rm /storage/initramfs.bin 7:使用reboot命令重新启动路由器。 m001122334455:/# reboot now 8:如果一切都正确完成,LEDE现在应该启动。检索您的计算机新的本地IP地址。**如果LEDE无法启动,请不要继续!** *(译注:LEDE是否成功启动,是能够在串行终端中看到的回显信息的,如果您看不懂,可能您不太适合阅读本教程)* 9:串行终端中使用wget命令将initramfs映像下载到路由器中的/tmp/文件夹中。 root@LEDE:/# wget http:/// -O /tmp/initramfs.bin 10:您可能想验证下载的initramfs映像。下载第二个并比较是否存在任何差异(它不应该存在差异,而cmp命令也不应该返回任何输出)。 root@LEDE:/# wget http:/// -O /tmp/initramfs2.bin root@LEDE:/# cmp /tmp/initramfs.bin /tmp/initramfs2.bin root@LEDE:/# rm /tmp/initramfs2.bin 11:使用dd命令将下载的initramfs映像写入bootkernel3分区(recovery)。 root@LEDE:/# dd if=/tmp/initramfs.bin of=/dev/mtdblock3 12:使用rm命令删除下载的initramfs映像。 root@LEDE:/# rm /tmp/initramfs.bin 13:使用reboot命令重新启动路由器。 root@LEDE:/# reboot now ###删除存储分区 存储器中还有一些LEDE不使用的存储分区。我们可以在刷入sysupgrade映像之前删除它们,以释放一些空间(大约100MB)。
1:使用ubinfo命令列出所有的UBI卷。 root@LEDE:/# ubinfo -a 2:使用ubirmvol命令删除列出的UBI卷,**但board-config卷除外**。对每个UBI卷重复该命令。**永远不要删除**board-config**卷!** root@LEDE:/# ubirmvol /dev/ubi0 -N 3:使用ubimkvol命令创建新的calibration data卷。 root@LEDE:/# ubimkvol /dev/ubi0 -N caldata -s 252KiB 4:使用ubinfo命令验证您的UBI卷。它应该显示有两个卷:board-config卷和新创建的caldata卷。 root@LEDE:/# ubinfo -a ###刷入 sysupgrade映像 接下来将为路由器刷入sysupgrade映像。刷入sysupgrade映像将重新填充calibration data卷,创建rootfs并自动展开rootfs_data到剩余的UBI可用空间。 1:将PC连接到Z1上的LAN1端口。它应该之前已经连上了,你刚才确实已经做了备份,不是吗? 2:在本地计算机上设置HTTP服务器以提供sysupgrade映像。 3:串行终端中使用wget命令将sysupgrade映像下载到路由器中的/tmp/文件夹中。 root@LEDE:/# wget http:/// -O /tmp/sysupgrade.tar 4:您可能需要验证下载的sysupgrade映像。下载第二个并比较是否存在任何差异(它不应该存在差异,而cmp命令也不应该返回任何输出)。 root@LEDE:/# wget http:/// -O /tmp/sysupgrade2.tar root@LEDE:/# cmp /tmp/sysupgrade.tar /tmp/sysupgrade2.tar root@LEDE:/# rm /tmp/sysupgrade2.tar 5:使用sysupgrade命令执行sysupgrade 。 root@LEDE:/# sysupgrade -v /tmp/sysupgrade.tar 6:恭喜您,您在Meraki Z1上运行LEDE!您现在可以拆除USB TTL转换器并将路由器装回外壳。 ###更新LEDE 您现在可以通过执行sysupgrade命令将LEDE更新为任何更新的版本。不再需要initramfs 映像了!您可以在[LEDE网站][4]上下载Meraki Z1的新sysupgrade映像。 使用SSH访问路由器并使用wget和sysupgrade两条命令执行升级。 root@LEDE:/# wget http:/// -O /tmp/sysupgrade.tar root@LEDE:/# sysupgrade -v /tmp/sysupgrade.tar 不要忘记调整/etc/sysupgrade.conf 告诉LEDE在升级过程中应该保留哪些设置。 ###参考 https://servernetworktech.com/2016/02/pwning-the-meraki-mr18/ https://servernetworktech.com/2017/06/pwning-the-meraki-mr18-again/ https://wiki.openwrt.org/toh/meraki/z1 [1]: https://1drv.ms/f/s!As4WUgFdj-yOjKt74-epe0XbTIm8Sg [2]: https://downloads.lede-project.org/releases/ [3]: https://1drv.ms/f/s!As4WUgFdj-yOjKt74-epe0XbTIm8Sg [4]: https://downloads.lede-project.org/releases/