はじめに
ブラックボックスファジングに興味があったので、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