学习分析复现IOT产品所存在的相关漏洞,就需要用到我们的固件模拟仿真环境。 很多时候,我们都只有固件,而没有设备,如何在模拟环境中运行固件并非易事。几乎没有一个平台能够模拟所有硬件设备。 IoT产品的架构不尽相同,基于QEMU的仿真平台也比较多,本次我们介绍 Firmadyne 的部署和使用,可以用来模拟不少固件设备。
Firmadyne简介
Firmadyne 是一个自动化和可扩展的系统,用于对基于Linux的嵌入式固件执行仿真和动态分析。项目地址:https://github.com/firmadyne/firmadyne,它包括以下组件:
- 为了执行固件指令而修改的内核(MIPS: v2.6.32, ARM: v4.1, v3.10)
- 用户空间NVRAM库,用于仿真硬件NVRAM外设
- 用于从固件中提取文件系统和内核的解压器
- 一个小型控制台用来调试
- 超过42个供应商的固件支持
作者也基于 Firmadyne 编写了以下三个基本的自动化分析
- 可访问的网页:该脚本在似乎由Web服务器提供服务的固件映像的文件系统中的每个文件中进行迭代,并根据结果是否符合要求的身份验证来汇总结果。
- SNMP信息:此脚本不使用凭据将SNMP v2c public和privateSNMP v2c社区的内容转储到磁盘。
漏洞检查:该脚本使用Metasploit的漏洞测试60个已知漏洞的存在。此外,它还会检查作者发现的14个以前未知的漏洞。有关更多信息,包括受影响的产品和CVE,请参阅 analyses / README.md。
环境信息
Firmadyne 项目本身搭建并不复杂,但是运行特定的固件,稍稍有点麻烦。
我们使用
[firmware-analysis-toolkit:https://github.com/attify/firmware-analysis-toolkit](https://github.com/attify/firmware-analysis-toolkit)。- 该项目集成了以下四个关于固件分析的项目。2020年2月,原作者更新了项目,但是对国内网友并不友好,在进行配置的过程中多多少少仍然会存在问题。
- 本文依旧使用原始版本,因为新版本非常不友好。
- 旧版FAT项目地址:https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit

- 2021-2-2 更新:该项目已不再维护,以下方法不推荐使用。推荐使用新的项目:
- 操作系统:Ubuntu16.04(Kali、Debian、Ubuntu其他版本都多少有点问题)
环境安装
下载 Firmware Analysis Toolkit
安装firmware-analysis-toolkit,此过程较慢,因为还要递归下载四个项目,取决于你的网速了。
该项目下载完成即可,不需要使用脚本安装git clone --recursive https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit.git
安装 Binwalk
进入binwalk目录,先安装依赖,再安装即可。运行以下命令./deps.shpython setup.py install

注意:
运行deps.sh脚本,可能存在部分依赖安装不上的问题,手动忽略安装不上的依赖,并使用apt-get install安装剩余的依赖。举个例子,假如遇到如下情况,没有找到cramfsprogs
直接忽略此包,然后使用sudo apt-get install + 上述所有包(除报错的包之外)apt-get install git build-essential libqt4-opengl mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsswap squashfs-tools zlib1g-dev liblzma-dev liblzo2-dev sleuthkit default-jdk lzop srecord cpio python-crypto python-lzo python-lzma python-pip python-tk python3-crypto python3-pip python3-tk
安装 Firmadyne
首先安装Firmadyne项目需要的依赖apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan

进入Firmadyne目录,需要使用相关脚本下载相应的软件./download.sh

安装Firmadyne需要的其他环境,包括QEMUsudo -H pip install git+https://github.com/ahupp/python-magicsudo -H pip install git+https://github.com/sviehb/jeffersonapt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils

如果网络不好,无法使用git下载上述文件,可直接打开github上的项目链接,直接用浏览器下载,解压,再进行安装
安装并配置python setup.py buildpython setup.py install
postgresqlapt-get install postgresqlsudo -u postgres createuser -P firmadynesudo -u postgres createdb -O firmadyne firmwaresudo -u postgres psql -d firmware < /root/tools/Old-Firmware-Analysis-Toolkit/firmadyne/database/schema //schema具体路径可以在文件内查找
配置运行环境
修改firmadyne/firmadyne.config,主要是将以下第四行改成相应的绝对路径
- 将
firmware-analysis-toolkit根目录下的两个脚本文件fat.py、reset.py,拷贝到firmadyne目录下,并修改fat.py。 - 主要修改如下,
root-pass是当前系统用户的密码,firmadyne_pass是其在postgresql数据库中的账号密码
固件环境模拟
模拟固件之前,需要开启 postgresql 数据库
service postgresql start
下载一个固件,进行模拟,这里以较为通用的一个固件为例:

直接运行 firmadyne 目录下的 fat.py 即可 
方框第一个填要模拟的固件,第二项 brand 是用于数据库的标识,可以随便填。等待一段时间之后,固件就会跑起来,上图紧接着会自动打开SSH,可以远程登录该固件系统,也可以打开网页登录 
至此,完成Firmadyne的环境搭建,并在此基础上,成功仿真一个固件。经过测试,Firmadyne 对一些新固件的模拟并不友好,期待能够发现更好的工具。
