AFLを用いた tcp client ファジングについて+AFL本宣伝

こんばんは。らいるです。

これまでAFLの使い方についても色々調査していましたが、ネットワークファジングについて向いていないと判断してました。
というのもAFLはバイナリに対するファジングとして開発されているためにネットワークプロトコルに関するファジング機能は
有していない為です。

しかしながらAFL公式サイトhttp://lcamtuf.coredump.cx/afl/にある通りネットワーク機能を有するソフトウェアも
脆弱性検出の実績が多いです。であればAFLを用いたネットワークファジングに関して調査したくなるのも必然ですね。

今回はAFLを用いたネットワークファジングに関して調べたのでまとめます。(誤りがあった場合後日修正いたします。)

■手法

調べたところ、方法としては3種類ほどあります。
・プログラムのコードを修正し、ネットワーク経由で送信される入力を標準入力から受け付けるようにする。
https://github.com/zardus/preenyを使用し、ネットワーク経由の入力を標準入力から受け付けるようにする。
・ネットワークファジングの拡張機能を有するAFLhttps://github.com/jdbirdwell/aflを使用する

今回は3点目のネットワークファジングの拡張機能を有するAFLについて調べましたので使い方を記載します。

■jdbirdwell afl
正式な名称がないのでgithubのプロダクト名から「jdbirdwell afl」と呼称します。
https://github.com/jdbirdwell/afl

このツールではAFLをサーバやクライアントとして動作させ、サーバソフトウェアやクライアントソフトウェアを
ファジングすることができます。

基本的な使い方はAFLと同様です。異なる点としてはオプションが追加されています。
ソフトウェアのREADMEには以下のように説明されています。(一部抜粋)

                                                                      • -

Both client and server (daemon) programs that communicate using an
IP network (IPv4 or IPv6) can be fuzzed using the command line

$ ./afl-fuzz -i testcase_dir -o findings_dir [-D delay_before_write] \
[-t timeout_delay] [-L] -N network_specification /path/to/program \
[...params...]

where the network_specification has a form similar to a URL:

[tcp|udp]://hostspec:port

                                                                      • -

どうやらTCPだけでなくUDPでも動作するようですが、まずは参考情報として確認できていたwgetコマンド
のクライアント機能に関して動作することを確認しました。ページ下部にリンクを掲載しています。
確認した環境は Ubuntu16.04 ですが、Ubuntu14.04 や Kali Linux 等でも大丈夫だと思います。

今回の環境では事前に下記コマンドでアップデート済みです。

$ sudo apt-get update
$ sudo apt-get upgrade

当該プログラムをwgetやgit等でダウンロードします。

$ wget https://github.com/jdbirdwell/afl/archive/master.zip

プログラムを解凍、インストールします。
$ unzip master.zip
$ cd afl-master
$ make
$ sudo make install

※この辺はAFLと相違ないですね。

検査対象を取得します。今回はUbuntu 16.04の環境ですぐ動作させられるものを取得します。
$ mkdir 1
$ cd 1
$ wget https://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.gz

AFLで動作できるように準備します。

$ tar zxvf wget-1.17.1.tar.gz
$ cd wget-1.17.1
$ sudo apt-get install gnutls-dev
$ CC=afl-gcc ./configure
$ make
$ sudo make install

以上で実行環境は構築完了です。afl-fuzzをサーバモードとして動作させ、afl-gccコンパイルした wget 1.17.1をファジングします。

$ afl-fuzz -i testcases/others/text/ -o ./1 -t 30+ -D 7 -m none -L -Ntcp://localhost:8082 ./1/wget-1.17.1/src/wget -t 1 http://localhost:8082

これでAFLが動作すればOKです。正常に動作しない場合はソケットエラーなどが出たりする場合があります。
本ツールでは127.0.0.1localhost以外は指定できないよう制限されているそうです。localhostに関して/etc/hosts
を書き換えれば送信できる可能性はありますが未検証です。当該プログラムのチェック部分にパッチを当てれば
動作するとは思いますがあまりメリットはないかと考えます。

■参考文献
jdbirdwell/afl
https://github.com/jdbirdwell/afl

Network fuzzing with american fuzzy lop
https://blog.fuzzing-project.org/27-Network-fuzzing-with-american-fuzzy-lop.html

■告知

技術書典4にてAFL本を出します。よろしければお-13にお立ち寄りくださいませ。

■追記(2018/4/3)
実施手順にあったリンク不備およびapt-getの手順抜けを修正