路由器漏洞分析系列(1):路由器固件模拟环境搭建

isnull   ·   发表于 2019-07-21 11:24:52   ·   漏洞文章

binwalk:固件提取

一定要完整安装!!

参考固件模拟调试环境搭建

$ sudo apt-get update
$ sudo apt-get install build-essential autoconf git

$ git clone https://github.com/devttys0/binwalk.git
$ cd binwalk

# python2.7安装
$ sudo python setup.py install

# 自动安装依赖库文件
$ sudo ./deps.sh

# 提取固件 -M递归提取
$ binwalk -Me XX.bin

qemu:模拟执行

qemu安装

sudo apt-get install qemu 
#user mode,包含qemu-mips-static,qemu-mipsel-static,qemu-arm-static等sudo apt-get install qemu-user-static#system mode,包含qemu-system-mips,qemu-system-mipsel,qemu-system-arm等sudo apt-get install qemu-system

qemu模拟mips程序

qemu有两种运行模式:

user mode : qemu-mips(mipsel/arm)-static。用户只需要将各种不同平台的处理编译得到的Linux程序放在QEMU虚拟中运行即可,其他的事情全部由QEMU虚拟机来完成,不需要用户自定义内核和虚拟磁盘等文件;

system mode:qemu-system-mips(mipsel) : 用户可以为QEMU虚拟机指定运行的内核或者虚拟硬盘等文件,简单来说系统模式下QEMU虚拟机是可根据用户的要求配置的。

user mode

用户模式下需要切换"/"目录,使用的是chroot命令,将根目录切换到binwalk提取出的文件系统目录下,例如squashfs-root,cpio-root。

在需要指定新的动态库实现一些函数的劫持时,用-E LD_PRELOAD="XX.so"

开启调试模式时,使用-g 1234

#将qemu-mips-static拷贝到当前目录下$ sudo cp $(which qemu-mips-static) .
$ sudo chroot . ./qemu-mips-static -E LD_PRELOAD="XX.so" -g 1234 bin/boa

system mode

用这个模式稍微麻烦一点点,但是能获取到的信息也比较多,比如能够查看qemu内部进程的内存分布,设备之类的情况。

1.配置网卡

参考固件模拟调试环境搭建即可,大佬写的很全了

2.启动qemu

两个镜像下载:debian

$ sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta \
-hda debian_squeeze_mips_standard.qcow2 \
-append "root=/dev/sda1 console=tty0" \
-net nic -net tap -nographic -s

参数说明:
-M 指定开发板 你能够使用-M ?參数来获取该qemu版本号支持的全部单板
-kernel 内核镜像路径
-hda/-hdb IDE硬盘镜像
-append 内核启动参数 内核命令行
-s 等同于-g 1234

3.开启qemu之后,将binwalk提取出的文件系统拷贝到虚拟机中

$ scp -r ./cpio-root  root@192.168.84.129:/root/

4.接下来就可以在远端mips虚拟机上运行程序

$ export LD_PRELOAD='XX.so'
$ chroot . bin/busybox


firmadyne:固件模拟工具

一些固件是可以用这个软件来模拟的,但不是所有都可以,不能的还要用qemu

下载和安装:firmadyne按照这个一步一步来就OK了(懒的话可以直接下FAT

建议如果用的是FAT,先在fat.py的setup_network函数中加入child.logfile = file("mylog.txt",w),要不然看不见输出的各种error和warning;

def setup_network(arch, image_id):
    print "[+] Setting up the network connection, please standby"
    network_cmd = "sudo " + firmadyne_path + "/scripts/inferNetwork.sh " + image_id + " " + arch
    child = pexpect.spawn(network_cmd)
    child.logfile = file("mylog.txt",'w')#here!!!!!!!get log
    child.sendline(root_pass)
    child.expect("Interfaces:", timeout=None)
    interfaces = child.readline().strip()
    print "[+] Network interfaces : " + interfaces
    child.expect(pexpect.EOF)

出现的问题:

1.firmadyne获取不到IP

按照firmadyne软件的readme一步一步执行时,sudo ./scripts/makeImage.sh 1
报错:the file /dev/mapper/loop0p1 does not exist and no size was specified。
在该脚本里,DEVICE是由get_device获取到的,get_device在firmadyne.config中

get_device () {echo "/dev/mapper/loop0p1"}

而在系统中已经有很多loop的情况下,makeImage.sh会将QEMU img挂载到loop32(例)这种数字比较大的loop上。

解决方法是在mounting之后,将kpartx挂载虚拟文件系统返回的device作为mkfs.ext2的参数,具体方法


交叉编译:mips-linux-gnu-gcc

可用在编译新的动态库,劫持程序的运行。

$ sudo apt-get install linux-libc-dev-mips-cross
$ sudo apt-get install libc6-mips-cross libc6-dev-mips-cross
$ sudo apt-get install binutils-mips-linux-gnu gcc-mips-linux-gnu
$ sudo apt-get install g++-mips-linux-gnu


mips 调试

gdb

编译一个mips的gdb:mips-linux-gdb

专属于mips指令的gdb比较好用,gdb-multiarch也ok但是要在调试之前set arch mips;set endian big/little。如果用了类似pwndbg等插件出现问题,可在~/.gdbinit中注释掉各种source用纯gdb。

IDA

在Ubuntu下安装wine就可运行windows下的IDA了。


mips指令反编译:ghidra

下载ghidra

环境只需要JDK11就OK,可直接查看反编译代码,比IDA方便,但是xref这种还是要结合着IDA一起来看。

不要用ghidra patch文件!!!ghidra除了patch之外还会修改文件!!造成无法运行!!


转自先知社区

打赏我,让我更有动力~

0 条回复   |  直到 2019-7-21 | 2106 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.