天天看點

模糊測試入門案例,利用AFL和Honggfuzz模糊測試Tiff

1.AFL模糊測試tiff

AFL的安裝已經在前文記錄過American Fuzzy Lop(AFL)的安裝與簡單使用,不再贅述。這裡主要記錄一下在使用AFL時的可以注意的點。

  • 最好選擇由C或者C++編寫的軟體或是項目
  • 有可用的示例代碼
  • 最好能自己編譯插樁,Qemu模式比較慢
  • 最好有測試用例(語料庫)

下面主要記錄一下利用 AFL 模糊測試 tiff (一個圖像處理軟體) 的過程,有源碼fuzz。

1.下載下傳解壓壓縮包

$ wget https://download.osgeo.org/libtiff/tiff-4.3.0.tar.gz	# 下載下傳壓縮包
$ tar -zxvf tiff-4.3.0.tar.gz
$ cd tiff-4.3.0	
           

2.編譯插樁

将編譯器指定為 afl-gcc,(c++程式需要将編譯器指定為afl-g++) --disable-shared 指明建構靜态庫,查資料顯示不加這個參數建構的好像是共享庫,fuzz共享庫可能需要編寫一個簡單的demo,是以簡單起見,建構靜态庫。

$ ./configure CC="afl-gcc" CXX="afl-g++" --disable-shared # 
$ make 	# 然後再進行編譯
$ make install
           

3.建構語料庫,即準備測試用例作為種子檔案

從網上找一些圖檔,AFL官方也給出了測試用例,我并沒有采用官方的測試用例,因為後續還試用了一下AFL對測試用例的修剪功能,但官方的測試用例隻有一個圖檔。

$ mkdir in	# 該檔案夾下存放種子用例
$ cd in
$ wget https://dev-www.libreoffice.org/corpus/tiffuzzer_seed_corpus.zip
$ unzip tiffuzzer_seed_corpus.zip
           

4.開始fuzz

-i 指定輸入用例目錄, -o 指定結果輸出的目錄(會自動建立)。上一步解壓出來的測試用例其實是放在 ./in/minimum-set-tif 檔案夾下的,但是這裡指令語句裡寫成 ./in 它也能讀到測試用例。

$ cd ..
$ afl-fuzz -i ./in -o ./out ./tools/tiff2rgba @@	# ./tools 目錄下的綠色檔案都可以測試
           

這樣直接fuzz能跑起來,但是會警告有些測試用例是沒用的,建議修剪。警告如下圖,是以接下來修剪一下測試用例

模糊測試入門案例,利用AFL和Honggfuzz模糊測試Tiff

5.修剪測試用例

afl-cmin:移除執行路徑相同的輸入檔案。 -i 輸入, -o 修剪後的結果儲存目錄(會自動建立),修剪後input裡隻剩下一個檔案了。

$ afl-cmin -i ./in/minimum-set-tif/ -o input -- ./tools/tiff2rgba @@	
           
模糊測試入門案例,利用AFL和Honggfuzz模糊測試Tiff

将 ./in 替換成 ./input 再跑一次就不報警告了

$ afl-fuzz -i ./input -o ./out ./tools/tiff2rgba @@	
           
模糊測試入門案例,利用AFL和Honggfuzz模糊測試Tiff

除了可以對多個檔案整體進行修剪外,AFL還提供了對單個檔案進行瘦身的功能,我們利用上一步精簡後 input 目錄下的一個檔案來瘦身。

afl-tmin:減小單個輸入檔案的大小。需要注意的是 -i 後面跟的不能是目錄,必須是檔案,相應地,-o 輸出出來的也是一個檔案。

$ afl-tmin -i ./input/rhbz135888-1.tiff -o input_testcase -- ./tools/tiff2rgba @@	
           

可以看到,直接瘦身到了 0 byte

模糊測試入門案例,利用AFL和Honggfuzz模糊測試Tiff

2.Honggfuzz模糊測試tiff

Honggfuzz 的原理和使用整體上跟AFL很像,就不細說了。

$ wget https://download.osgeo.org/libtiff/tiff-4.3.0.tar.gz	# 下載下傳壓縮包
$ tar -zxvf tiff-4.3.0.tar.gz	# 解壓
$ cd tiff-4.3.0	
$ ./configure CC="hfuzz-gcc" CXX="hfuzz-g++" # 将編譯器指定為 hfuzz-gcc,(c++程式需要将編譯器指定為hfuzz-g++)
$ make 	# 然後再進行編譯
$ make install
$ mkdir in	# 該檔案夾下存放種子用例
$ cd in
$ wget ......	# 從網上擷取一些用例
$ cd ..
$ honggfuzz -s -f in -W out --./tools/tiff2rgba	# -f 指定輸入用例, -W 制定結果輸出的檔案(會自動建立)。
           

如下圖,開跑

模糊測試入門案例,利用AFL和Honggfuzz模糊測試Tiff

由于我隻是想試用一下這兩個模糊測試工具,并不是沖着發現漏洞去的,是以跑一會兒就手動(Ctrl+c)停止了。這兩款工具好像并不會自動停止fuzz,是以何時手動終止測試也是一門學問,有時間再記錄。

Fuzz其中有很多原理和機制也還沒弄明白,歡迎指正和讨論。

參考文章,感謝大佬們:

https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/

https://www.freebuf.com/articles/system/191543.html

繼續閱讀