主要使用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 . 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_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主要提供以下幾個功能:
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):