这个仓库包含易受 CVE-2019-17147 影响的固件版本的闪存分区转储,以及一些可用于降级和调试你的 WR841N 路由器的实用二进制文件。
此仓库包含易受 CVE-2019-17147 影响的固件版本的 flash 分区转储文件,以及一些用于降级和调试你的 WR841N(V14) 路由器的实用二进制文件。
进行硬件修改(例如覆写 flash 芯片分区)存在风险。请自行评估风险并决定是否要这样做。
ZDI 发布的文章:https://www.zerodayinitiative.com/blog/2019/12/2/mindshare-hardware-reversing-with-the-tp-link-tl-wr841n-router-part-2 展示了一个非常有趣的漏洞,我非常想尝试一下并从中学习。
不幸的是,固件版本 (US) 0.9.1 4.16 v007c.0 Build 180613 Rel.42415n 已从美国官网撤下,无法再下载。
不过,我确实有一些运行固件版本 (TW) 0.9.1 4.16 v009e.0 Build 180516 Rel.81030n 的 WR841N,该版本比 ZDI 所利用的版本更旧,且相同的漏洞仍然存在。
我想很多人会对复现这个漏洞利用感兴趣,但都面临同样的问题:找不到运行易受攻击固件版本且仍可正常工作的 WR841N。
如果你使用的是 TW、EU 或 JP 版本的硬件,仍然可以从官网下载早于 180613(即构建于 2018/06/13)的固件版本,然后只需用旧固件对路由器执行“升级”即可完成降级。
尽管固件降级是可行的,但 WR841N 实际上会进行校验,不会接受面向不同国家/地区销售的硬件所对应的固件。因此,对于那些所在国家/地区的 TP-Link 官网不提供易受攻击固件版本(例如美国)的人来说,他们需要绕过 http 服务器中的校验,将易受攻击的固件直接写入设备的 flash 芯片。这就是本仓库的主要用途。
我还为 WR841N 交叉编译了静态 busybox 和 gdbserver,供想要尝试调试和复现该漏洞利用的人使用。
在尝试覆写你的 flash 分区之前,你应该先备份当前的分区,以便在试用完这个易受攻击的版本后恢复你的路由器。
我假设你已经熟悉串口控制台的使用,因此硬件部分我就不赘述了。
在你选择的机器上搭建一个 tftp 服务器。
在 WR841N 控制台中:
(将 IP 地址替换为你 tftp 服务器的地址)
~ # cat /dev/mtd0 > /var/WR841N_backup_mtd0_boot.bin
~ # tftp -p -r /var/WR841N_backup_mtd0_boot.bin 192.168.0.100
~ # rm /var/WR841N_backup_mtd0_boot.bin
~ #
~ # cat /dev/mtd1 > /var/WR841N_backup_mtd1_kernel.bin
~ # tftp -p -r /var/WR841N_backup_mtd1_kernel.bin 192.168.0.100
~ # rm /var/WR841N_backup_mtd1_kernel.bin
~ #
~ # cat /dev/mtd2 > /var/WR841N_backup_mtd2_rootfs.bin
~ # tftp -p -r /var/WR841N_backup_mtd2_rootfs.bin 192.168.0.100
~ # rm /var/WR841N_backup_mtd2_rootfs.bin=
WR841N 中的 flash 分区如下:
dev: size erasesize name
mtd0: 00010000 00010000 "boot"
mtd1: 000f0000 00010000 "kernel"
mtd2: 002e0000 00010000 "rootfs"
mtd3: 00010000 00010000 "config"
mtd4: 00010000 00010000 "radio"
你需要覆写的主要分区是 rootfs(mtd2),但为了稳定性起见,我们也会覆写 boot 和 kernel。
我没有提供 config 和 radio 分区,因为它们不影响该漏洞,而且你肯定不想为了规避潜在的法律问题而去改动 RF 设置。
flashcp 传输到 WR841N。在 WR841N shell 中:
~ # cd /var
/var # tftp -g -r flashcp 192.168.0.100
/var # chmod +x flashcp
(当然,请将 IP 地址替换为运行 tftp 服务器的机器的 IP 地址。)
TW_wr841N_mtd0_boot_180516.bin 传输到 WR841N 并使用 flashcp 覆写:/var # tftp -g -r TW_wr841N_mtd0_boot_180516.bin 192.168.0.100
/var # ./flashcp TW_wr841N_mtd0_boot_180516.bin /dev/mtd0
/var # rm TW_wr841N_mtd0_boot_180516.bin
TW_wr841N_mtd1_kernel_180516.bin 传输到 WR841N 并使用 flashcp 覆写:/var # tftp -g -r TW_wr841N_mtd1_kernel_180516.bin 192.168.0.100
/var # ./flashcp TW_wr841N_mtd1_kernel_180516.bin /dev/mtd1
/var # rm TW_wr841N_mtd1_kernel_180516.bin
TW_wr841N_mtd2_rootfs_180516.bin 传输到 WR841N 并使用 flashcp 覆写(这是最大的分区,因此 flashcp 需要一些时间才能完成):/var # tftp -g -r TW_wr841N_mtd2_rootfs_180516.bin 192.168.0.100
/var # ./flashcp TW_wr841N_mtd2_rootfs_180516.bin /dev/mtd2
/var # rm TW_wr841N_mtd2_rootfs_180516.bin
0.9.1 4.16 v009e.0 Build 180516 Rel.81030n。
buildroot-2021.02.6 交叉编译。