默认分类

固件仿真(本文CISCO RV160w)

固件仿真

前两天看到了swing师傅之前在21年TCTF-FINAL中公布的一个思科1day,并给出了相关利用手法。同时chamd5也发了相关的分析文章,这里借此机会尝试使用仿真方法对固件进行调试。

这里正好对qemu模拟进行记录。 固件包官网下载了含漏洞的版本。
首先是重新完善了下binwalk:
我目前分离固件中见过几种不同的文件系统打包格式:暂时主流大概有 squashfs 以及 ubi 。
然后binwalk 中其实是利用外部应用对固件进行解压分析的。
需要额外装一下 squashfs 和 ubi_reader 后者是一个python的库。当时python库里边还要再额外装一个依赖。
网上都有相关教程。
可以利用ubi_reader_extract命令对ubi打包的文件系统操作一下就会提示相关报错了。

分离出文件系统之后最重要的就是如何进行模拟了。
接下来会从qemu的 用户的API模拟级别以及 系统模式模拟两种方式 对其进行模拟。

用户模式

我的qemu是从源码编译装的系统模式的。用户模式的直接apt了。
用起来没啥大问题。需要进行操作的时候我们利用如下命令:

chmod a+x bin/sh
chmod a+x bin/busybox
mount --bind /dev dev
mount --bind /proc proc
sudo chroot . ./qemu-arm-static bin/sh

把必要的设备以及进程挂进来。如果想附加调试的话 用户模式 是-g
有一个问题就是我这样模拟出来的东西里面的ptrace貌似是无法二次翻译的 就是追不到你启动进程之内的子进程。像我这样起sh后再去起如httpd的东西它是追踪不到的。而且attach上也会报错。所以这种方法调一调单个可执行程序还行。建议不要做为主流的固件仿真方法。或者说可以测试下固件功能or直接对漏洞进行利用尝试。

系统模式

给出如下命令:

wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress
wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress
# 下载所需的文件系统、内核等等。一般用这种debian即可。
sudo apt-get install bridge-utils
sudo brctl addbr Virbr0
sudo ifconfig Virbr0 192.168.153.1/24 up
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.153.11/24 up
sudo brctl addif Virbr0 tap0
# 配网卡 方便和本机进行调试。以及传文件等操作。
sudo qemu-img resize debian_wheezy_armhf_standard.qcow2 32G
# 设置SD card大小32G 不然不是2的次方会报错。
sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append "root=/dev/mmcblk0p2" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic 
# 没必要开-s来调试 直接传gdbserver进去附加进程调试更方便。

然后boot kernel结束后 在里面运行:
ifconfig eth0 192.168.153.2/24 up 这样就加入这个网段了。
在主机运行:
scp -r rootfs/ root@192.168.153.2:~/
将文件系统传进去。
然后在qemu里面运行:

sudo mount --bind /proc proc
sudo mount --bind /dev dev
chroot . /bin/sh

这里和用户模式就一样了 切换工作目录。
之后就是利用gdbserver+本机的gdb 各种远程调试了。 一般这类程序 除了NX啥也不开,挺舒服的。
之后还有一个问题就是固件中程序跑不起来的问题。这个时候需要对一些函数做hook。
需要交叉编译环境。还在看怎么弄。。。 或者直接patch也比较方便。但是会导致莫名其妙的问题发生 。

剩下的漏洞部分就比较简单了 难点还是配环境。。 就是调漏洞 移步swing师傅博客 以及 chamd5的文章都可;
https://bestwing.me/
https://mp.weixin.qq.com/s/8qviTeiuJb5XU8jDdHMW8Q

回复

This is just a placeholder img.