固件仿真常用手段

本文最后更新于 2023年1月25日 中午

固件仿真工具- 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 (用户态)

下面就对这两种模式进行介绍。

用户态仿真

用户态仿真简单来说就是使用 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

sudo chroot ./ ./qemu-mips-static -strace /bin/boa -p /web -f /etc/boa.conf

以上是一个 mips 架构的路由器固件的简单示例,在实际操作中还需要根据一些具体的仿真问题进行调试修改,这里给出一个使用 arm 架构进行用户态仿真的案例(https://www.freebuf.com/articles/wireless/166869.html),在这篇文章当中还提到了通过patch修改程序的跳转条件,运行漏洞文件`bin/httpd`进行漏洞分析调试的过程,很具有参考意义。

系统态仿真

系统态仿真就是对整个固件进行完整的仿真,可以更加全面的分析固件。而且如果我们要进行一些模糊测试时,系统态仿真是我们更好的选择。因为模糊测试对硬件配置有较高的要求,而 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 的基础上做出了改进和定制,但因为本人未使用过所有没有对这种工具进行介绍。此外,本文当中也并没有对这些仿真工具的环境搭建进行介绍,因为每一种仿真工具的环境搭建方式都不一样,可以查看项目仓库进行安装,因此就没有在文中进行叙述说明了。

随着近些年来研究者对于物联网安全的关注,固件仿真变得很重要。对于固件仿真本身来说,因为固件设备来自于非标准化的开发过程,使得设备驱动、库、内核都存在差异,更有一些固件厂商对固件进行加密或者其他的私人定制也让固件仿真变得困难了起来,这也是这些固件仿真工具仿真成功率不是很高的原因。在实际的固件研究当中,了解多种仿真工具以及对于可仿真的固件品牌、固件版本进行整理是很有必要的,可以极大的方便我们的物联网安全性研究。


固件仿真常用手段
https://k3ppf0r.github.io/2023/01/24/IOT安全/固件仿真常用手段/
作者
k3ppf0r
发布于
2023年1月24日
许可协议