一、Boofuzz安裝
Boofuzz是一個Python編寫的模糊測試框架,支持TCP和UDP協議上的模糊測試,能夠對自定義的協議進行測試。安裝Boofuzz需要安裝Python和pip。在終端輸入以下命令:
pip install boofuzz
如果需要進行網絡模糊測試,則還需要安裝WinPCAP或Npcap。
二、Boofuzz測試覆蓋率
Boofuzz可以提供測試覆蓋率,幫助檢測已經測試的代碼部分。
首先需要啟動被測試的應用程序,例如TCP服務器。然後將其IP地址和端口設置為Boofuzz腳本中的目標IP和端口:
target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 1234, proto='tcp'))
啟動測試時,需要將coverage=True設置為True:
boofuzz.Session(target=target, fuzz_loggers=fuzz_logger, crash_threshold=1, fuzz_db_keep_only_last=True, start_callbacks=start_cb, pre_send_callbacks=pre_send_cb, post_send_callbacks=post_send_cb, check_results=True, halt_on_error=True, coverage=True)
測試完成後,可以使用covreport命令生成覆蓋率報告:
boofuzz covreport
三、Boofuzz教程
Boofuzz的核心是FuzzSession類。可以使用以下腳本作為模板:
import boofuzz
def main():
target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 1234, proto='tcp'))
session = boofuzz.Session(target=target)
s_initialize(name="Request")
s_static("GET")
s_delim(" ",fuzzable=False)
s_string("/index.html")
s_delim(" ",fuzzable=False)
s_string("HTTP/1.1")
s_static("\r\n\r\n")
session.connect(s_get("Request"))
session.fuzz()
if __name__ == "__main__":
main()
這個示例會發送HTTP GET請求到192.168.1.1:1234。首先需要使用s_initializedefine請求,然後定義具體的請求格式和內容。最後使用s_get獲取請求,並使用session.fuzz()進行模糊測試。
四、Boofuzz實戰
在實際應用中,可以使用Boofuzz對自己編寫的協議進行模糊測試。例如測試自己編寫的FTP服務器:
import boofuzz
def main():
target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 21, proto='tcp'))
session = boofuzz.Session(target=target)
s_initialize(name="Request")
s_static("USER")
s_delim(" ",fuzzable=False)
s_string("anonymous")
s_static("\r\n")
s_static("PASS")
s_delim(" ",fuzzable=False)
s_string("test")
s_static("\r\n")
session.connect(s_get("Request"))
session.fuzz()
if __name__ == "__main__":
main()
這個示例會發送FTP USER和PASS請求到192.168.1.1:21。可以修改s_string中的字符串進行測試。
五、Boofuzz源碼分析
Boofuzz的核心代碼在boofuzz/models.py中。
Session類作為Boofuzz的核心類,包含了連接、請求等控制邏輯,同時支持協議的多線程、模糊測試請求的自動生成等高級功能。
Fuzzable子類是所有具有模糊測試能力的對象的基類,包括字符串、數字、枚舉等。使用時只需要繼承Fuzzable並重載generate方法即可實現自定義的模糊測試。
Logger類實現了Boofuzz的日誌功能,可以高效地記錄所有測試的請求和響應、崩潰日誌等信息。
Target類封裝了所有與目標應用程序的連接信息,包括IP地址、端口號、協議類型等信息。
六、Boofuzz指導
在使用Boofuzz進行模糊測試時,需要注意以下幾點:
1、合理地選擇測試用例。測試用例應該涵蓋目標協議的各種情況,包括有效的和無效的輸入。
2、根據目標協議的特點選擇模糊測試方法。可以採用逆向分析、符號執行等技術輔助測試。
3、注意測試過程中佔用的系統資源。Boofuzz的多線程、高並發可能會對系統性能造成影響,需要合理分配測試資源。
七、Boofuzz模糊測試
Boofuzz使用基於機器學習的模糊測試方法,能夠自動地生成大量測試用例並對響應進行分析,使測試能夠更加深入、全面。
可以使用以下腳本進行模糊測試:
import boofuzz
def main():
target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 80, proto='tcp'))
session = boofuzz.Session(target=target)
s_initialize(name="Request")
s_static("GET")
s_delim(" ",fuzzable=False)
s_string("/index.html")
s_delim(" ",fuzzable=False)
s_string("HTTP/1.1")
s_static("\r\n\r\n")
session.connect(s_get("Request"))
session.fuzz()
if __name__ == "__main__":
main()
這個示例會發送HTTP GET請求到192.168.1.1:80。Boofuzz會自動地生成大量測試用例並進行測試,同時記錄所有響應信息。
八、Boofuzz實戰入門
可以使用以下腳本進行測試:
import boofuzz
def main():
target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 1234, proto='tcp'))
session = boofuzz.Session(target=target)
s_initialize(name="Request")
s_static("Testing\x00")
session.connect(s_get("Request"))
session.fuzz()
if __name__ == "__main__":
main()
這個示例會發送一個含有空字符的字符串到192.168.1.1:1234。可以修改s_static的內容進行測試。
九、Boofuzz測試結果
Boofuzz會自動地生成測試結果報告,並記錄所有崩潰日誌和響應信息。
在測試過程中,可以使用以下命令查看當前的測試信息:
boofuzz monitor info
在測試完成後,可以使用以下命令生成測試結果報告:
boofuzz sessionsummary
原創文章,作者:QDIH,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/143672.html