boofuzz v0.4.1を用いてファジングを行います。
ターゲットには、VulnServer-Linuxを使用します。
スクリプトの作成
サンプルスクリプトや下記参考サイトを参照し、以下のmyscript.py
を作成しました。
#!/usr/bin/env python3 from boofuzz import * import datetime import os def main(): port = 8080 host = '127.0.0.1' start_commands = ['/path/to/VulnServer-Linux/vuln'] stop_commands = ['ps aux | grep \'vuln\' | grep -v grep | awk \'{ print "kill -9", $2}\' | sudo sh'] now = datetime.datetime.now() os.makedirs("fuzzing_logs", exist_ok=True) csv_log_name = './fuzzing_logs/' + now.strftime('%Y%m%d_%H%M%S') + '_fuzzing.csv' csv_log = open(csv_log_name, 'w') my_logger = [FuzzLoggerCsv(file_handle=csv_log)] procmon = ProcessMonitor(host, 26002) procmon.set_options( start_commands = [start_commands], stop_commands = [stop_commands] ) session = Session( target = Target( connection = TCPSocketConnection(host, port), monitors = [procmon] ), fuzz_loggers = my_logger ) define_proto(session=session) session.fuzz() def define_proto(session): # disable Black formatting to keep custom indentation # fmt: off req = Request("Client-Message", children=( Group(name="Time", values=["HELP", "TIME"], fuzzable=False), Delim(name="space", default_value=" ", fuzzable=False), String(name="Exploit", default_value="FUZZ"), Static(name="CRLF", default_value="\r\n") )) # fmt: on session.connect(req) if __name__ == "__main__": main()
issueに記載のある通り、
procmon.set_options()
にてproc_name
への設定を行うとファジング処理がハングアップするので、注意が必要です。
ファジングの実行
(ターミナル1) python3 process_monitor.py (ターミナル2) python3 myscript.py
上記コマンドの実行によってファジングが実行されます。
boofuzzではProcessMonitorによってターゲットのプロセスを監視しています。 boofuzzはProcessMonitorを利用して、以下の処理の繰り返しで未知の脆弱性を発見します。
- ターゲットにファズデータを一度送信
- ターゲットの生存確認
上記のようにターゲットの死活監視を伴ったファジングにより、再現性のある脆弱性を発見できます。
更に、ファジング中に停止したターゲットは、前述のProcessMonitorによって再起動されるため、 boofuzzは自動的に複数の脆弱性を発見できます。
実行結果
ファジングの実行結果はWebUIで確認できます。
ブラウザでlocalhost:26000
へ接続すると、以下のような画面になります。
WebUIから、ターゲットにバッファオーバーフローの脆弱性があることを確認できました。
環境
- Ubuntu 20.04
参考サイト
boofuzz: Network Protocol Fuzzing for Humans — boofuzz 0.4.1 documentation
Boofuzzで始めるネットワークプロトコルファジング - BinaryGenes