修复固件运行环境
环境
Ubuntu16.04
工具:
binwalk 提取固件
buildroot检查编译环境
IDA调试
修复对象(运行boa(web程序)):
D-Link DIR-605L(FW_113)
下载地址:ftp://ftp2.dlink.com/PRODUCTS/DIR-605L/REVA/
参考:
《揭秘家用路由器0day》
步骤
1,提取固件,同时可以得到一些信息
同目录下生成的文件夹:
2,boa程序位置
运行它,
命令:
2.1,先把交叉编译器放到当前目录下(下图中指出),书中的是qemu-mips,容易出现问题编译不过去,建议安装qemu-mips-static(方法:sudo apt-get install qemu-user-static qemu-system-mips)
cp $(which qemu-mips-static) ./
2.2,运行(书上 chroot 后面少了个 点 .)
sudo chroot . ./qemu-mips-static ./bin/boa
执行完命令后会提示错误(这里我已经修复了,下面粘贴下书上的内容大家参考,都是一模一样的提示报错)
3,IDA调试,找到报错Initialize AP MIB failed
的流程。(字符串搜索定位即可,shift+f12)
参考:IDA远程调试 和 apmib_init函数功能
使用到的调试命令:
sudo chroot . ./qemu-mips-static -g port ./bin/boa
修复它,这bqez是修复好的。原先是bnez,修改一个字节即可,把0x14换成0x10。
4,修复好了这个点,如还有问题,可继续按此流程分析,然后通过劫持函数动态库
修复一系列问题。(此程序经过分析,产生问题的函数都来至动态链接库apmib.so
,所以作者自己从写了新的内容的apmib.so
修复这些函数)
//ampib.c
#include<stdio.h>
#include<stdlib.h>
#define MIB_IP_ADDR 170
#define MIB_HW_VER 0x250
#define MIB_CAPTCHA 0x2C1
int apm_init(void)
{
return 1;
}
int fork(void)
{
return 0;
}
void apmib_get(int code, int *value)
{
switch(code)
{
case MIB_IP_ADDR:
*value = 0x7F000001;
break;
case MIB_HW_VER:
*value = 0xF1;
break;
case MIB_CAPTCHA:
*value = 1;
break;
}
return;
}
分析这块纯考验re功底,怼时间和经验。
编译命令(生成新的apmib-ld.so):
mips-linux-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so
-Wall 输出警告信息
-fPIC 编译位置独立
-share 生产动态链接库
-o 输出文件
5,文件放置到恰当的位置
apmid-ld.so
重点:
apmid-ld.so它编译需要依赖libgcc_s.so.1
(这文件要放到lib下,原本是没有的)
如何找到libgcc_s.so.1
,并且放到lib文件夹下:
通过find命令找
然后,通过cp 命令复制过去即可。
6,修复完成,执行
chroot ./ ./qemu-mips-static -E LD_PRELOAD="/apmib-ld.so" ./bin/boa
LD_PRELOAD说明:
跑起来了,并查看网络端口
netstat -an | grep 80
后续页面修复(代码审计一波)
1,运行boa程序后打开当前服务web界面
输入ip,自动跳转到/Basic/Wizard…这个页面。
找到这个文件,打开
它是获取个硬件内容(我们仿真,哪来的硬件,所以打不开)
2,改变流程,找到first.asp(为什么是这个文件控制优先被读取呢?我想跟web开发里面默认读取的是一样的,虽然可以修改,不一定总是这个哈)
查看内容逻辑,并修改:
打开web时,它init()流程
3,完成
然后可以开始挖各种洞了
总结
仿真环境最困难的就是各种环境问题不匹配,导致程序无法运行,所以无法继续深入去挖掘漏洞,修复一个环境是基础(当然有实际设备最好了),其他的产品修复的大致流程也就上述过程类似了。总的来说还是太菜了,在此过程中也遇到了无数坑,而所能查到的资料实在太少了,所以以上内容真的是一步一步贴出供大家参考,
最后,欢迎大家交流,一起探讨IOT安全研究所遇到的各种问题。