1. 论文参考(先敬大佬)
Yaowen Zheng, Ali Davanian, Heng Yin, Chengyu Song, Hongsong Zhu, Limin Sun“FIRM-AFL:通过增强过程仿真对物联网固件进行高吞吐量灰盒模糊测试”,USENIX 安全研讨会,2019 年。
源码:GitHub - zyw-200/FirmAFL: FIRM-AFL is the first high-throughput greybox fuzzer for IoT firmware.
2. 项目部署
2.1. 部署环境
ubuntu 16.04 (18.04碰壁了,摆烂!!!)
2.2. 导入源码
git clone https://github.com/zyw-200/FirmAFL
2.3. 编译QEMU和插件文件
需要基本的环境(gcc,pkg-config,zlib1g-dev libglib2.0-dev)
sudo apt install gcc pkg-config zlib1g-dev libglib2.0-dev python
sudo apt-get install autoconf automake libtool
sudo apt-get install libffi-dev
2.3.1. 用户模式编译
cd user_mode/
./configure --target-list=mipsel-linux-user,mips-linux-user,arm-linux-user --static --disable-werror
make
2.3.2. 系统模式编译
注意:需要先编译/sleuthkit和pixmax包,不然无法通过(3h)
sudo apt-get install binutils-dev libtsk-dev libboost-dev
cd qemu_mode/DECAF_qemu_2.10/
./configure --target-list=mipsel-softmmu,mips-softmmu,arm-softmmu --disable-werror
make
2.3.2.1. 编译问题
解决方法:
进入pixman目录,然后重新编译
./configure
make
此时会出现sleuthkit问题
cd /home/gjj/FirmAFL/qemu_mode/DECAF_qemu_2.10/shared/sleuthkit/
./configure
make
2.4. 导入Firmadyne
2.4.1. 安装firmadyne的部署流程走一遍
所有的操作都是没有报错和状态即可
2.4.2. 修改位置(不同的位置)
2.4.2.1. 修改所有的路径变量地址
vi ./firmadyne/firmadyne.config
2.4.2.2. 将 scripts/makeImage.sh 替换为目录中修改firmadyne_modify脚本
2.4.2.3. 导入数据库
(如果已经导入了原始的schma,需要删除表格,重新导入sudo -u postgres dropdb firmware,sudo -u postgres createdb -O firmadyne firmware)
sudo -u postgres psql -d firmware < ./firmadyne/database/data
📎data.doc(删除文件后缀)
3. 使用测试
3.1. 友讯D-Link——DIR-815_FIRMWARE_1.01(mipsel)小端
3.1.1. 获取和配置QEMU固件信息
cd firmadyne
pip3 install python-magic
python3 ./sources/extractor/extractor.py -b dlink -sql 127.0.0.1 -np -nk "../firmware/DIR-815_FIRMWARE_1.01.ZIP" images
./scripts/getArch.sh ./images/9050.tar.gz
./scripts/makeImage.sh 9050
./scripts/inferNetwork.sh 9050
cd ..
python FirmAFL_setup.py 9050 mipsel
#虚拟盘创建
#获取网络接口状态,创建TAP
#python FirmAFL_setup.py 9050 mipsel创建一个9050镜像文件包
3.1.2. 启动FUZZ测试(QEMU+AFL)——用户模式
3.1.2.1. 启动文件调整(run.sh)
对于不同的架构,需要更改firmadyne原始的处理,调用作者写的脚本进行处理
- 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} \
在调用qemu之前添加和替换
- 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} \
同上
3.1.2.2. AFL_FUZZ
cd image_9050
python start.py 9050
此时可能会报以下错误
按照作者的意思,用FirmAFL_config/9050/run.sh 替换image_9050下的run.sh
之后就可以开始fuzz
此时属于FUZZ阶段,会向web带端口发送大量畸形数据,web服务可能受影响
可以在test.py文件中看到,基本fuzz点位为web接口(post\host\Cookie等)
3.1.3. 直接仿真(Firmadyne+DECAF)——系统模式
#qemu封装文件来自于DECAF,运行环境来自于Firmadyne
如果不想进行Fuzz,可以直接运行./run.sh(直接启用qemu)
192.168.0.1(账号admin,无密码)
ctrl +a 之后按x即可关闭QEMU
3.2. 友讯D-Link——DAP-2695_REVA_FIRMWARE_1.11.RC044.ZIP(mips/mipseb)大端
3.2.1. 获取和配置QEMU固件信息
cd firmadyne
python3 ./sources/extractor/extractor.py -b dlink -sql 127.0.0.1 -np -nk "../firmware/DAP-2695_REVA_FIRMWARE_1.11.RC044.ZIP" images
./scripts/getArch.sh ./images/9925.tar.gz
./scripts/makeImage.sh 9925
./scripts/inferNetwork.sh 9925
cd ..
python FirmAFL_setup.py 9925 mips
#查看架构
#构造镜像盘
#获取网络接口状态,创建TAP
#创建fork
3.2.2. 启动FUZZ测试
3.2.2.1. 启动文件调整(run.sh)
对于不同的架构,需要更改firmadyne原始的处理,调用作者写的脚本进行处理
在调用qemu之前添加和替换
- 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} \
3.2.2.2. AFL_FUZZ
之后就可以开始fuzz
sudo python start.py 9925
此时属于FUZZ阶段,会向web带端口发送大量畸形数据,web服务可能受影响
可以在test.py文件中看到,基本fuzz点位为web接口(post\host\Cookie等)
FUZZ结果在outputs中查看
3.2.3. 直接仿真(Firmadyne+DECAF)——系统模式
#qemu封装文件来自于DECAF,运行环境来自于Firmadyne
如果不想进行Fuzz,可以直接运行./run.sh(直接启用qemu)——失败
直接在fimadyne中尝试——成功
192.168.0.50(账号admin,无密码)