学习分析复现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

image.png

  • 2021-2-2 更新:该项目已不再维护,以下方法不推荐使用。推荐使用新的项目:
  • 操作系统:Ubuntu16.04(Kali、Debian、Ubuntu其他版本都多少有点问题)

    环境安装

    下载 Firmware Analysis Toolkit

    安装 firmware-analysis-toolkit,此过程较慢,因为还要递归下载四个项目,取决于你的网速了。
    1. git clone --recursive https://github.com/liyansong2018/Old-Firmware-Analysis-Toolkit.git
    该项目下载完成即可,不需要使用脚本安装
    image.png

    安装 Binwalk

    进入 binwalk 目录,先安装依赖,再安装即可。运行以下命令
    1. ./deps.sh
    2. python setup.py install
    image.png
    注意:
    运行 deps.sh 脚本,可能存在部分依赖安装不上的问题,手动忽略安装不上的依赖,并使用apt-get install 安装剩余的依赖。举个例子,假如遇到如下情况,没有找到 cramfsprogs
    image.png
    直接忽略此包,然后使用 sudo apt-get install + 上述所有包(除报错的包之外)
    1. 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 项目需要的依赖
    1. apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
    image.png
    进入 Firmadyne 目录,需要使用相关脚本下载相应的软件
    1. ./download.sh
    image.png
    安装 Firmadyne 需要的其他环境,包括 QEMU
    1. sudo -H pip install git+https://github.com/ahupp/python-magic
    2. sudo -H pip install git+https://github.com/sviehb/jefferson
    3. apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
    image.png
    如果网络不好,无法使用 git 下载上述文件,可直接打开 github 上的项目链接,直接用浏览器下载,解压,再进行安装
    1. python setup.py build
    2. python setup.py install
    安装并配置 postgresql
    1. apt-get install postgresql
    2. sudo -u postgres createuser -P firmadyne
    3. sudo -u postgres createdb -O firmadyne firmware
    4. sudo -u postgres psql -d firmware < /root/tools/Old-Firmware-Analysis-Toolkit/firmadyne/database/schema //schema具体路径可以在文件内查找
    image.png

    配置运行环境

    修改 firmadyne/firmadyne.config,主要是将以下第四行改成相应的绝对路径
    image.png
  1. firmware-analysis-toolkit 根目录下的两个脚本文件 fat.pyreset.py,拷贝到 firmadyne 目录下,并修改 fat.py
  2. 主要修改如下,root-pass 是当前系统用户的密码,firmadyne_pass 是其在 postgresql 数据库中的账号密码

image.png

固件环境模拟

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

  1. service postgresql start

下载一个固件,进行模拟,这里以较为通用的一个固件为例:

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