FirmAFL使用并改进了Firmdyne模拟方式,并利用AFL对IoT固件实施高通量灰盒Fuzzing。
一、项目简介
FIRM-AFL 是
第一个针对物联网固件的高吞吐量灰盒模糊测试器。
支持mipsel、mipseb和armel三种CPU架构
,涵盖Firmadyne数据库中90.2%的固件。
FIRM-AFL 解决了物联网固件模糊测试的两个基本问题:
-
解决了兼容性问题:它通过启用 posix 兼容固件的模糊处理来解决兼容性问题,这些固件可以在系统仿真器中仿真;
-
解决了性能瓶颈:采用“ 增强进程仿真”技术解决了系统模式仿真造成的性能瓶颈。通过将 系统模式仿真 (高通用性、低效率)与 用户模式仿真 (低通用性、高效率)相结合,增强的进程仿真作为系统模式仿真提供了高兼容性,作为用户模式仿真提供了高吞吐量。
要模糊测试的程序主要运行在用户模式仿真,以实现高效率。只有在必要时切换到全系统仿真,以确保程序的正确执行,从而实现通用性。
FIRM-AFL基于AFL和Firmadyne实现,其中AFL负责对物联网固件中用户指定的程序进行覆盖引导模糊测试,就像使用AFL对普通用户级程序进行模糊测试一样,Firmadyne负责用户模式仿真和全系统仿真之间的切换,以确保给定的程序能够被正确地仿真。
我们设计并实现了FIRM-AFL,这是AFL的增强功能,用于模糊化物联网固件。我们
保持 AFL 的工作流程不变,并将用户模式 QEMU 替换为增强的流程仿真,其余组件保持不变。新的工作流如图 所示:
二、用法
先安装依赖:
sudo apt
-get install git
sudo apt
-get install binutils
-dev
sudo apt
-get install
-y libsdl1
.2
-dev zlib1g
-dev libglib2
.0
-dev libbfd
-dev build
-essential binutils qemu libboost
-dev git libtool autoconf xorg
-dev
1
、获取项目
cd /home/zhang/Desktop/
git clone https
://
github
.
com
/
zyw
-
200
/
FirmAFL
.
git
2
、编辑用户模式
cd
./FirmAFL
/user_mode
/
./configure
--target
-list
=mipsel
-linux
-user
,mips
-linux
-user
,arm
-linux
-user
--static
--disable
-werror
make
3
、编译系统模式
cd
../qemu_mode
/DECAF_qemu_2.10
/
./configure
--target
-list
=mipsel
-softmmu
,mips
-softmmu
,arm
-softmmu
--disable
-werror
make
4、安装Firmadyne
cd
../../
# 即在
FirmAFL/目录下
sudo apt
-get install busybox
-static fakeroot git dmsetup kpartx netcat
-openbsd nmap python
-psycopg2 python3
-psycopg2 snmp uml
-utilities util
-linux vlan
git clone
--recursive https
://github
.com
/firmadyne
/firmadyne
.git
5、安装binwalk
git clone https
://github
.com
/devttys0
/binwalk
.git
#
在
FirmAFL/目录下
cd binwalk
sudo
./deps
.sh
sudo python
./setup
.py install
6、
编译Firmadyne数据库(自行设置数据库密码)
cd ../firmadyne
sudo apt
-get install -y postgresql
sudo service postgresql start
sudo service postgresql status
#
用户的密码设置为:
firmadyne
sudo
-u postgres createuser
-P firmadyne
安装postgres后状态不对
等价于
sudo -u postgres psql -c "create role firmadyne with login password 'firmadyne';"
sudo
-u postgres createdb
-O firmadyne firmware
# 创建数据库firmware
准备好
data.xz数据:
data.xz_免费高速下载|百度网盘-分享无限制 (baidu.com)
cd database
cp
/home
/zhang
/Downloads
/data
.xz
./
# 此处data.xz的路径请自行更改
xz
-d data
.xz
mv data schema
chmod
+x schema
sudo
-u postgres psql
-d firmware
<
./schema
7、
使用Firmadyne仿真固件
7.1、进入Firmadyne目录,然后打开firmadyne
.config,
修改
FIRMWARE_DIR
的路径为当前
Firmadyne
目录的绝对路径
vi ../firmadyne/
firmadyne
.
config
#
以下为
firmadyne.config
中的内容
# uncomment and specify full path to FIRMADYNE repository
FIRMWARE_DIR
=
/home/zhang/Desktop/FirmAFL/firmadyne/
# specify full paths to other directories
BINARY_DIR
=
${FIRMWARE_DIR}
/binaries
/
TARBALL_DIR
=
${FIRMWARE_DIR}
/images
/
SCRATCH_DIR
=
${FIRMWARE_DIR}
/scratch
/
SCRIPT_DIR
=
${FIRMWARE_DIR}
/scripts
/
# functions to safely compute other paths
...
...
7.2、要为所有组件下载我们预先构建的二进制文件
sh
./download
.sh
# 开启外网或者手工下载放到
firmadyne/binaries/目录下
7.3、
将 scripts/makeImage.sh 替换为
FirmAFL/firmadyne_modify/下的
makeImage
.
sh
cp
../firmadyne_modify
/makeImage
.sh
./scripts
/
7.5、使用extractor提取filesystem
-
- nk:no kernel,不提取内核;
-
- np:no parallel operation,没有并行操作;
-
- sql: SQL服务器的主机名 ;
-
- b: 固件镜像的品牌 ;
-
Images:存储压缩文件在images .
# extractor
.
py中的头部修改为 python3
sudo
./sources
/extractor
/extractor
.py
-b dlink
-sql
127.0.0.1
-np
-nk
"../firmware/DIR-815_FIRMWARE_1.01.ZIP" images
提取后的文件如下:
此时数据库:
psql -U firmadyne -h127.0.0.1 -p5432 -dfirmware
7.6、识别固件的架构并将结果存储在数据库的表中
sudo
./scripts
/getArch
.sh
./images
/9050.tar.gz
此时数据库:
7.7、创建编号为9050的固件的qemu镜像
sudo
./scripts
/makeImage
.sh 9050
生成镜像:
/home/zhang/Desktop/FirmAFL/firmadyne//scratch//9050//image/:
/home/zhang/Desktop/FirmAFL/firmadyne//../image_9050:
7.8、指定固件的网络配置并将信息记录到
./scratch/1/qemu.initial.serial.log
sudo
./scripts
/inferNetwork
.sh
9050
7.9、FirmAFL准备工作
cd
../
python3 FirmAFL_setup.py
9050
mipsel
# 会在
FirmAFL/image_9050/目录下生成一些文件
8、替换run.sh
>>> 因为这个固件是项目示例,可以按照如下方法操作替换run.sh:
cp
./FirmAFL_config
/
9050
/run
.sh
./image_9050
/
# 即用FirmAFL_config中的run.sh替换image_9050中的run.sh
两者的区别在于:
>>> 若固件不是项目示例,则直接在FirmAFL
/image_id
/run
.sh修改,以便使用我们修改后的 QEMU 和内核来模拟固件,并在 RAM 文件上运行。
For mipsel
,
ARCH=mipsel
QEMU="./qemu-system-${ARCH}"
KERNEL="./vmlinux.${ARCH}_3.2.1"
IMAGE="./image.raw"
MEM_FILE="./mem_file"
${QEMU} -m 256 -mem-prealloc -mem-path ${MEM_FILE} -M ${QEMU_MACHINE} -kernel ${KERNEL} \
For mipseb
,
ARCH=mips
QEMU="./qemu-system-${ARCH}"
KERNEL="./vmlinux.${ARCH}_3.2.1"
IMAGE="./image.raw"
MEM_FILE="./mem_file"
${QEMU} -m 256 -mem-prealloc -mem-path ${MEM_FILE} -M ${QEMU_MACHINE} -kernel ${KERNEL} \
9、运行模糊测试过程
运行 start.py 脚本后,FirmAFL将启动固件仿真,系统初始化(120s)后,将开始模糊测试过程。(也许你应该使用 root 权限来运行它。
cd image_9050
python3 start
.py
9050
执行遇到错误:
参考:
QEMU Segmentation fault when I run the example · Issue #47 · zyw-200/FirmAFL (github.com)
意思是对/home/zhang/Desktop/FirmAFL/qemu_mode/DECAF_qemu_2.10/shared/vmi.cpp中的391行注释掉,再重新
编译系统模式
最终结果:
三、参考
https://github.com/zyw-200/FirmAFL
IoT固件Rehosting综述 - FreeBuf网络安全行业门户
[翻译]Firm-AFL:高效的IOT固件灰盒fuzz-智能设备-看雪-安全社区|安全招聘|kanxue.com
FIRM-AFL: 通过增强进程仿真实现物联网固件的高吞吐量灰盒模糊测试_固件模糊测试_寂寞烟火~的博客-CSDN博客
论文FirmAFL固件模糊测试工具——复现之路_h0_yang的博客-CSDN博客