一、固件仿真工具- QEMU
QEMU是比较老的开源固件仿真工具,现如今的很多仿真工具大多都是在此框架的基础上进行修改或是优化。QEMU有多种模式,比如User mode、System mode、KVM Hosting、Xen Hosting。在实际的仿真过程中主要使用的其实就是User mode、System mode,也就是用户模式和系统模式。用户模式就是QEMU运行针对不同指令编译的单个Linux或Darwin/macOS程序。系统模式就是QEMU模拟一个完整的计算机系统,包括外围设备。
使用系统态仿真会比用户态慢很多,因为系统态仿真的开销是用户态的数倍。主要是因为内存地址转换、动态代码翻译、系统调用模拟这三个方面消耗较大。在System mode中,QEMU使用软件模拟MMU(内存管理单元)对所有内存访问进行地址转换,相比之下,User mode的地址转换要简单的多;User mode下做代码翻译比System mode要快,在User mode中调用转换程序的频率更高;在User mode中系统调用是由主机操作系统和硬件直接处理的,但在System mode中操作系统和硬件设备都得被模拟,这需要让程序正确的执行,就需要硬件模拟,但并不是所有的系统调用都需要依赖硬件模拟,这极大的加大了系统开销。
对于路由器固件来说,这两种模式也是我们在固件分析、固件调试、漏洞利用等常用的模式。对于这两种模式,它们的安装和使用都是不同的,都需要单独安装,
sudo apt-get install qemu (系统态)
sudo apt-get install qemu-user-static (用户态)
下面就对这两种模式进行介绍。
1.1 用户态仿真
用户态仿真简单来说就是使用QEMU对固件的某个程序或是进程进行仿真,在这种模式下能够进行方便的交叉编译和调试,这种模式操作更为简单。在固件仿真之前需要确定的就是要仿真固件的CPU架构,主要有arm架构和mips架构,这两种架构的仿真方式和仿真环境搭建有很大不同。根据固件的架构下载对应的安装包,然后将qemu-mips-static文件拷贝到当前文件,拷贝指令为 cp /usr/bin/qemu-mips-static ./。然后切换到路由器的根路径运行mips指令集架构下的二进制程序(sudo chroot . ./qemu-mips-static ./bin/busybox,其中./bin/busybox为要执行的busybox所在的相对路径)。下面是一个具体的示例来说明使用qemu用户态模拟mips架构的NETIS路由器固件。
在解压固件之后进入到squashfs-root目录,因为固件是mips架构的需要将qemu-mips-static当前目录下。使用以下指令切换到路由器的根目录并开启路由器的http服务。
sudo chroot ./ ./qemu-mips-static -strace /bin/boa
(注:-strace主要是看执行过程,方便调试,如图1所示)
sudo chroot ./ ./qemu-mips-static -strace /bin/boa -p /web -f /etc/boa.conf
最后经过多次调试能够通过桥接网络的ip看到路由器web界面,如图2所示。
以上是一个mips架构的路由器固件的简单示例,在实际操作中还需要根据一些具体的仿真问题进行调试修改,这里给出一个使用arm架构进行用户态仿真的案例(https://www.freebuf.com/articles/wireless/166869.html),在这篇文章当中还提到了通过patch修改程序的跳转条件,运行漏洞文件`bin/httpd`进行漏洞分析调试的过程,很具有参考意义。
1.2 系统态仿真
系统态仿真就是对整个固件进行完整的仿真,可以更加全面的分析固件。而且如果我们要进行一些模糊测试时,系统态仿真是我们更好的选择。因为模糊测试对硬件配置有较高的要求,而IoT设备性能较低,往往直接对真机进行模糊测试都会失败;同时,也是因为如此,对比发现,软件进行系统模拟的效率要比使用IoT设备的效率高得多,所以系统态仿真往往是更好的选择,既能提高程序性能,又能提高模糊测试的成功率。
使用系统态进行固件仿真之前也需要确定要仿真的路由器固件的CPU架构,主要有arm架构和mips架构,这两种架构的所需要的镜像和启动方式也有很大的不同。下面是一个具体的示例来说明使用QEMU系统态模拟mips架构的Huawei HG532路由器固件,进而分析漏洞CVE-2017-17215。系统态仿真首先要根据要仿真的路由器固件的CPU架构来确定下载的镜像,Huawei HG532这个路由器固件是mips架构的,可以下载QEMU需要的 Debian mips系统的两个文件镜像下载(https://people.debian.org/~aurel32/qemu/mips/),经过成功验证的可用镜像为`debian_squeeze_mips_standard.qcow2和vmlinux-2.6.32-5-4kc-malta`(要把这两个镜像下载在同一文件夹内)。使用以下指令启动刚下载的镜像。
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,macaddr=00:16:3e:00:00:01 -net tap
在启动的镜像当中输入用户名及密码root/root登入到镜像当中。登进去后可以ping命令检查一下网络的连通性(若网络不通则检查环境配置是否正确)。然后使用指令将之前解压的固件拷贝到QEMU里面`scp -r ./squashfs-root root@镜像的ip:/root/`。在QEMU当中切换到路由器的根路径`chroot /root/ _HG532eV100R001C01B020_upgrade_packet.bin.ex tracted/squashfs-root bin/sh`来切换根目录到路由器文件系统,启动mic服务。服务开启后可以打开浏览器,通过镜像ip访问路由器的web界面,如图3所示。默认的账号密码是:admin/@Hua1234。在仿真成功后我们就可以对具体的漏洞进行分析了,具体的环境搭建及相应的操作过程可以参考文档CVE-2017-17215漏洞复现(在参考当中)。
二、固件仿真工具-Firmadyne
Firmadyne是一个自动化和可扩展的系统,用于对基于Linux的嵌入式固件执行仿真和动态分析。主要包含执行固件指令而修改的内核、用户空间NVRAM库,用于仿真硬件NVRAM外设、用于从固件中提取文件系统和内核的解压器、小型控制台用来调试、超过42个供应商的固件支持这几个组件,作者还编写了可访问的网页、SNMP信息、漏洞检查这三个基本的自动分析。和QEMU相比,Firmadyne提出了自动化的仿真,这种仿真对于用户来说是极大的便利,是完全的一键式仿真,使用这种工具的好处是简单易操作、也能很快知道仿真结果。Firmadyne自动仿真固件主要步骤有解析固件提取文件系统、根据提取的文件系统,判断固件的架构信息、 修复文件系统如libnvram.so常见的设备文件等,并打包镜像、获取目标固件的网络配置信息,并生成QEMU的启动脚本、执行生成的启动脚本,开始仿真。
Firmware Analysis Toolkit-固件分析工具包是基于Firmadyne 进行了一些更改。主要包含Firmadyne、Binwalk、Firmware-Mod-Kit、MITMproxy、Firmwalker这些现有工具和项目的基础上构建的。因为固件分析工具包fat当中包含了Firmadyne,所以本文当中直接使用fat进行示例仿真。以下是对Netgear DGN2200v1路由器固件进行仿真的示例介绍。(对于Firmadyne这个工具来说,环境搭建并不是那么简单,在搭建好环境后就可以完全的一键式仿真了。)仿真过程如图4所示:
根据仿真出的路由器ip可以在浏览器当中访问,可以看到对应品牌的路由器web界面,如图5所示:
Netgear DGN2200v1的默认用户名和密码是admin/password,可以登进去看到正常的路由器子页面。在子页面就可以对仿真的路由器进行相关的设置操作,比如修改用户名和密码等。使用这种工具仿真过程简单、仿真速度快,缺点就是仿真成功率低。主要是因为固件品牌的高度定制化和固件的异构性。但对于固件仿真来说,Firmadyne这个工具还是值得用起来的。
三、固件仿真工具-firmAE
上面提到的一个自动化的仿真工具Firmadyne缺点是仿真成功率低,在Firmadyne的基础上,韩国的一个团队提出了另外一种执行仿真和漏洞分析的全自动框架—FirmAE。FirmAE提出仲裁仿真的方式,从固件的启动、网络、NVRAM、内核以及其它五个方面,总结了导致固件仿真失败的原因以及具备通用性的方法。将原本 Firmadyne 16.28% 的成功率(183个成功仿真),提高到79.36%(892个成功仿真)。
FirmAE中主要集成了四种模式,check模式、run模式、analyze 模式、debug 模式。在固件仿真当中我们通常利用的是前两种模式check模式和run模式。check 模式会对固件进行仲裁仿真的各项操作,将设备运行后,检查网络连通性和服务可用性,最后仿真退出,保存相关的日志信息记录在缓存文件中。run模式是根据 check模式构建的各种处理信息,进行仿真,在仿真程序时不会退出。
使用FirmAE进行仿真时可以利用这个工具的模式特点之一先进行初步的仿真判断。FirmAE提供了check模式可以检查下固件是否可以仿真,会给出仿真成功后可以访问web页面的ip,亦或是仿真失败给出仿真失败的原因比如固件提取失败、网络构建失败、服务启动失败等。以下通过对Netgear DGN2200v1路由器固件进行仿真来对FirmAE的使用进行介绍。
在固件仿真之前可以通过check模式对固件是否能进行仿真有初步的了解,如图6所示。
在check模式可以进行仿真的情况下,下一步就可以使用运行模式进行固件的仿真。在已经执行过check模式下再进行仿真时,仿真的速度会变得很快。下图就是FirmAE仿真成功的界面,我们可以打开浏览器,通过仿真出的路由器ip访问到路由器web界面,登进去再访问子页面,如图7图8所示。
四、小结
本文当中介绍的几种固件仿真工具都是作者本人用过的,所以会在使用上略有一点心得。还有一些优秀的仿真工具比如firmware-analysis-plus,是在binwalk、firmadyne 、firmware-analysis-toolkit的基础上做出了改进和定制,但因为本人未使用过所有没有对这种工具进行介绍。此外,本文当中也并没有对这些仿真工具的环境搭建进行介绍,因为每一种仿真工具的环境搭建方式都不一样,可以查看项目仓库进行安装,因此就没有在文中进行叙述说明了。
随着近些年来研究者对于物联网安全的关注,固件仿真变得很重要。对于固件仿真本身来说,因为固件设备来自于非标准化的开发过程,使得设备驱动、库、内核都存在差异,更有一些固件厂商对固件进行加密或者其他的私人定制也让固件仿真变得困难了起来,这也是这些固件仿真工具仿真成功率不是很高的原因。在实际的固件研究当中,了解多种仿真工具以及对于可仿真的固件品牌、固件版本进行整理是很有必要的,可以极大的方便我们的物联网安全性研究。
参考文献
[1] CVE-2017-17215漏洞复现(http://www.freebuf.com/vuls/160040.html)
[2] Firmadyne (https://github.com/firmadyne/firmadyne)
[3] Firmware Analysis Toolkit (https://github.com/attify/firmware-analysis-toolkit)
[4] FirmAE (https://github.com/pr0v3rbs/FirmAE)
[5] firmware-analysis-plus (https://github.com/liyansong2018/firmware-analysis-plus)
版权声明
本站“技术博客”所有内容的版权持有者为绿盟科技集团股份有限公司(“绿盟科技”)。作为分享技术资讯的平台,绿盟科技期待与广大用户互动交流,并欢迎在标明出处(绿盟科技-技术博客)及网址的情形下,全文转发。
上述情形之外的任何使用形式,均需提前向绿盟科技(010-68438880-5462)申请版权授权。如擅自使用,绿盟科技保留追责权利。同时,如因擅自使用博客内容引发法律纠纷,由使用者自行承担全部法律责任,与绿盟科技无关。