路由器漏洞分析(0):环境搭建

搭环境可真是太难了……

binwalk:固件提取

一定要完整安装!!

固件模拟调试环境搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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安装

1
2
3
sudo apt-get install qemu 
sudo apt-get install qemu-user-static
sudo apt-get install qemu-system

qemu模拟mips程序

qemu有两种运行模式:

user mode : qemu-mips(mipsel)-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

1
2
3
#将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

1
2
3
4
5
6
7
8
9
10
11
$ 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提取出的文件系统拷贝到虚拟机中

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

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

1
2
$ 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;

1
2
3
4
5
6
7
8
9
10
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中

1
2
3
get_device () {
echo "/dev/mapper/loop0p1"
}

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

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

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

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

1
2
3
4
$ 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,用pwndbg会出各种幺蛾子。在~/.gdbinit中注释掉各种source就能用纯gdb了。

IDA

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

mips指令反编译:ghidra

下载ghidra

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

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