多主機上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 . 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裏的目錄如下:
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”

disfuzz.py主要提供以下幾個功能:
disfuzz

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

auto

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章