IOT Fuzzing框架AFL++ (上)

 

0x00.前言

Fuzzing是目前漏洞挖掘比较热门和常用的漏洞挖掘技巧,之前的一篇文章已经给大家介绍了几个IOT Fuzzing常用的框架,这里主要针对前面提到的框架进行详细的阐述。

 

0x01.AFL++

AFL++ 是 Google 的 AFL 的一个分支,具有更快的速度,更多的突变,更多的自定义模块等

AFL++的github地址:https://github.com/AFLplusplus/AFLplusplus,在这里看到更完整的教程和测试用例等内容

这里我们主要使用AFL++ Fuzzing 测试IOT的二进制文件,当我们解压提取一个固件时,能够获得大量的IOT二进制应用,如果要进行漏洞挖掘则需要将二进制文件进行逆向分析,然后查找危险函数以及输入接口,对于一个大型的应用,直接进行二进制分析会大大降低我们的效率,所以可以使用Fuzzing技术对IOT的二进制文件进行模糊测试,提高漏洞挖掘效率。

对于IOT的二进制文件通常由于架构的不同,不能直接进行Fuzzing,AFL++可以使用Qemu、Unicorn或Frida 三种模式进行Fuzzing,虽然不如有源码进行Fuzzing高效,但是其适用面广,并且同样能提高漏洞挖掘效率。

AFL++使用qemu用户模式模拟仿真来运行二进制文件,其使用的qemu是进行修改的版本,在程序执行时检测基本块,根据收集的信息生成测试用例,通过生成的大量测试用例触发不同的代码路径,从而提高代码的覆盖率,提高触发Crash的概率。

AFL++和其他的类似的Fuzzing工具(AFL,hongfuzz等)一样,仅适用于文件输入的Fuzzing,不支持从套接字输入的程序,对于套接字的Fuzzing测试在下篇进行讲解,本篇文件将重点落在环境的搭建及文件输入相关的二进制应用的Fuzzing。

 

0x02.AFL++环境搭建

系统环境:Ubuntu 18.04

测试固件:TP-Link SR20、Cisco RV130X

AFL++的安装也比较简单,执行步骤如下:

$ sudo apt update
$ sudo apt install git make build-essential clang ninja-build pkg-config libglib2.0-dev libpixman-1-dev
$ git clone https://github.91chi.fun/https://github.com/AFLplusplus/AFLplusplus.git
$ cd AFLplusplus
$ make all
$ cd qemu_mode
$ CPU_TARGET=arm ./build_qemu_support.sh # 这里编译ARM架构的

 

0x03.AFL++案例一

这里进行测试TP-Link SR20路由器的固件,固件的下载地址如下:https://static.tp-link.com/2018/201806/20180611/SR20(US)_V1_180518.zip

使用Binwalk提取固件

$ binwalk -Me tpra_sr20v1_us-up-ver1-2-1-P522_20180518-rel77140_2018-05-21_08.42.04.bin

接下来我们查找来自文件输入的程序进行Fuzzing测试

这里可以看到大家耳熟能详的bmp2tiff应用,那么我们就拿bmp2tiff进行Fuzzing测试,生成一个bmp的测试用例,将测试用例放到创建的bmp-input文件夹中,同时创建bmp-output Fuzzing输出文件夹

接下来,执行以下命令进行Fuzzing测试

$ QEMU_LD_PREFIX=./squashfs-root/ /home/iot/tools/AFLplusplus/afl-fuzz -Q -i squashfs-root/bmp-input/ -o squashfs-root/bmp-output/ -- ./squashfs-root/usr/bin/bmp2tiff @@ /dev/null # root权限下
# -Q:适用qemu模式
# -i:输入文件夹
# -o:输出文件夹
# @@:表示将用来替换的样本
# /dev/null:忽略错误信息

可以看到在Fuzzing期间触发了8个crash

 

0x04.AFL++案例二

这里进行测试的是Cisco RV130X路由器的固件,固件下载地址如下:https://software.cisco.com/download/home/285026141/type/282465789/release/1.0.3.55?i=!pp

同样提取固件,这里要分析的是负责处理json的程序,jsonparse

同样生成测试的json文件,输入文件夹和输出文件

json文件的内容如下:

{"name":"Jason Ray","profession":"Software Engineer","age":31,"address":{"city":"New York","postalCode":64780,"Country":"USA"},"socialProfiles":[{"name":"Twitter","link":"https://twitter.com"},{"name":"Facebook","link":"https://www.facebook.com"}]}

执行如下命令进行Fuzzing测试

$ QEMU_LD_PREFIX=./squashfs-root/ /home/iot/tools/AFLplusplus/afl-fuzz -Q -i ./squashfs-root/input-json/ -o ./squashfs-root/output-json/ -- ./squashfs-root/usr/sbin/jsonparse @@  # root权限下

可以看到也出现了crash,这里使用程序直接解析生成的crash文件

这里可以看到触发段错误

 

0x05.总结

以上就是AFL++针对IOT对于文件输入类型的二进制应用的Fuzzing测试案例,相信通过上面的方法,大家也能更快的挖掘出IOT先关的漏洞,下篇将为大家讲解针对网络套接字输入的Fuzzing测试案例。

 

0x06.参考链接

https://blog.attify.com/fuzzing-iot-devices-part-1/

(完)