afl测试
22 Mar 2020
|
|
AFL是一种fuzz test工具,可以用来测试各种输入是否引起被测工具崩溃,比如gcc之类的。但是如果是网络模块,比如redis,nginx,没有好的模拟网络的办法。下面是一个演示示例,结合preeny来mock网络
准备工作
编译afl ,tarball在这里https://lcamtuf.coredump.cx/afl/下载
CC=/usr/local/bin/gcc make -j#注意自己的gcc版本。如果不需要考虑这个问题直接make
make install
#cmake指定,编译自己的二进制,指定g++
cmake ../ -DCXX_COMPILER_PATH=/usr/local/bin/afl-g++
#如果不是cmake,指定CC
CXX=/usr/local/bin/afl-g++ make -j
编译preeny没什么难的 参考https://github.com/zardus/preeny readme即可
测试
preeny可以把标准输入强制转换成socket输入,指定好LD_PRELOAD
即可 参考链接 2 3 分别给了redis和nginx的例子
我这里使用的是redis,环境是wsl,参考的参考链接2生成的用例
LD_PRELOAD=/mnt/d/github/preeny/x86_64-linux-gnu/desock.so afl-fuzz -m 8G -i fuzz_in -o fuzz_out/ ./redis-server
测试preeny是否生效可以使用
LD_PRELOAD=/mnt/d/github/preeny/x86_64-linux-gnu/desock.so ./redis-server ./redis.conf < set a b
跑了一个周末,没有发现崩溃的现象。
注意
wsl setsockopt TCP_NODELAY
会报错invalid argument
。屏蔽掉即可
ref
本文参考
- 主要思路 https://copyninja.info/blog/afl-and-network-programs.html
- https://volatileminds.net/2015/08/20/advanced-afl-usage-preeny.html
- https://lolware.net/2015/04/28/nginx-fuzzing.html
几个afl使用例子
- http://0x4c43.cn/2018/0722/use-afl-for-fuzz-testing/ 测试imageshark的
- https://stfpeak.github.io/2017/06/11/Finding-bugs-using-AFL/ 举例测试输入漏洞
- https://www.freebuf.com/articles/system/191536.html fuzz介绍,原理
- http://zeroyu.xyz/2019/05/15/how-to-use-afl-fuzz/ afl使用指南
- https://paper.seebug.org/496/ 原理
- https://www.fastly.com/blog/how-fuzz-server-american-fuzzy-lop