主要使用github上的工具disfuzz-afl实现这个工具,下载地址:https://github.com/MartijnB/disfuzz-afl
该工具分为服务器端与客户端,服务器端由php编写,客户端由python编写。
服务器端功能:提供待测试项目,存储各客户端传来的数据。
客户端功能:运行afl-fuzz。
服务器端
需安装php环境:
sudo apt-get install apache2(安装apache2) sudo apt-get install php(安装php) sudo apt-get install libapache2-mod-php(一些基本模块) sudo apt-get install php-gd sudo apt-get install php-curl将下载下来的压缩包解压,共有2个文件夹,Client与Server,Client里只有一个py文件,将该文件复制到Server文件夹后,将Server文件夹放在apache根目录下(/var/www/html/)
打开_config.php文件,有几个参数需要修改:
$currentProjects = array( 'example', ); //将项目名称列在该数组里面,这里Server/baseline里有一个example示例。 $baselineFolder = '' . 'baseline'; //baseline文件夹用来放待测项目,这个变量用来存储baseline的路径,由于baseline文件夹与php文件在一个目录下,故前面冒号里,我填入空。 $dataFolder = 'testsync' . '/data'; //存储数据的路径,这样填入之后,会中当前路径下生成一个testsync/data文件夹。 $baseUrl = 'http://222.20.94.126/Server'; //填入服务器的ip地址由于这些php中当前文件夹下,需要用到mkdir()函数来创建文件夹,如果不给定合适的权限,则操作无法完成:
确保所有文件属于Apache组和用户。Ubuntu里面,指的是www-data组和用户
sudo chown -R www-data:www-data /path/to/webserver/www/html/Server赋予www-data组的所有成员读写权限
sudo chmod -R g+rw /path/to/webserver/www/html/Server在session.php文件中有2处需要注意的地方:
第33行,file_exists函数,少了个s,记得加上。多次用到mkdir()这个函数(mkdir($dataFolder . DIRECTORY_SEPARATOR . p r o j e c t N a m e ) ) , 然 而 这 个 用 法 无 法 创 建 多 级 目 录 , 建 议 修 改 成 m k d i r ( projectName)),然而这个用法无法创建多级目录,建议修改成 mkdir( projectName)),然而这个用法无法创建多级目录,建议修改成mkdir(dataFolder . DIRECTORY_SEPARATOR . $projectName,0777,true) 在所有mkdir函数里面,加上0777,true两个参数,这个可以创建多级目录。在download.php文件中,第131行:
$rootFolder != substr($filePath, 0, strlen($rootFolder))建议改为:
!strpos($filePath,$rootFolder)之前已经提到过,有个baseline文件夹,用来存储待测项目的,比如项目名称为example,baseline里的目录如下:
bin/文件夹中需要提供编译好的afl-fuzz可执行文件以及插桩好了的待测程序。
input/文件夹中提供待测程序的测试用例。
还需要编写3个脚本文件,init.sh,run.sh,upgrade.sh
init.sh脚本主要是赋予执行文件的执行权:
#!/bin/bash chmod +x ./bin/afl-fuzz chmod +x ./bin/instrumented_cmprun.sh脚本执行fuzz:
#!/bin/bash export LD_LIBRARY_PATH=./libs:${LD_LIBRARY_PATH} FUZZID=`date "+%Y%m%d%H%M%S"` echo "Fuzz ID: $FUZZID" >&2 if [ "$#" -eq 1 ]; then if [ "$1" == "-master" ]; then ./bin/afl-fuzz -i input -o output -M "$FUZZID" ./bin/instrumented_cmp else ./bin/afl-fuzz -i input -o output -S "$FUZZID" ./bin/instrumented_cmp fi else ./bin/afl-fuzz -i input -o output -S "$FUZZID" ./bin/instrumented_cmp fiupgrade.sh内容与init.sh一样。
客户端
在服务器端会对客户端的hostname进行正则分析,主机名只能是a-z,A-z,0-9间的字符,若不符合,最好改一个hostname,命令行hostname命令即可暂时改变主机名。
新建fuzzing文件夹,从服务器下载disfuzz.py:
mkdir fuzzing wget http://ip/Server/disfuzz.py将disfuzz.py中的第21行DISFUZZ_HOST=“”,中填入主机url,如“http://222.20.94.126/Server”
disfuzz.py主要提供以下几个功能:
auto:一步到位,只需要这一个命令,自己执行包括项目初始化,开始fuzz以及上传fuzz结果等过程。(auto中开始fuzz默认的使用Slave模式)
list:列出服务器上的项目。
init projectname:初始化项目,主要是从服务器上下载项目到本地。
start projectname:开始fuzz项目。(不指定时,默认使用Slave,若想使用Master,加上-m即可)
disfuzz.py中,下载文件部分主要用到了urllib的urlretrieve函数,上传运行结果用到了request.post函数。
disfuzz.py中,使用了tmuxp模块,我使用该模块时会报错,暂时还未找到原因,故注释了727-729这3行,另外,将734与739这两行中的user_tmux=True改为False。
运行截图(auto):