router exploit environment setup

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 的固件都跑不起来。。也可能 是我使用方法有问题。

后续可能要考虑真机调试了,模拟运行好多坑。。

Reference