主要使用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处需要注意的地方:
在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_cmp
run.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
fi
upgrade.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”
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):