复现基本操作
固件提取
首先需要进行下载并且进行固件解压。
在进行固件解压的时候,前面由于环境问题一直解压失败,与路由器相关的文件夹是空的在squashfs-root
下没有任何东西,自习查看报错提示,需要注意相关binwalk插件或者是依赖的安装,本人环境需要进行sasquatch 安装,完成安装后,binwalk的解压结果多了:squashfs-root-0,进入就是正常的目录结构了。
# 安装依赖库文件
$ sudo apt-get install build-essential liblzma-dev liblzo2-dev zlib1g-dev
# 下载源码
$ git clone https://github.com/devttys0/sasquatch.git
# 源码的编译
$ (cd sasquatch && ./build.sh)
qemu模拟运行
接下来就需要进行qemu的模拟运行,进行qemu的运行方法,最简便的方法流程如下:
cp $(which qemu-mips) ./ #复制qemu相关插件到所在固件根目录
#省略一步如下,需要进行qemu依赖库的复制,因为该插件也是动态链接的,需要正常使用需要将环境带着走
sudo chroot ./ ./qemu-mips ./bin/boa
sudo chroot ./ ./qemu-mips -g 1234 ./bin/boa #qemu帮忙启动gdbserver,在ida中使用gdb
调试模块
#依赖库复制(手动创建目录项)
cp /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 ./usr/lib/
cp /lib/x86_64-linux-gnu/libglib-2.0.so.0 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/librt.so.1 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libm.so.6 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libgcc_s.so.1 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libpthread.so.0 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libc.so.6 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libdl.so.2 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libpcre.so.3 ./lib/x86_64-linux-gnu
cp /lib64/ld-linux-x86-64.so.2 ./lib64
运行问题
实际直接运行会出现问题:
squashfs-root-0$ sudo chroot ./ ./qemu-mips ./bin/boa
Initialize AP MIB failed!
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault (core dumped)
使用ida去搜索定位出现问题的地方,再用gdb进行调试。不建议直接调用string窗口,搜索需要较长时间。
我们发现是这里是存在一个跳转判断,如果apmib_init 给的返回值为0则会报我们运行时候出现的错误Initialize AP MIB failed!
,我们再针对函数引用的动态链接库进行分析,分析apmib_init大致判断对程序执行无过多影响,于是可以尝试直接进行函数劫持来使得程序正常跑起。
函数劫持
#include <stdio.h>
#include <stdio.h>
int apmib_init(void)
{
return 1;
}
mips-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so #编译链接程序
sudo chroot ./ ./qemu-mips -E LD_PRELOAD="/apmib-ld.so" -g 1234 ./bin/boa #劫持对应函数
参考《解密家用路由器0day漏洞挖掘技术》,构造本例最后的劫持函数为:
#ampib.c
#include <stdio.h>
#include <stdlib.h>
#define MIB_IP_ADDR 170
#define MIB_HW_VER 0x256
#define MIB_CAPTCHA 0x2C1
int apmib_init(void)
{
return 1;
}
int fork(void){
reuturn 0;
}
void apmib_get(int code,int *value)
{
switch(code)
{
case MIB_HW_VER:
*value=0xF1;
break;
case MIB_IP_ADDR:
*value=0x7F000001;
break;
case MIB_CAPTCHA:
*value=1;
break;
}
return;
}
#生成apmib-ld.so
mips-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so
#将生成的so文件复制到路由器根文件系统下
sudo chroot ./ ./qemu-mips -E LD_PRELOAD="/apmib-ld.so" ./bin/boa