很多时候,我们都只有固件,而没有设备,如何在模拟环境中运行固件并非易事。几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同,基于QEMU的仿真平台也比较多,本次我们介绍 Firmadyne 的使用,可以用来模拟不少固件设备,当然,对于一些自研程度较高的固件,支持还是不够友好的。
Firmadyne 是一个自动化和可扩展的系统,用于对基于Linux的嵌入式固件执行仿真和动态分析。项目地址:https://github.com/firmadyne/firmadyne,它包括以下组件1:
作者也基于 Firmadyne 编写了以下三个基本的自动化分析
该工具的作者在2016年 NDSS 会议上 3,做了专题演讲,Towards Automated Dynamic Analysis for Linux-based Embedded Firmware ,在23,035个固件映像的数据集中评估了 FIRMADYNE 系统,其中能够提取9,486个。使用Metasploit框架中的 60个漏洞以及我们发现的14个以前未知的漏洞,结果显示出1,971个(43%)固件映像中有846个易受至少一个漏洞的攻击,估计会影响89种以上的不同产品。有关更多详细信息,请参阅上面链接的论文。
Firmadyne 项目本身搭建并不复杂,但是运行特定的固件,稍稍有点麻烦,为此我们使用 firmware-analysis-toolkit:https://github.com/attify/firmware-analysis-toolkit。该项目集成了以下四个关于固件分析的项目。笔者发表博客的第二天,原作者更新了项目,但是对国内网友并不友好,请下载该项目 https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit
最重要的一点是,项目中的脚本 fat.py
能够帮助我们一键仿真固件。推荐使用 Ubuntu 系统,笔者使用的是 Ubuntu 16.04,在 Kali Linux 2020下测试失败。
安装 firmware-analysis-toolkit
,此过程较慢,因为还要递归下载四个项目,取决于你的网速了。
git clone --recursive https://github.com/attify/firmware-analysis-toolkit.git
git clone --recursive https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit.git
该项目下载完成即可,不需要使用脚本安装(推荐安装第二个项目)。
进入 binwalk
目录,先安装依赖,再安装即可。运行以下命令
sudo ./deps.sh
sudo python setup.py install
Tips
运行 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
1 首先需要安装 Firmadyne 项目需要的依赖
sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
进入 Firmadyne 目录,需要使用相关脚本下载相应的软件
sh ./download.sh
Tips
由于包放在亚马逊云上,此下载过程非常缓慢,我是不停的 Ctrl + C,停止之后,再运行该命令,有需要者,可在评论留言,直接放在 Firmadyne 的 binaries 目录下即可。
2 安装 Firmadyne 需要的其他环境,包括 QEMU
sudo -H pip install git+https://github.com/ahupp/python-magic
sudo -H pip install git+https://github.com/sviehb/jefferson
sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
Tips
如果网络不好,无法使用 git 下载上述文件,可直接打开 github 上的项目链接,直接用浏览器下载,解压,再进行安装
python setup.py build
sudo python setup.py install
3 安装并配置 postgresql
sudo apt-get install postgresql
sudo -u postgres createuser -P firmadyne
sudo -u postgres createdb -O firmadyne firmware
sudo -u postgres psql -d firmware < ./firmadyne/database/schema
Tips
请注意,这里,最后一行的命令,重定向的路径,是相对路径,是你当前的工作路径,(根据不同的路径,需要替换成不同的路径)也可以换成绝对路径
修改 firmadyne/firmadyne.config
,主要是将以下第四行改成相应的绝对路径
将 firmware-analysis-toolkit
根目录下的两个脚本文件 fat.py
、reset.py
,拷贝到 firmadyne 目录下,并修改 fat.py
。主要修改如下,root-pass 是当前系统用户的密码,firmadyne_pass 是其在 postgresql 数据库中的账号密码
模拟固件之前,需要开启 postgresql 数据库
service postgresql start
下载一个固件,进行模拟,这里以较为通用的一个固件为例:NETGEAR https://www.netgear.com/support/product/WNAP320.aspx#Firmware%20Version%203.7.11.4
直接运行 firmadyne 目录下的 fat.py 即可。
方框第一个填要模拟的固件,第二项 brand 是用于数据库的标识,可以随便填。等待一段时间之后,固件就会跑起来,上图紧接着会自动打开SSH,可以远程登录该固件系统,也可以打开网页登录 (192.168.0.100)
Tips:可能会遇到的问题,见 F&Q 4。
方法一
直接在网页上下载相应的项目压缩包,复制到项目里。以下命令不含 --recursive
选项,也就是说,不会递归下载里面包含的其他开源项目,需要手动下载
git clone https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit.git
本身就包括以下四个项目
包括 firmadyne 中的源码,其实也是空的,需要手动下载,并解压到相应位置
方法二
直接下载所有的安装包,已经发布最新版地址:https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit/releases/tag/1.0
相对于源码安装的方式,此方法得到的所有项目可能不是最新的版本。也就是通过方法一能保证我们的 Firmadyne 是最新的,但是较为繁琐;方法二不能保证最新,但是最为简单。
sudo -u postgres psql -d firmware < ./firmadyne/database/schema
在项目的根目录下,请输入上述命令,并重启数据库;在启动 fat.py 的时候,Enter band 填写一个不一样的 id。
至此,完成Firmadyne的环境搭建,并在此基础上,成功仿真一个固件。经过测试,Firmadyne 对一些新固件的模拟并不友好,期待能够发现更好的工具。当然,对于固件中的某些二进制文件,能够单独模拟运行,也是极好的,我们后续再说,怎么在 Linux 中模拟运行这些不同架构的二进制文件。
2020.4.1 更新:添加 0x40 章节
https://github.com/firmadyne/firmadyne ↩︎
https://github.com/firmadyne/firmadyne/blob/master/analyses/README.md ↩︎
NDSS: http://www.internetsociety.org/events/ndss-symposium ↩︎
https://github.com/attify/firmware-analysis-toolkit/issues/15 ↩︎