IOT固件模拟-dir605L_FW_113(函数劫持)

复现基本操作

固件提取

首先需要进行下载并且进行固件解压。

在进行固件解压的时候,前面由于环境问题一直解压失败,与路由器相关的文件夹是空的在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窗口,搜索需要较长时间。

IOT固件模拟-dir605L_FW_113(函数劫持)

IOT固件模拟-dir605L_FW_113(函数劫持)

我们发现是这里是存在一个跳转判断,如果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

参考链接
https://www.giantbranch.cn/2018/04/16/%E4%B8%80%E6%AC%A1qemu%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95%E8%B7%AF%E7%94%B1%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%AE%B0%E5%BD%95/

上一篇:SINAMICS S210 抱闸时间P1217


下一篇:python用request下载大文件,遇到MemoryError 解决方法