はじめに
ブラックボックスファジングに興味があったので、2021年3月にオープンソース化されたGitLab Protocol Fuzzer Community Editionを触ってみました。
本記事ではGitLab Protocol Fuzzer Community Editionの導入からチュートリアルまでの手順を記述します。
導入
ソースからビルドするのがやや面倒だったため、issueにて提供されていたDockerfileを利用してDockerイメージをビルドしました。
Dockerfileはこちらから入手できます。
$ git clone https://github.com/vanhauser-thc/peachpro.git
$ cd peachpro
$ docker image build -t peach ./ 
Hello World
doc/samples/にいくつかサンプルファイルがあったので、ひとまずHelloWorld.xmlを実行します。
$ docker container run -it --rm --entrypoint "bash" --name peach-container peach
root@xxx# ./peach ./doc/samples/HelloWorld.xml 
上記コマンドを実行したところ、ターミナルに様々な文字列が出力され続けました。(Ctrl-Cで中断できます)
Tutorials (Dumb Fuzzing)
GitLab Protocol Fuzzer Community Editionの前身であるPeach FuzzerのTutorials (Dumb Fuzzing) を参考に、実際にファジングを行ってみます。
具体的には、画像表示ソフトfehに対して様々な.pngファイルを読み込ませるファジングを行います。
なお、以降のxmlファイルについての解説は調査中により推測も含みますので、誤りがありましたらご指摘いただけると幸いです。
Creating the data model
こちらのページのtemplate.xmlに相当するファイルがpeach/内に見つからなかったので、HelloWorld.xmlをひな形にしてTutorialを進めます。
root@xxx# cd /peach/pits/
root@xxx# cp ../doc/samples/HelloWorld.xml ./png.xml
DataModelエレメントでは、ファジング用のデータ生成に使用するデータの形式を指定します。
Number、Blob、Stringなどを指定できますが、今回はBlobを指定します。
(中略)
<DataModel name="TheDataModel">
    <Blob />
</DataModel>
(中略)
Creating the state model
StateModelエレメントでは、ファジング用のファイルを読みだすoutput、ファイルを閉じるclose、起動するアプリケーションを指定するcallを記述します。
(中略)
<StateModel name="TheState" initialState="Initial">
    <State name="Initial">
        <Action type="output">
            <DataModel ref="TheDataModel"/>
            <Data name="data" fileName="/peach/doc/samples/samples_png/*.png"/>
        </Action>
        <Action type="close"/>
        <Action type="call" method="LaunchViewer" publisher="Peach.Agent"/>
    </State>
</StateModel>
(中略)
Configuring a publisher
前節で設定したpublisherを呼び出します。
(中略)
<Test name="Default">
    <Publisher />
</Test>
(中略)
Adding an agent and monitor
調査中
最終的にpng.xmlは以下の内容になります。
<?xml version="1.0" encoding="utf-8"?>
<Peach xmlns="http://peachfuzzer.com/2012/Peach" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://peachfuzzer.com/2012/Peach ../peach.xsd">
	<DataModel name="TheDataModel">
		<Blob />
	</DataModel>
	
	<StateModel name="TheState" initialState="Initial" >
		<State name="Initial"  >
			<Action type="output" >
				<DataModel ref="TheDataModel"/>
				<Data name="data" fileName="/peach/doc/samples/samples_png/*.png"/>
			</Action>
			<Action type="close"/>
			<Action type="call" method="LaunchViewer" publisher="Peach.Agent"/>
		</State>
	</StateModel>
	<Agent name="LinAgent">
		<Monitor class="LinuxDebugger">
			<Param name="Executable" value="feh"/>
			<Param name="Arguments" value="fuzzed.png"/>
			<Param name="CpuKill" value="true"/>
		</Monitor>
	</Agent>
	<Test name="Default">
		<Agent ref="LinAgent" platform="linux"/>
		<StateModel ref="TheState"/>
		<Publisher class="File">
			<Param name="FileName" value="fuzzed.png"/>
		</Publisher>
		<Strategy class="Random"/>
		<Logger class="Filesystem">
			<Param name="Path" value="logs" />
		</Logger>
	</Test>
</Peach>
ファジングの実行
コンテナ内で以下のコマンドを実行します。
# fehをインストール
root@xxx# apt install feh
# fehに対してファジングを実行
root@xxx# peach png.xml
あとがき
本記事ではGitLab Protocol Fuzzer Community Editionの導入とチュートリアルの解説を行いました。
チュートリアルに関してはまだ理解が不足していますので、後々追記していきたいと思います。
参考文献
IoT診断とファジング - ラック・セキュリティごった煮ブログ
Peach Fuzzer
IPA ファジング実践資料
環境
Ubuntu 20.04

