多主机上afl的并行运行方法

主要使用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里的目录如下:
多主机上afl的并行运行方法_第1张图片

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”

disfuzz.py主要提供以下几个功能:
多主机上afl的并行运行方法_第2张图片

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):

多主机上afl的并行运行方法_第3张图片

你可能感兴趣的:(AFL,并行处理,AFL)