Introduction
非常感谢 sakura 师傅,在师傅的指导下开始研究学习路由器的漏洞挖掘与利用。
本文讲述了路由器固件的解包与调试环境搭建。
Firmware Analysis
首先选择目标路由其后对固件进行分析,对于无源码的固件可对其逆向分析,以 dir815 型号的路由器为例,相关固件可从
d-link 官网下载,选择 DIR-815/REVA/DIR-815_FIRMWARE_1.01.ZIP
。
linux 下有许多常用工具如:
-
file 检测文件类型
-
hexdump 导出十六进制数据
-
strings 导出可见字符
用来帮助进行文件分析。
通常对固件进行解包前可以用以上工具采集一些信息,如查看文件类型:
hexdump 和 strings:
hexdump 将固件以 hex+ascii 的形式输出到文件中。
接下来对固件进行解包,提取其中的文件系统。可以简单使用 binwalk 工具自动提取:
运行之前安装:
sudo apt install binwalk
我这里 binwalk 提取失败了..0.0 ,不过还可以使用 firmware-mod-kit 工具,从
github 上 clone 下来,可以直接运行 ./extract-firmware.sh
[firmware bin]
对固件进行解包。
初次运行解包脚本会自动进行编译,也可以先手动编译。firmware 不仅可以用来解包,还可以重新打包固件。
除了自动解包脚本,也可手动解包,binwalk 可以查看到 header image、文件系统等部分的位置信息,然后使用 dd 工具:
如图将文件系统提取出来后可以用 firmware-mod-kit 工具中的解压 squashfs 格式文件系统的脚本解压:
另外固件中有些部分如 image header 是用 lzma 格式压缩的,提取出来后需用 lzma 解压。
Configure Debug
下面配置调试环境,没有实体路由器的可以使用 qemu 模拟运行,一般是运行其中的 web 应用程序,但可能会由于缺少设备 等原因无法直接跑起来,通常需要修复运行环境,这里暂不对环境修复做演示(emmm..其实是之前试了几个固件没修复好0.0)。 由于在固件的文件系统中会缺少相关的运行库,所以 qemu 只能使用静态链接的版本,ubuntu 系统可直接使用以下命令 安装 qemu 静态链接版:
$ sudo apt install qemu-user-static
切换到固件解压出来的文件系统目录下使用 qemu 模拟运行:
运行以下命令:
sudo cp $(which qemu-mipsel-static) .
sudo chroot . ./qemu-mipsel-static ./bin/busybox
而本次分析的固件中的 web 应用程序加上具体参数后可以直接运行,不过要具体分析下程序,这里演示另外一个路由的固件, 可以直接模拟运行。在一些资料中翻到 totolink A850R 的一些介绍,可从官网下载该路由的固件,对固件进行解包后使用 qemu 运行 bin 目录下的 skt 程序:
发现其监听了5555端口,浏览器打开看一下:
没有任何东西..,不过可以确定该程序的确可以运行,可以使用 qemu -g 7777
对其调试:
使用命令:
sudo chroot . ./qemu-mips-static -g 7777 ./bin/skt
使用 gdb-multiarch 远程调试:
sudo apt install gdb-multiarch
gdb-multiarch ./skt
target remote :7777
连上后:
一般模拟运行的 web 程序会报各种错误,就需要自己分析程序,然后根据实际情况编写劫持函数,使其能够正常运行。 要编写 mips 可执行文件需搭建交叉编译环境:
下载 buildroot
wget https://buildroot.org/downloads/buildroot-2018.02.1.tar.gz
也可直接去官网下载,下载完解压后进入到 buildroot 目录下开始编译:
make clean
make menuconfig
以 mips 小端格式为例,进入 target options > target architecture 选择 mips (little endian):
然后回到初始菜单,进入 toolchain 将 kernel header 改为贴近模拟环境的版本:
配置完后 make 编译,编译完后在 output/host/bin
目录下找到 mips-linux-gcc
。
除了 qemu 还可以使用 firmadyne 模拟运行路由器固件,随手试了下只有 netgear 的路由器固件能够解包成功,然后除了文档中用于示范的固件外试了其它几个 netgear 的固件都跑不起来。。也可能 是我使用方法有问题。
后续可能要考虑真机调试了,模拟运行好多坑。。