基于Firmadyne的固件模拟环境搭建

很多时候,我们都只有固件,而没有设备,如何在模拟环境中运行固件并非易事。几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同,基于QEMU的仿真平台也比较多,本次我们介绍 Firmadyne 的使用,可以用来模拟不少固件设备,当然,对于一些自研程度较高的固件,支持还是不够友好的。

0x10 简介

Firmadyne 是一个自动化和可扩展的系统,用于对基于Linux的嵌入式固件执行仿真和动态分析。项目地址:https://github.com/firmadyne/firmadyne,它包括以下组件1

  • 为了执行固件指令而修改的内核(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。2

该工具的作者在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种以上的不同产品。有关更多详细信息,请参阅上面链接的论文。


0x20 环境搭建

Firmadyne 项目本身搭建并不复杂,但是运行特定的固件,稍稍有点麻烦,为此我们使用 firmware-analysis-toolkit:https://github.com/attify/firmware-analysis-toolkit。该项目集成了以下四个关于固件分析的项目。笔者发表博客的第二天,原作者更新了项目,但是对国内网友并不友好,请下载该项目 https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit
基于Firmadyne的固件模拟环境搭建_第1张图片
最重要的一点是,项目中的脚本 fat.py 能够帮助我们一键仿真固件。推荐使用 Ubuntu 系统,笔者使用的是 Ubuntu 16.04,在 Kali Linux 2020下测试失败。

0x21 下载 Firmware Analysis Toolkit

安装 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

该项目下载完成即可,不需要使用脚本安装(推荐安装第二个项目)。

0x22 安装 Binwalk

进入 binwalk 目录,先安装依赖,再安装即可。运行以下命令

sudo ./deps.sh
sudo python setup.py install

Tips

运行 deps.sh 脚本,可能存在部分依赖安装不上的问题,手动忽略安装不上的依赖,并使用 apt-get install 安装剩余的依赖。举个例子,假如遇到如下情况,没有找到 cramfsprogs

基于Firmadyne的固件模拟环境搭建_第2张图片
直接忽略此包,然后使用 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

0x23 安装 Firmadyne

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

请注意,这里,最后一行的命令,重定向的路径,是相对路径,是你当前的工作路径,(根据不同的路径,需要替换成不同的路径)也可以换成绝对路径


0x24 配置

修改 firmadyne/firmadyne.config,主要是将以下第四行改成相应的绝对路径
基于Firmadyne的固件模拟环境搭建_第3张图片
firmware-analysis-toolkit 根目录下的两个脚本文件 fat.pyreset.py,拷贝到 firmadyne 目录下,并修改 fat.py。主要修改如下,root-pass 是当前系统用户的密码,firmadyne_pass 是其在 postgresql 数据库中的账号密码
基于Firmadyne的固件模拟环境搭建_第4张图片

0x30 固件环境模拟

模拟固件之前,需要开启 postgresql 数据库

service postgresql start

下载一个固件,进行模拟,这里以较为通用的一个固件为例:NETGEAR https://www.netgear.com/support/product/WNAP320.aspx#Firmware%20Version%203.7.11.4

直接运行 firmadyne 目录下的 fat.py 即可。
基于Firmadyne的固件模拟环境搭建_第5张图片
方框第一个填要模拟的固件,第二项 brand 是用于数据库的标识,可以随便填。等待一段时间之后,固件就会跑起来,上图紧接着会自动打开SSH,可以远程登录该固件系统,也可以打开网页登录 (192.168.0.100)

Tips:可能会遇到的问题,见 F&Q 4


0x40 问题

0x41 git 难以下载某些文件

方法一

直接在网页上下载相应的项目压缩包,复制到项目里。以下命令不含 --recursive 选项,也就是说,不会递归下载里面包含的其他开源项目,需要手动下载

git clone https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit.git

本身就包括以下四个项目
基于Firmadyne的固件模拟环境搭建_第6张图片
包括 firmadyne 中的源码,其实也是空的,需要手动下载,并解压到相应位置
基于Firmadyne的固件模拟环境搭建_第7张图片

方法二

直接下载所有的安装包,已经发布最新版地址:https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit/releases/tag/1.0

相对于源码安装的方式,此方法得到的所有项目可能不是最新的版本。也就是通过方法一能保证我们的 Firmadyne 是最新的,但是较为繁琐;方法二不能保证最新,但是最为简单。


0x42 pexpect.exceptions.EOF

基于Firmadyne的固件模拟环境搭建_第8张图片
多半是因为 postgresql 数据库的问题

sudo -u postgres psql -d firmware < ./firmadyne/database/schema

在项目的根目录下,请输入上述命令,并重启数据库;在启动 fat.py 的时候,Enter band 填写一个不一样的 id。


0x50 总结

至此,完成Firmadyne的环境搭建,并在此基础上,成功仿真一个固件。经过测试,Firmadyne 对一些新固件的模拟并不友好,期待能够发现更好的工具。当然,对于固件中的某些二进制文件,能够单独模拟运行,也是极好的,我们后续再说,怎么在 Linux 中模拟运行这些不同架构的二进制文件。


2020.4.1 更新:添加 0x40 章节



  1. https://github.com/firmadyne/firmadyne ↩︎

  2. https://github.com/firmadyne/firmadyne/blob/master/analyses/README.md ↩︎

  3. NDSS: http://www.internetsociety.org/events/ndss-symposium ↩︎

  4. https://github.com/attify/firmware-analysis-toolkit/issues/15 ↩︎

你可能感兴趣的:(安全工具,逆向与二进制)