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能跑起來,但是會警告有些測試用例是沒用的,建議修剪。警告如下圖,是以接下來修剪一下測試用例
5.修剪測試用例
afl-cmin:移除執行路徑相同的輸入檔案。 -i 輸入, -o 修剪後的結果儲存目錄(會自動建立),修剪後input裡隻剩下一個檔案了。
$ afl-cmin -i ./in/minimum-set-tif/ -o input -- ./tools/tiff2rgba @@
将 ./in 替換成 ./input 再跑一次就不報警告了
$ afl-fuzz -i ./input -o ./out ./tools/tiff2rgba @@
除了可以對多個檔案整體進行修剪外,AFL還提供了對單個檔案進行瘦身的功能,我們利用上一步精簡後 input 目錄下的一個檔案來瘦身。
afl-tmin:減小單個輸入檔案的大小。需要注意的是 -i 後面跟的不能是目錄,必須是檔案,相應地,-o 輸出出來的也是一個檔案。
$ afl-tmin -i ./input/rhbz135888-1.tiff -o input_testcase -- ./tools/tiff2rgba @@
可以看到,直接瘦身到了 0 byte
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 制定結果輸出的檔案(會自動建立)。
如下圖,開跑
由于我隻是想試用一下這兩個模糊測試工具,并不是沖着發現漏洞去的,是以跑一會兒就手動(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