
ユーザーランドのバイナリ、クライアント、サーバーを調べるためのマルチプラットフォームファザー。
トップ企業やオープンソースの50以上のアプリとライブラリでバグを発見しています。
Linux、Mac、Windowsでファジングを始めるためのシンプルなセットアップ。
Litefuzzは目的を果たすために作られています。主要なすべてのプラットフォームでファジングとトリアージを行い、CLI/GUIアプリ、ネットワーククライアント、サーバーをサポートし、セキュリティ関連のバグを発見します。
このプロセスを簡素化し、いくつかの正直なトレードオフを行うだけで、さまざまなターゲットでプラットフォームをまたいでセキュリティバグを簡単に発見できるようにします。
速度やスケーラビリティのために作られたものではなく、学術的な賞を狙うものでもありません。さまざまな角度からシンプルなテクニックを適用して結果を出します。コンソールベースのファイルファジングには、おそらくAFLを使うべきでしょう。AFLは優れたパフォーマンス、インストルメンテーション機能(そしてより高速な非インストルメント実行)、スケール、そして無から freakin' jpegを作り出すことができます。ネットワークファジングについては、mutiny fuzzerもPCAPを再生する場合にうまく動作し、frizzerも有望そうです。しかし、これを試してみたいのであれば、単一のツールでプラットフォームをまたいでそれらの種類のターゲットをファジングできます。
./ そしてターゲットに... 軽いファズをかけてください。``` $ sudo apt install -y latex2rtf
$ ./litefuzz.py -l -c "latex2rtf FUZZ" -i input/tex -o crashes/latex2rtf -n 1000 -z --========================-- --======| litefuzz |======-- --========================--
[STATS] run id: 3516 cmdline: latex2rtf FUZZ crash dir: crashes/latex2rtf input dir: input/tex inputs: 1 iterations: 1000 mutator: random(mutators)
@ 1000/1000 (3 crashes, 127 duplicates, ~0:00:00 remaining)
[RESULTS]
completed (1000) iterations with (3) unique crashes and 127 dups
check crashes/latex2rtf for more details
これはAFL++が完全に処理できる単純なローカルターゲットであり、単なる例として簡単に示したものです。Litefuzzは、ネットワークやGUIファジングにおいてはるかに多くのことを行うように設計されており、詳しく見ていくとそれがわかるでしょう。
## なぜ
そう、また別のファザーです。しかも現在のトレンドや慣習にあまり沿っていないものです。特定の要件に対応するためにトレードオフが行われました。その要件とは、複数のプラットフォームでデフォルトで動作し、ローカルターゲットとネットワークターゲットの両方をファズでき、非常に使いやすいファザーであることです。何かを誰かに納得させようとしているわけではありませんが、背景を説明しましょう。一部のターゲットでは、AFLのようなファザーをビルドチェーンに統合するのに多大な労力が必要です。このファザーは計装を必要としないため、そのような問題はありません。計装による正確なカバレッジを犠牲にして、使いやすさと移植性を優先しています。また、AFLはそのままでネットワークファジングをサポートしておらず、それをサポートするAFLベースのプロジェクトも存在しますが、それらは決して簡単に使えるものではなく、動作させるためにより多くのコード修正やハーネスが必要になることがほとんどです([Libfuzzer](https://llvm.org/docs/LibFuzzer.html)も同様の状況です)。
並列ファジングは行わず、[パーシステントモード](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)が提供するような驚異的な速度向上もサポートしていないため、そのような機能を持つファザーに近いスケーラビリティはありません。繰り返しますが、これは最先端のファザーではありません。しかし、ソースコードやビルドの適切なセットアップ、特定のOS機能を必要としません。ネットワーククライアントのGUIやインタラクティブアプリケーションをファズすることもできます。多くの点で「Live off the Land」的であり、ミューテーターやミニマイゼーションなどの多くの機能はゼロから書かれています。
「そのまま動く」ように設計されており、必要なわずかな依存関係のセットアップとインストールを自動化するために努力が払われています。このファザーは目的を果たすために書かれており、さまざまなターゲットシナリオや環境で価値を提供し、最も重要なのは、すべてのファザーが最終的に評価されるべき点、つまりバグを見つける能力です。そして**実際に** [バグ](https://github.com/sec-tools/beta/blob/main/README.md#trophies) を見つけています。ターゲットのソースコードがあることを前提としていないため、クローズドソースソフトウェアでもかなりうまくカバーできます。自動化の一部としてほとんど修正なしで実行できますが、脆弱性研究者にとって楽しく使えるように作られています。ただし、完成品というよりも研究開発プロジェクトと考えるほうが有用です。また、複雑なセットアップは不要で、そのままで少し壊れていたり、最新のOSで動作させるためにさらに作業が必要ということはありません。
Ubuntu Linux、Mac、Windowsで動作確認済みで、ファジング準備完了の環境をセットアップするためのほぼすべてを自動化する完全なスクリプトが付属しています。
**セットアップスクリプトが完了すれば、さまざまなターゲットのファジングを開始するのにほんの数分しかかかりません。**
## 仕組み
**Litefuzzは、ローカル、クライアント、サーバーの3つの異なるモードをサポートしています。**
ローカルモードは、ローカルバイナリをターゲットにすることを意味します。Linux/Macでは、サブプロセス経由で起動され、クラッシュ時にそれぞれGDBとLLDBによる自動トリアージがサポートされ、Windowsでは[WinAppDbg](https://github.com/MarioVilas/winappdbg)を介して行われます。クラッシュはローカルのクラッシュディレクトリに書き込まれ、読み取り/書き込みAVやSIGABRT/SIGSEGVなどの障害タイプとファイルハッシュでソートされます。ファジング中にすべてのユニークなクラッシュがトリアージされ、このデータはターゲットの出力(利用可能な場合)とともにキャプチャされ、同じディレクトリにアーティファクトとして配置されます。また、`--replay`とクラッシュファイルを指定してクラッシュを再現することも可能です。`local`クライアントモードでは、入力ディレクトリにサーバーのグリーティング、レスポンス、またはクライアントがサーバーに接続する際に期待するデータを含める必要があります。
現時点では、ネットワークファジングのために複雑なセッションサポートなしで1回の「ショット」のみ実装されています。クライアントはコマンドラインから起動され、ファイルファジングと同じ方法でデバッグされます。このシナリオをサポートするためにリスナーがセットアップされます。はい、遅くてほぼ手動に近いですが、動作します。クラッシュが検出されると、gdbで再現されてトリアージの詳細が取得されます。`remote`クライアントモードでは、ローカルデバッグ/クラッシュトリアージがないことを除いて同じように動作します。*local*サーバーモードでは、ローカルクライアントモードと似ており、`remote`サーバーモードでは、指定されたターゲットに接続し、ユーザーが入力として指定した変異したサンプルクライアントデータを送信しますが、「まだ接続できるか、できなければ最後のデータでクラッシュした可能性が高い」という単純なトリアージのみ提供されます。
いくつかのミューテーション関数がゼロから書かれており、主に`-i`フラグで指定された入力のランダムな選択に対してランダムなミューテーションを行います。ファイルファジングの場合は、ローカルモードを選択し、アプリが解析するファイル名を期待する場所にFUZZを指定したターゲットコマンドライン(例:`tcpdump -r FUZZ`)と、ミューテーションする「良質なファイル」の入力ディレクトリを渡すだけです。ネットワーククライアントファジングの場合は、ローカルファジングと似ていますが、`-a`で接続詳細も指定します。サーバーをファズしたい場合は、サーバーモードにして、クライアントと同様に`protocol://address:port`を指定します。
ほとんどのCLIアプリケーションのように、ターゲットがデータを消費して終了する速度、またはローカル実行やネットワーク接続のタイムアウト前に必要と判断した時間だけ高速にファズします。これにより、かなり遅くなる可能性があります。派手なexecやカーネルトリックはありません。もちろん、入力を解析してすぐに終了するようなハーネスを書けば、ターゲットの特定の部分をカバーするのに役立ちます。しかし、その場合、ターゲットにそこまで近づけるのであれば、他のファザーが提供する[パーシステントモード](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)や類似の機能を使ったほうがよいでしょう。
つまり...
### できること
- linux、windows、macで動作し、py2/py3をサポート
- ファイル/標準入力から読み取るCLI/GUIバイナリをファズ
- ネットワーククライアントとサーバー(オープンソースまたはプロプライエタリ)をファズし、ローカルまたはリモートでデバッグ可能
- クラッシュの差分、ミニマイゼーション、リプレイ、ソート、自動トリアージ
- TLSサポート、golangバイナリファジング、Mac用の追加機能などのその他
- さまざまな内蔵ミューテーターとpyradamsa(Linux)で入力を変異
### できないこと
- ネイティブ計装
- 並行ジョブでのスケーリング
- 複雑なセッションファジング
- リモートクライアントとサーバーの監視(接続などの基本的なチェックのみ)
## サポート
主に**Ubuntu Linux 20.04**(22.04と21.04は軽くテスト)、**Windows 10**、**Mac OS 11**(12は軽くテスト)でテストされています。ファザーとセットアップスクリプトは、これらのOSの少し古いバージョンや新しいバージョンでも動作する可能性がありますが、研究、テスト、開発の大部分はこれらの環境で行われました。Python3がサポートされており、[WinAppDbg](https://github.com/MarioVilas/winappdbg)を介してWindows上でファジングするために必要なPython2との互換性も確保するよう努められています。
プラットフォームのテストは主にIntelベースのハードウェアで行われましたが、AppleのM1プラットフォームでもほぼ動作するようです(顕著な例外として、LinuxではGDBのexploitableプラグインがサポートされていないと思われ、Pyradamsaも同様です)。また、setup/にはほとんどのタスクと依存関係のインストールを自動化するセットアップスクリプトがあります。一般的に各プラットフォームのネイティブバイナリ(多くの場合C/C++でコンパイル)をファズできますが、Golangバイナリのクラッシュもキャッチできます(実験的)。
### Pythonバージョン
Python3はLinuxとMacでサポートされ、WindowsではPython2が必要です。
なぜLinuxとMacでPy3なのか? Pyautogui、Pyradamsa(Linuxのみ)、Macでのソケットサポートの向上。
なぜWindowsでPy2なのか? WinappdbgがPy2を必要とするため。
### Linux
デバッグにはGDB、クラッシュトリアージには[exploitable](https://github.com/jfoote/exploitable)を使用します。OSSの場合は、[サニタイザ](https://fuzzing-project.org/tutorial2.html)などを使ってターゲットをビルドおよび計装できます。そうでない場合は、実行時にロードできる[メモリデバッガ](https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Heap_corruption)もあります。
このインストールは、Pythonの依存関係やその他の便利なものとともに、[setup/linux.sh](https://github.com/sec-tools/litefuzz/blob/HEAD/setup/linux.sh)で自動化されています。推奨OSはUbuntu 20.04です。これは、ほとんどのテストが行われた環境だからです。
### Mac
gdbの代わりに、OS Xではlldbを使用します。これはXCodeコマンドラインツールに含まれています。管理者またはdeveloperグループに属していればlldbを使用できるはずですが、この動作は環境やバージョンによって異なる可能性があり、どうしてもうまくいかない場合はsudo権限で実行する必要があるかもしれません。
手動で行う必要があるのは、SIPを無効にすることだけです(リカバリモードでcmd+R、またはVMware Fusionのハックを使用)。そうしないと、Tim AppleのOSでファジングするときに自動トリアージが失敗します。
セットアップのほぼすべては[setup/mac.sh](https://github.com/sec-tools/litefuzz/blob/HEAD/setup/mac.sh)スクリプトで自動化されているので、それを使ってすぐに開始できます。
### Windows
[WinAppDbg](https://github.com/MarioVilas/winappdbg)はWindowsでのデバッグに使用されますが、標準入力ファジングがサポートされていないという小さな注意点があります。
他のOSの自動セットアップと同様に、ChocolateyがWindowsでのパッケージインストールを自動化するのに役立ちます。litefuzzのルートディレクトリで[setup/windows.bat](https://github.com/sec-tools/litefuzz/blob/HEAD/setup/windows.bat)を管理者として実行して、インストールを自動化してください。デバッグツールやその他の依存関係がインストールされ、スムーズに動作するようになります。
### ターゲット
以下は、テストされ、一般的にサポートされているターゲットのタイプのリストです。
* ファイル形式や標準入力を解析するローカルCLI/GUIアプリ
- デバッグサポート
* サーバーレスポンスを解析するローカルCLI/GUIネットワーククライアント
- CLIのデバッグサポート
- GUIの限定的なデバッグサポート
* クライアントリクエストを解析するローカルCLIネットワークサーバー
- デバッグサポート(注意:スタンドアロン実行可能ファイルとして実行できる必要があります。そうでない場合は*リモート*として扱うことができます)
* クライアントリクエストを解析するローカルGUIネットワークサーバー
- 理論的にはサポート、未テスト
* サーバーレスポンスを解析するリモートCLI/GUIネットワーククライアント
- デバッグサポートなし
* クライアントリクエストを解析するリモートCLI/GUIネットワークサーバー
- デバッグサポートなし
- ただしMacでは`attach`または`reportcrash`機能を使用する場合例外
繰り返しますが、このファザーはLinux、Mac、Windows上のローカルアプリ、クライアント、サーバーで動作・サポートし、もちろんターゲットプラットフォームに依存せずにリモートのものをファズすることもできます。
### トリアージ
* ファイル形式や標準入力を解析するローカルCLI/GUIアプリ
- アプリを実行し、シグナルをキャッチ、クラッシュ入力を使用してデバッガ内で再実行し再現
* サーバーレスポンスを解析するローカルCLI/GUIネットワーククライアント
- アプリを実行し、シグナルをキャッチ、クラッシュ入力を使用してデバッガ内で再実行し再現
* クライアントリクエストを解析するローカルGUI/CLIネットワークサーバー
- デバッガ内でアプリを実行し、シグナルをキャッチ、クラッシュ入力を使用してデバッガ内で再実行し再現
* サーバーレスポンスを解析するリモートCLI/GUIネットワーククライアント
- 可視性なし、リモート側からクラッシュを収集
- トリアージを支援するスクリプトを手動で作成可能
* クライアントリクエストを解析するリモートCLI/GUIネットワークサーバー
- 可視性なし、リモート側からクラッシュを収集
- トリアージを支援するスクリプトを手動で作成可能
- Macの例外として、`attach`および`reportcrash`オプションを使用してトリアージ機能の一部を有効にできる
## はじめに
プラットフォーム間のセットアップのほとんどは、[setup](https://github.com/sec-tools/litefuzz/blob/main/README.md#setup)ディレクトリのスクリプトで自動化されています。
litefuzzルートからそれらを実行するだけで、多くの時間を節約でき、自動化されたデプロイに必要なものの一部を有効にするのに役立ちます。クリーンなOSとファジング環境をセットアップするためにVMを使用すると便利です。特にスナップショット機能が役立ちます。
詳細は[INSTALL.md](https://github.com/sec-tools/litefuzz/blob/main/INSTALL.md)を参照してください。
**インストール後、最初のセクションにあるlatex2rtfのファジング例を参照して素早く試すか、このREADMEで詳しく説明されているすべてのコマンドラインオプションとその他の例を参照してください。**
### Docker
Dockerを使用して、`Dockerfile`を使ってローカルに依存関係をインストールせずにlitefuzzを実行できます。これは、簡単なテストやシステムに依存関係をインストールしたくない場合に特に便利です。
Dockerfileは次の両方で動作します:
- **リポジトリ内から** - ローカルファイルを使用(高速、ローカルの変更を含む)
- **スタンドアロン** - 任意のディレクトリからビルド可能(GitHubからクローン)```bash
# Build the Docker image (from any directory with Dockerfile)
docker build -t litefuzz:latest .
# Run litefuzz
docker run --rm litefuzz:latest python3 litefuzz.py --help
リポジトリの組み込み入力は /litefuzz/input/tex で利用可能です - 入力をマウントする必要はありません:```bash
mkdir -p crashes
docker run --rm
-v $(pwd)/crashes:/tmp/crashes
litefuzz:latest
python3 litefuzz.py -l -c "latex2rtf FUZZ" -i /litefuzz/input/tex -o /tmp/crashes -n 1000 -z
これは次のことを行います:
- latex2rtfを1000回のイテレーションでファズする
- ヒープデバッグを使用する(`-z`フラグ)
- クラッシュをホスト上の`./crashes`ディレクトリに保存する
- リポジトリの`/litefuzz/input/tex`にある組み込みの入力ファイルを使用する
ホストから独自の入力ファイルを使用したい場合:```bash
# Create input directory with your test files
mkdir -p input/tex crashes
# Add your test files to input/tex/
cp your-test.tex input/tex/
# Run fuzzing with your input files
docker run --rm \
-v $(pwd)/input:/litefuzz/input \
-v $(pwd)/crashes:/tmp/crashes \
litefuzz:latest \
python3 litefuzz.py -l -c "latex2rtf FUZZ" -i /litefuzz/input/tex -o /tmp/crashes -n 1000 -z
重要: 使用するファイルがある場合のみ input をマウントしてください。空の input/ ディレクトリをマウントすると、組み込みの input が上書きされエラーが発生します。
/litefuzz/input/tex にあります(マウント不要)-v でボリュームをマウントして、クラッシュ出力を永続化し、入力ファイルにアクセスします--network host を使用してネットワークファジングを行い、localhost サービスにアクセスします--cap-add=SYS_PTRACE が必要になる場合がありますLitefuzz のカバレッジを確保するための簡単な単体テストと機能テストがいくつかありますが、完全を意図したものではありません。``` py2> pytest py3> python3 -m pytest
これにより、メインディレクトリ内で `test_litefuzz.py` のpytestが実行され、テスト実行終了時にPASS/FAIL結果が表示されます。
#### crashing app tests
異なるプラットフォームでのクラッシュおよびトリアージ機能をテストするための、バグのあるアプリの例が `test` フォルダにいくつかあります。
- (a) null pointer dereference (ヌルポインタ参照)
- (b) divide-by-zero (ゼロ除算)
- (c) heap overflow (ヒープオーバーフロー)
- (d-gui) format string bug in a GUI (GUIのフォーマット文字列バグ)
- (e) buffer overflow in client (クライアントのバッファオーバーフロー)
- (f) buffer overflow in server (サーバのバッファオーバーフロー)
これらはセットアップ中に自動的にビルドされ、コマンドライン、デバッガ内で実行したり、ファジングターゲットとしてテストに使用できます。
**Windowsのコマンドラインで実行する場合は、`イベントビューアー -> Windows ログ -> アプリケーション` でクラッシュを確認してください。**
## options
さまざまなターゲットシナリオを活用するための、多種多様なオプションと機能があります。以下に簡単な説明と、それらを使用する方法を理解するための例を示します。
### crash directory
`-o` を使用すると、デフォルトのローカルパスの crashes/ 以外のクラッシュディレクトリを指定できます。これを使用すると、異なるアプリに対する複数の同時ファジング実行のクラッシュフォルダを管理できます。
### insulate mode
`-u` は、通常のファジングプロセスからターゲットアプリケーションを隔離します(例:実行やパケットの反復送信とクラッシュのチェックを行わない)。代わりに、このモードはインタラクティブなクライアントアプリケーション(例:Postman)向けに作られており、アプリケーション内でスクリプトを実行してクライアントファジングの接続を繰り返すことができます。ターゲットはデバッガ内で実行され、ファザーは一時停止してユーザーがいくつかのボタンをクリックするか、ターゲットの設定を自動実行に変更する時間を確保します。ユーザーが再開すると、インタラクティブなネットワーククライアントのファジングが行われます。
`litefuzz -lk -c "/snap/postman/140/usr/share/Postman/_Postman" -i input/http_responses -a tcp://localhost:8080 -u -n 100000 -z`
Insulate mode + refresh はインタラクティブクライアントに使用できます。例えば、FileZillaをデバッガで実行し、新しいイテレーションごとにF5を押してサーバに再接続させることができます。また、ローカルCLI/GUIサーバのファジングは、デバッガ内で一度だけ起動・実行され、処理をより効率的にします。
`--key` を使用すると、インタラクティブターゲットのファジング中にキーを送信することもできます。例えば、F5で「接続の更新」を送信して、FileZillaのFTPサーバ応答の解析をファジングできます。
`litefuzz -lk -c "filezilla" -a tcp://localhost:2121 -i input/ftp/filezilla -u -pp --key "F5" -n 100 -z glibc`
注意:insulate mode は Linux でのみテストされており、Windows ではサポートされていません。
### timeout
`-x secs` を使用するとタイムアウトを指定できます。実際には、これはCLIターゲットの場合は「イテレーション間のおおよその時間」に近く、GUIの場合は実際のタイムアウトとして機能します。
### mutators
`--mutator N` はファジングに使用するミューテータを指定します。このオプションが指定されない場合、利用可能なミューテータのリストからランダムに選択され、各ファジングイテレーションで使用されます。
これらのミューテータは(もちろんRadamsaを除いて)スクラッチから書かれました。そして、何百万回ものイテレーションで広範囲にテストされ、良好に動作していますが、時折微妙なバグが存在する可能性があります。ただし、通常は機能に影響を与えることはありません。```
FLIP_MUTATOR = 1
HIGHLOW_MUTATOR = 2
INSERT_MUTATOR = 3
REMOVE_MUTATOR = 4
CARVE_MUTATOR = 5
OVERWRITE_MUTATOR = 6
RADAMSA_MUTATOR = 7
note: Radamsa ミューテーターはLinux (+ Py3)でのみ利用可能です。
--reportcrash はMac固有のオプションです。デフォルトのトリアージシステムを使用する代わりに、ファザーにReportCrashディレクトリを監視させ、対象プロセスのクラッシュログを取得するよう指示します。ReportCrashはOS Xで有効化されている必要があります(デフォルトでは有効ですが、通常のファジングでは無効化されていることが多い)。この機能は、デバッガで対象を実行して独自のクラッシュログを生成・トリアージできない場合に、オペレーティングシステムのこのコア機能を利用して可視性を得るのに役立ちます。
注: この機能は実験的なものと見なしてください。なぜなら、MacOSシステムのコア内で直接制御できないいくつかの可動部品やコンポーネントに依存しているためです。ReportCrashは、アンロードと再読み込みを試みた後でも、しばらくファジングを行うと正常に動作し応答しなくなる可能性があります。その場合は、マシンを再起動するか、スナップショットをリセットして正常な状態に戻すことを試みてください。``` sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist sudo launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
### 一時停止
Ctrl+c を押してファジングプロセスを一時停止します。再開する場合は `y` を、停止する場合は `n` を選択します。この機能はプラットフォーム間で正常に動作しますが、GUI アプリケーションのファジングでは信頼性が低くなる可能性があります。
### クラッシュの再利用による亜種発見
`-e` は再利用モードを有効にします。つまり、ファジング実行中にクラッシュが見つかった場合、それらを入力として使用して 2 回目のファジングラウンドを実行し、さらに多くのバグを発見するのに役立ちます。`-z` と組み合わせて `-ez` バグを! ダダン。
次の例は、antiword を 100000 回の反復でファジングし、その後、同じ反復回数とオプションでもう一度実行を開始して、クラッシュを入力として再利用し、さらに多くのバグを見つけようとします。
`litefuzz -l -c "antiword FUZZ" -i docs -n 100000 -ez`
(または、クラッシュを手動で入力ディレクトリにコピーして、再利用実行の反復回数を直接制御することもできます)
`litefuzz -l -c "antiword FUZZ" -i docs-crashes -n 500000 -z`
注: このモードはローカルアプリケーションでのみサポートされています。
### メモリデバッグヘルパー
`-z` は、Linux では Electric Fence(フォールバックとして glib malloc デバッグ)、Mac では Guard Malloc、Windows では PageHeap を有効にします。また、`-zz` を使用すると、アプリケーションに対して PageHeap を有効にした後、無効にすることができます。ファジッカーを起動せずにオン/オフを切り替えたい場合は、`-i` フラグを省略するだけです。Windows のセットアップ中には、[gsudo](https://github.com/gerardog/gsudo) がインストールされ、コマンドラインで昇格したコマンドを実行するために使用できます。例:ターゲットに対して PageHeap を有効にするなど。
`sudo litefuzz -l -c "notepad FUZZ" -i texts/files -z`
`sudo litefuzz -l -c "notepad FUZZ" -zz`
Linux では、特定のヘルパーを選択できます。たとえば、フォールバックとして glib malloc を使用する代わりに、それを選択することもできます。
`litefuzz -l -c "geany FUZZ" -i texts/codes -z glibc`
デフォルトの Electric Fence malloc デバッガは優れていますが、すべてのターゲットで動作するわけではありません。ターゲットを EF でテストし、クラッシュする場合は代わりに glibc ヘルパーを選択してください。
### ライブターゲット出力の確認
Linux または Mac でローカルアプリをファジングする場合、`cat /tmp/litefuzz/RUN_ID/fuzz.out` でターゲットの最新の標準出力を確認できます。`RUN_ID` はファジング開始時に STATS 情報領域に表示されます。クラッシュが発生した場合、標準出力はクラッシュディレクトリに `.out` ファイルとしてキャプチャされます。グローバルな標準出力/標準エラー出力も `/tmp/litefuzz/out` に保存され、デバッグ目的で使用されます(インシュレートモードまたはローカルサーバーモードを除く。これらのモードではデバッガ出力は `/tmp/litefuzz/RUN_ID/out` に送られます)。
Winappdbg はターゲットの標準出力のキャプチャをネイティブでサポートしていないため(AFAIK)、この成果物は Windows では利用できません。
### クライアントモードとサーバーモード
サーバーをローカルで実行し、単にバイナリを実行するだけで(フラグや設定の有無を問わず)起動できる場合、そのコマンドラインを `-c` で渡すと、各反復ごとに新しい実行でサーバーが起動、ファジング、強制終了されます。この考え方は、速度を犠牲にする代わりに、ターゲットのメモリが「特定の状態」にある場合にのみトリガーされる厄介なバグを回避できるというものです。これにより誤検出が減少します。ネットワーククライアントをローカルでファジングする場合も同様です。TLS 接続もサポートしており、その場で証明書を生成します(サーバーをファジングする際にクライアント証明書が必要で、その証明書自体のファジングも別のアイデアです)。
Litefuzz はリモートクライアントおよびサーバーをファジングする際のデバッグサポートを提供しないため、そのリモート側での設定はユーザーに任されます。サーバーの場合、サーバーが応答を停止したかどうかを確認し、最後のペイロードをクラッシュ原因として記録します。これは TCP 接続ではうまく機能しますが、UDP サービスではこの余裕はありません。そのため、リモートサーバーの監視は、ReportCrash 機能(Mac で利用可)、デバッガ内でのターゲット実行(ローカルサーバーモードまたは手動)、またはカスタムサポートスクリプトの作成に任されています。また、一部のサーバーはクラッシュ後に自動再起動または回復する場合がありますが、ログやファイルシステム上の他の成果物にその兆候が見られることがあり、特定のターゲット用に作成されたサポートスクリプトで解析できます。
### ローカルネットワークの例
`litefuzz -lk -c "wget http://localhost:8080" -a tcp://localhost:8080 -i input/http -z`
`litefuzz -lk -c "curl -k https://localhost:8080" -a tcp://localhost:8080 -i input/http -z`
`litefuzz -lk -c "curl -k https://localhost:8080" -a tcp://localhost:8080 -i input/http -o crashes/curl --tls -n 100000 -z`
(Wireshark を開き、ダンプから応答をキャプチャし、Simple Network Management Protocol を右クリック -> Export Packet Bytes -> resp.bin)
`litefuzz -lk -c "snmpwalk -v 2c -c public localhost:1616 1.3.6.1.2.1.1.1" -a udp://localhost:1616 -i input/snmp/resp.bin -n 1 -d -x 3`
`litefuzz -ls -c "./sc_serv shoutcast.conf" -a localhost:8000 -i input/shouts -z`
`litefuzz -ls -c "snmpd" -i input/snmp -a udp://localhost:161 -z`
**クイックノート**
- UDP ソケットは Mac + Py2 では少し動作がおかしい場合があるため、Mac + Py3 のみテストおよびサポートされています。
- Windows でのローカルネットワーククライアントファジングは不安定な場合があり、現時点では実験的と見なすべきです。
### リモートネットワークの例
リモートクライアントとサーバーのファジングはもう少し難しいです。ローカルデバッグはなく、ネットワークを介した両者間のやり取りの停止を捉えてクラッシュを検出します。また、相手側で何が起こっているかはおそらく見えないため、クライアントまたはサーバーが応答を停止するとファジングは終了し、ユーザーがリモート側でスクリプトを設定してこのプロセスを管理しない限り、クライアントまたはサーバーが通常の(クラッシュしていない)状態に復元された後に手動で再起動する必要があります。
UDP はこれをさらに複雑にします。UDP ポートにリッスンサービスがあるかどうかをテストパケットを送信しても、応答が保証されるわけではありません。そのため、リモートでネットワーククライアントとサーバーをファジングすることは可能ですが、可視性にはトレードオフがあります。
#### クライアント
`while :; do echo "user test\rpass test\rls\rbye\r" | ftp localhost 2121; sleep 1; done`
`litefuzz -k -i input/ftp/test -a tcp://localhost:2121 -pp -n 100`
クライアントモードはここではさらに扱いにくいです。なぜなら、クライアントが実際にクラッシュして再接続していないのか、それとも send/recv のやり取りが単にずれているのかを判断するのが難しいからです。クライアントはそれぞれ異なる方法で接続を処理できるためです。また、これは単なる例であり、リモートクライアントファジングは性質上厄介で、ある程度実験的と見なすべきであることに注意してください。
#### サーバー
サーバーをローカルでファジングするかリモートでファジングするかのメリットとデメリットは、両方のオプションが利用可能な場合にターゲットにどのようにアプローチするかの決定に役立ちます。
基本的に、デバッガ内でサーバーをファジングする方が遅くなりますが、自動トリアージでクラッシュログを取得できます。一方、サーバーをリモートモードでファジングする(ローカルホストを指定しても)と平均してはるかに高速になりますが、高い可視性やデバッガベースのトリアージ機能は失われますが、クラッシュごとに手動でサーバーを再起動して終了する前に続行する時間が得られます(TCP サーバーのみ。この機能は UDP ベースのサーバーをサポートしません)。
**Shoutcast**
`./sc_serv ...`
`litefuzz -s -a localhost:8000 -i input/shouts -n 10000`
**SSHesame**
`sshesame`
`litefuzz -s -a tcp://target:2022 -i input/ssh-server -p -n 1000000 -x 0.05`
**FTP**
`litefuzz -s -a tcp://target:21 -i input/ftp/req.txt -pp -n 1000`
**DNS**
`coredns -dns.port 10000`
`litefuzz -ls -c "coredns -dns.port 10000" -a udp://localhost:10000 -i dns-req/1.bin -o crashes/coredns -n 10000`
または
`litefuzz -s -a udp://localhost:10000 -i dns-req/1.bin -o crashes/coredns -n 10000`
##### TLS
`litefuzz -s -a tcp://hostname:8080 -i input/http --tls -n 10000````
...
@ 48/10000 (1 crashes, 0 duplicates, ~7:13:18 remaining)
[!] check target, sleeping for 60 seconds before attempting to continue fuzzing...
注記:デフォルトのリモートサーバーモードでは、ファジングイテレーション間に遅延が発生するため、ファジングセッションは確実に実行されますが、非常に低速です。これは安全なデフォルトですが、ターゲットがパケットを非常に高速に解析できる場合は、-xを使用してセッション間のタイムアウトを非常に短く設定できます(上記のように)。非公式に「2fast2furious」モードと呼ばれています。
セッションベースのプロトコル(FTPやSSHなど)の詳細については、Multipleモードを参照してください。
-pは複数のバイナリデータモードであり、連続した入力を提供できます。たとえば、input/sshディレクトリ内に「1」「2」「3」などの名前のファイルを置き、セッション内の各パケットをファジングします。これは、SSHクライアントなどのバイナリベースのプロトコル実装のファジングを可能にするためのものです。
ls input/ssh
1 2 3 4
`xxd input/ssh/2 | head```` 00000000: 0000 041c 0a14 56ff 1297 dcf4 672d d5c9 ......V.....g-.. 00000010: d0ab a781 dfcb 0000 00e6 6375 7276 6532 ..........curve2 00000020: 3535 3139 2d73 6861 3235 362c 6375 7276 5519-sha256,curv 00000030: 6532 3535 3139 2d73 6861 3235 3640 6c69 e25519-sha256@li 00000040: 6273 7368 2e6f 7267 2c65 6364 682d 7368 bssh.org,ecdh-sh 00000050: 6132 2d6e 6973 7470 3235 362c 6563 6468 a2-nistp256,ecdh 00000060: 2d73 6861 322d 6e69 7374 7033 3834 2c65 -sha2-nistp384,e 00000070: 6364 682d 7368 6132 2d6e 6973 7470 3532 cdh-sha2-nistp52 00000080: 312c 6469 6666 6965 2d68 656c 6c6d 616e 1,diffie-hellman 00000090: 2d67 726f 7570 2d65 7863 6861 6e67 652d -group-exchange-
各パケットは配列に取り込まれ、ランダムなインデックスが変異され、ターゲットをファズするために再生されます。
`litefuzz -lk -c "ssh -T test@localhost -p 2222" -a tcp://localhost:2222 -i input/ssh -o crashes/ssh -p -n 250000 -z glibc`
そして、最新のイテレーションにおけるターゲットの出力を確認できます。```
cat /tmp/litefuzz/out
kex_input_kexinit: discard proposal: string is too large
ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: string is too large
... and others like
ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: unknown or unsupported key type
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Host key verification failed.
Bad packet length 1869636974.
ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: message authentication code incorrect
-pp は、入力に改行があるかどうかをチェックし、検出された場合、それらを複数のリクエスト/レスポンスとして扱うようファザーに指示します。これは、主に文字列ベースのプロトコル実装(例:FTPクライアント)のためのシンプルなネットワークプロトコルファジングに有用です。```
cat input/ftp/test
220 ProFTPD Server (Debian) [::ffff:localhost]
331 Password required for user
230 User user logged in
215 UNIX Type: L8
221 Goodbye
ファザーは各行を独自のFTP応答に分割し、クライアントのセッション処理をファズします。ただし、クライアントが「適切に動作」したり、セッションが正常に完了するような振る舞いをする保証はないため、Wiresharkを実行しながらセッションテストケースを試行錯誤し微調整することで、ターゲット間の相互作用の違いを理解するのに役立ちます。
`litefuzz -lk -c "ftp localhost 2121" -a tcp://localhost:2121 -i input/ftp -o crashes/ftp -n 100000 -pp -z`
これは、FileZillaのようなGUIネットワークターゲットを隔離するために *-u* と組み合わせることもできます。
`litefuzz -lk -c "filezilla" -a tcp://localhost:2121 -i input/ftp.resp -n 100000 -u -pp -z glibc`
### プロセスへのアタッチ
ターゲットが接続時に新しいプロセスを生成する場合、サーバーへの接続が確立された後にアタッチするプロセス名(またはPID)を指定できます。これは、例えばlaunchdがポートで待ち受け、クライアントが接続したときにのみ処理プロセスを起動する場合に便利です。これは、ローカルファジングとリモートファジングの境界を曖昧にする機能の一つで、技術的にはファザーはリモートモードですが、ターゲットアドレスをlocalhostとして指定し、プロセスにアタッチするよう要求します。
`./litefuzz.py -s -a tcp://localhost:8080 -i input/shareserv -p --attach ShareServ -x 1 -n 100000`
注:現在この機能はMac(LLDB)とネットワークファジングでのみサポートされていますが、実装されればLinux(GDB)でも問題なく動作するはずです。
### クラッシュアーティファクト
ファジング中にクラッシュが発生すると、デバッガでリプレイされ、デバッグアーティファクトとバケット情報が生成されます。情報はプラットフォームによって異なりますが、一般的にはバックトレース、レジスタ情報、`!exploitable` タイプの情報(利用可能な場合)、その他の基本情報を含むテキストファイルが生成されます。
**メモリダンプ**は、Windowsでは `--memdump` を渡すことで有効に、`--nomemdump` で無効にできます。これは、mallocデバッガがそれぞれ `-z` と `-zz` で制御されるのと同様です。有効にすると、ダンプはコンソールデバッガ (cdbg) にも読み込まれ、`!analyze -v` クラッシュ分析出力が追加のメモリダンプクラッシュ分析ログにキャプチャされます。Winappdbgには既に初期クラッシュ分析で得られる !exploitable タイプの分析があるため、ここでは !analyze のみを行います。
`litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" --memdump`
または、アプリケーションのメモリダンプを無効にするには
`litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" --nomemdump`
自動クラッシュトリアージに加えて、バイナリ/文字列の差分(適切に)とターゲットのstdout(プラットフォーム/ターゲット依存)も生成され、もちろん再現ファイルも生成されます。
ローカルファジングでは、アーティファクトには通常、差分、stdout(Linux/Macのみ)、再現ファイル、クラッシュログおよび情報ファイルが含まれます。```
$ ls crashes/latex
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.diff
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.diffs
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.out
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.tex
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.txt
Windowsでは、メモリダンプが有効になっている場合、ダンプファイルが生成され、追加のトリアージ情報が追加のクラッシュ分析ログに書き込まれます。``` C:\litefuzz\crashes> dir app.exe.14299_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.dmp app.exe.14299_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.log ....
リモートファジングの場合、選択されたオプションによって成果物は異なりますが、多くの場合、差分、再現ファイルや再現ファイルディレクトリ(入力が複数のパケットを含むセッションの場合)、以前のファジング反復の再現(リモートファジングには課題があるため、実際にクラッシャーである場合にバグを失うことを防ぐ)、クラッシュログや簡単な情報ファイルが含まれます。```
ls crashes/serverd
REMOTE_SERVER_testbox.1_NNNN_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY
REMOTE_SERVER_testbox.1_NNNN_PREV_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.diff
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.diffs
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.txt
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.zz
ls crashes/serverd/REMOTE_SERVER_localhost_NNNN_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY
REMOTE_SERVER_testbox.1_NNNN_1.zz REMOTE_SERVER_localhost_NNNN_2.zz
REMOTE_SERVER_testbox.1_NNNN_3.zz REMOTE_SERVER_localhost_NNNN_4.zz
どうやらGolangバイナリがクラッシュするとき、従来のSIGSEGVで実際にダウンしないことがあります(Linuxでテスト済み)。パニック情報にはSIGSEGVと表示されても、代わりにリターンコード2でクラッシュする可能性があります。なので、それでいくことにします :)
この仕組みやエッジケースについてのより良い説明があるはずですが、Linux上でGolangバイナリのクラッシュをキャッチするために --golang を使用できます。
litefuzz -l -c "evernote2md FUZZ" -i input/enex -o crashes/evernote2md --golang -n 100000
クラッシュファイルはcrashes/ディレクトリ(または -o フラグで指定された場所)に、差分やクラッシュ情報とともに保存されます。
-r オプションと、適切なターゲットのコマンドライン/アドレス設定を伴った再現ファイル(またはディレクトリ)を渡すことで、ローカルまたはリモートでクラッシュを再現しようとします。
local example
litefuzz -l -c "latex2rtf FUZZ" -r crashes/latex2rtf/test.tex -z
local network example
./litefuzz -ls -c "./sc_serv shoutcast.conf" -a tcp://localhost:8000 -r crashes/crash.raw
remote network example
litefuzz -s -a tcp://host:8000 -r crashes/crash.raw
remote network example (multiple packets)
litefuzz -s -a tcp://localhost:22 -r repro/dir/here
一部のターゲットはコマンドラインの一部として静的な出力ファイルの場所を要求し、そのファイルが既に存在するとエラーを出すことがあります。ファジング中にこれを回避するためのオプションとして --rmfile があり、各ファジング反復の後に、ターゲットの動作の一部として生成されたファイルを削除します。
litefuzz -l -c "hdiutil makehybrid -o /tmp/test.iso -joliet -iso FUZZ" -i input/dmg --rmfile /tmp/test.iso -n 500000 -ez
クラッシュファイルの最小化は興味深い活動です。再現ファイルと最小化されたバージョンを比較することで、ターゲットがデータをどのように解析しているかを推測することもできます。
-m オプションと、ターゲットのコマンドラインまたはアドレス設定を伴った再現ファイルを渡すと、ターゲットをクラッシュさせるがより小さく、不要なバイトを含まない最小化バージョンの再現ファイルを生成しようとします。この最小化の過程で、新たなクラッシュを発見することもあります。
ローカルモードのみサポートされていますが、これにはローカルクライアントモードとサーバーモードが含まれているため、ローカルでデバッグできる限りネットワーククラッシュも最小化できます。
例えば、このリクエストが元の再現ファイルです。``` GET /admin.cgi?pass=changeme&mode=debug&option=donotcrash HTTP/1.1 Host: localhost:8000 Connection: keep-alive Authorization: Basic YWRtaW46Y2hhbmdlbWU= Referer: http://localhost:8000/admin.cgi?mode=debug
最小化されたバージョンをご覧ください。```
GET /admin.cgi?mode=debug&option=a
Authorization:s YWRtaW46Y2hhbmdlbWU
Referer:admin.cgi
これで、ターゲットが何を探しているのか、さらにはクラッシュの根本原因についても推測できるようになります。
他には? おまけです:Authorizationの認証情報が正しければ、有効なパスワードを渡す必要はなく、その逆も同様です。最小化は線形でファイルの先頭から始まり最後まで進むため、この方法で認証する再現コードのみを生成しますが、実際には2つのオプションがあることがわかります!
-mm はスーパーミニモードを有効にします。これは遅いですが、不要なバイトがなくなるまで何度も最小化を試みます。
楽しみのために、再現コードを修正して supermin で実行し、最大限に最小化されたバージョンを得ることができます。```
GET /admin.cgi?pass=changeme&mode=debug&option=a
Referer:admin.cgi
**最小化の例**
`litefuzz -l -c "latex2rtf FUZZ" -m test.tex -z`
`litefuzz -ls -c "./sc_serv shoutcast.conf" -a "tcp://localhost:8000" -m repro.http`
**supermin の例**```
litefuzz -l -c "latex2rtf FUZZ" -mm crashes/latex2rtf/test.tex -z
...
[+] starting minimization
@ 582/582 (1 new crashes, 1145 -> 582 bytes, ~0:00:00 remaining)
[+] reduced crash @ pc=55555556c141 -> pc=55555557c57d to 582 bytes
[+] supermin activated, continuing...
@ 299/299 (1 new crashes, 582 -> 300 bytes, ~0:00:00 remaining)
[+] reduced crash @ pc=55555557c57d to 300 bytes
...
[+] reduced crash @ pc=555555562170 to 17 bytes
@ 17/17 (2 new crashes, 17 -> 17 bytes, ~0:00:00 remaining)
[+] achieved maximum minimization @ 17 bytes (test.min.tex)
[RESULTS]
completed (17) iterations with 2 new crashes found
--cmd を使用すると、各イテレーション後に実行するコマンドを指定できます。これにより、システムリソースを消費する可能性のある特定の操作をクリーンアップできます。
litefuzz -l -c "/System/Library/CoreServices/DiskImageMounter.app/Contents/MacOS/DiskImageMounter FUZZ" -i input/dmg --cmd "umount /Volumes/test.dir" --click -x 5 -n 100000 -ez
litefuzz -l -c "latex2rtf FUZZ" -i input/tex -o crashes/latex2rtf -x 1 -n 100 --========================-- --======| litefuzz |======-- --========================--
[STATS] run id: 3516 cmdline: latex2rtf FUZZ crash dir: crashes/latex2rtf input dir: input/tex inputs: 4 iterations: 100 mutator: random(mutators)
@ 100/100 (1 crashes, 4 duplicates, ~0:00:00 remaining)
[RESULTS]
completed (100) iterations with (1) unique crashes and 4 dups
check crashes/latex2rtf dir for more details
#### Ubuntu でのファイルハンドラの列挙```
$ cat /usr/share/applications/defaults.list
[Default Applications]
application/csv=libreoffice-calc.desktop
application/excel=libreoffice-calc.desktop
application/msexcel=libreoffice-calc.desktop
application/msword=libreoffice-writer.desktop
application/ogg=rhythmbox.desktop
application/oxps=org.gnome.Evince.desktop
application/postscript=org.gnome.Evince.desktop
....
fuzz the local tcpdump's pcap parsing (Linux)
litefuzz -l -c "tcpdump -r FUZZ" -i test-pcaps
fuzz Evice document reader (Linux GUI)
litefuzz -l -c "evince FUZZ" -i input/oxps -x 1 -n 10000
fuzz antiword (oldie but good test app :) (Linux)
litefuzz -l -c "antiword FUZZ" -i input/doc -ez
注: -z を渡して Electric Fence を有効にする(またはglibcの機能にフォールバック)ことで ヒープエラーチェック を行うことができます(おそらく推奨)。
swda はMacでファイルハンドラを列挙できます。``` $ ./swda getUTIs | grep -Ev "No application set" com.adobe.encapsulated-postscript /System/Applications/Preview.app com.adobe.flash.video /System/Applications/QuickTime Player.app com.adobe.pdf /System/Applications/Preview.app com.adobe.photoshop-image /System/Applications/Preview.app ....
**stdin経由のgpg復号をヒープエラーチェックでファズ** (Mac)
`litefuzz -l -c "gpg --decrypt" -i test-gpg -o crashes-gpg -z`
**Booksアプリのファズ** (Mac GUI)
`litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i test-epub -t "/Users/test/Library/Containers/com.apple.iBooksX/Data" -x 8 -n 100000 -z`
注: `-z`は[Guard Malloc](https://www.manpagez.com/man/3/libgmalloc/)のヒープエラーチェックを有効にし、微妙なヒープ破損バグを検出します。
**macの注意**
一部のGUIターゲットは、各イテレーションのタイムアウト後に強制終了できず、応答しなくなる場合があります。これを軽減するには、別のターミナルで以下のようなスクリプトを実行し、定期的にそれらを一括で強制終了することで手動の手間と監視を減らせます。そうしないと、ファジングプロセスに影響が出る可能性があります。```
#!/bin/bash
ps -Af | grep -ie "$1" | awk '{print $2}' | xargs kill -9
(入力コンテンツが提供されていません。翻訳対象のMarkdownテキストを貼り付けてください。)``` $ while :; do ./pkill.sh "Process Name /Users/test"; sleep 360; done
*/Users/test*(一時ファイルがローカルGUIアプリに渡されるパスの最初の部分の例です。実行中にFUZZがパスになります。)は、プロセスを強制終了するためにユニークな文字列が必要であり、プロセス名のみを使用すると、ファジングプロセスにもその名前が含まれるため停止してしまうからです。
**Windows上でのファイルハンドラの列挙**
[AssocQueryString](https://github.com/sec-tools/WindowsFileHandlerEnumeration/) スクリプトと *assoc* コマンドを使用すると、ファイル拡張子をデフォルトアプリケーションにマッピングできます。```
C:\> .\AssocQueryString.ps1
...
.hlp :: C:\Windows\winhlp32.exe
.hta :: C:\Windows\SysWOW64\mshta.exe
.htm :: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
.html :: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
.icc :: C:\Windows\system32\colorcpl.exe
.icm :: C:\Windows\system32\colorcpl.exe
.imesx :: C:\Windows\system32\IME\SHARED\imesearch.exe
.img :: C:\Windows\Explorer.exe
.inf :: C:\Windows\system32\NOTEPAD.EXE
.ini :: C:\Windows\system32\NOTEPAD.EXE
.iso :: C:\Windows\Explorer.exe
Windowsでのファジングを行う際、新しいファジング実行を開始する前に、PageHeapとメモリダンプを有効にすると、より良いファジング体験が得られます(ただし、対象がそれらを好まない場合は除きます)。
sudo litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" -z
sudo litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" --memdump
はい、これらのコマンドをWindows上で(g)sudoを使用して実行すると、コンソールから簡単に管理者権限に昇格し、機能を有効にするために必要なレジストリ変更を行うことができます。
これは、ターゲットのmallocデバッガを有効にするためのもう一つのニュアンスを示しています。LinuxとMacでは、この機能を有効にするために毎回渡す必要があるランタイム環境フラグを使用しています。Windowsでは、レジストリを変更するため、最初に渡した後は、再度-zまたは--memdumpをファジングコマンドラインに渡す必要はありません(無効化または再有効化する場合を除く)。
fuzz PuTTY (puttygen) (Windows)
litefuzz -l -c "C:\Program Files (x86)\WinSCP\PuTTY\puttygen.exe FUZZ" -i input\ppk -x 0.5 -n 100000 -z
fuzz Adobe Reader(昔ながらの方法) (Windows GUI)
litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe FUZZ" -i pdfs -x 3 -n 100000 -z
(WinAppDbgはpython 2のみをサポートしているため、Windowsではpy2を使用する必要があります)
注: 対象アプリに対して PageHeap を有効にするには、管理者プロンプトで -z を使用するか、セットアップ中にインストールされた gsudo win32 パッケージの sudo を使用して、PageHeap を有効にできることを忘れないでください。
litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe FUZZ" -z
litefuzz -lk -c "ssh -T test@localhost -p 2222" -a tcp://localhost:2222 -i input/ssh-cli -o crashes/ssh -p -n 250000 -z glibc --========================-- --======| litefuzz |======-- --========================--
[STATS] run id: 9404 cmdline: ssh -T test@localhost -p 2222 address: tcp://localhost:2222 crash dir: crashes/ssh input dir: input/ssh-cli inputs: 4 iterations: 250000 mutator: random(mutators)
@ 73/250000 (0 crashes, 0 duplicates, ~1 day, 0:21:01 remaining)^C
resume? (y/n)> n Terminated ...
cat /tmp/litefuzz/out padding error: need 57895 block 8 mod 7 ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: message authentication code incorrect
#### local client
**ローカルホスト上のSNMPクライアントをファズする(Linux)**
`litefuzz -lk -c "snmpwalk -v 2c -c public localhost:1616 1.3.6.1.2.1.1.1" -a udp://localhost:1616 -i input/snmp/resp.bin -n 1 -d -x 3`
#### remote client
**リモートFTPクライアントをファズする(Linux)**
`while :; do echo "user test\rpass test\rls\rbye\r" | ftp localhost 2121; sleep 1; done`
`litefuzz -k -i input/ftp/test -a tcp://localhost:2121 -n 100`
注:ターゲットによっては、クライアントファジングには特権ポート(1-1024)でのリッスンが必要になる場合があります。この場合、LinuxではPythonインタプリタに `setcap cap_net_bind_service=+ep` を設定するか、ファザー実行時にsudoを使用してください。Macではsudoを使用し、Windowsでは管理者としてファザーを実行して、Permission Deniedエラーを回避してください。
### server
#### クイックルック```
litefuzz -ls -c "./sc_serv shoutcast.conf" -a tcp://localhost:8000 -i input/shoutcast -o crashes/shoutcast -n 1000 -z
--========================--
--======| litefuzz |======--
--========================--
[STATS]
run id: 4001
cmdline: ./sc_serv shoutcast.conf
address: tcp://localhost:8000
crash dir: crashes/shoutcast
input dir: input/shoutcast
inputs: 3
iterations: 1000
mutator: random(mutators)
@ 1000/1000 (1 crashes, 7 duplicates, ~0:00:00 remaining)
[RESULTS]
> completed (1000) iterations with (1) unique crashes and 7 dups
>> check crashes/shoutcast for more details
ローカルのShoutcastサーバーをファズする
litefuzz -ls -c "./sc_serv shoutcast.conf" -a tcp://localhost:8000 -i input/shoutcast -o crashes/shoutcast -n 1000 -z
リモートのSMTPサーバーをファズする
litefuzz -s -a tcp://10.0.0.11:25 -i input/smtp-req -pp -n 10000
usage: litefuzz.py [-h] [-l] [-k] [-s] [-c CMDLINE] [-i INPUTS] [-n ITERATIONS] [-x MAXTIME] [--mutator MUTATOR] [-a ADDRESS] [-o CRASHDIR] [-t TEMPDIR] [-f FUZZFILE] [-m MINFILE] [-mm SUPERMIN] [-r REPROFILE] [-e] [-p] [-pp] [-u] [--nofuzz] [--key KEY] [--click] [--tls] [--golang] [--attach ATTACH] [--cmd CMD] [--rmfile RMFILE] [--reportcrash REPORTCRASH] [--memdump] [--nomemdump] [-z [MALLOC]] [-zz] [-d]
optional arguments: -h, --help show this help message and exit -l, --local target will be executed locally -k, --client target a network client -s, --server target a network server -c CMDLINE, --cmdline CMDLINE target command line -i INPUTS, --inputs INPUTS input directory or file -n ITERATIONS, --iterations ITERATIONS number of fuzzing iterations (default: 1) -x MAXTIME, --maxtime MAXTIME timeout for the run (default: 1) --mutator MUTATOR, --mutator MUTATOR timeout for the run (default: 0=random) -a ADDRESS, --address ADDRESS server address in the ip:port format -o CRASHDIR, --crashdir CRASHDIR specify the directory to output crashes (default: crashes) -t TEMPDIR, --tempdir TEMPDIR specify the directory to output runtime fuzzing artifacts (default: OS tmp + run dir) -f FUZZFILE, --fuzzfile FUZZFILE specify the path and filename to place the fuzzed file (default: OS tmp + run dir + fuzz_random.ext) -m MINFILE, --minfile MINFILE specify a crashing file to generate a minimized version of it (bonus: may also find variant bugs) -mm SUPERMIN, --supermin SUPERMIN loops minimize to grind on until no more bytes can be removed -r REPROFILE, --reprofile REPROFILE specify a crashing file or directory to replay on the target -e, --reuse enable second round fuzzing where any crashes found are reused as inputs -p, --multibin use multiple requests or responses as inputs for fuzzing simple binary network sessions -pp, --multistr use multiple requests or responses within input for fuzzing simple string-based network sessions -u, --insulate only execute the target once and inside a debugger (eg. interactive clients) --nofuzz, --nofuzz send input as-is without mutation (useful for debugging) --key KEY, --key KEY send a particular key every iteration for interactive targets (eg. F5 for refresh) --click, --click click the mouse (eg. position the cursor over target button to click beforehand) --tls, --tls enable TLS for network fuzzing --golang, --golang enable fuzzing of Golang binaries --attach ATTACH, --attach ATTACH attach to a local server process name (mac only) --cmd CMD, --cmd CMD execute this command after each fuzzing iteration (eg. umount /Volumes/test.dir) --rmfile RMFILE, --rmfile RMFILE remove this file after every fuzzing iteration (eg. target won't overwrite output file) --reportcrash REPORTCRASH, --reportcrash REPORTCRASH use ReportCrash to help catch crashes for a specified process name (mac only) --memdump, --memdump enable memory dumps (win32) --nomemdump, --nomemdump disable memory dumps (win32) -z [MALLOC], --malloc [MALLOC] enable malloc debug helpers (free bugs, but perf cost) -zz, --nomalloc disable malloc debug helpers (eg. pageheap) -d, --debug Turn on debug statements
# trophies
Litefuzz は以下のような様々なソフトウェアパッケージからクラッシュをファジングしてきました。
* antiword
* AppleScript (OS X)
* ArangoDB VelocyPack
* Avast authenticode-parser
* Avast RetDec
* BBC Audio Waveform
* ColorSync (OS X)
* Dynamsoft BarcodeReader
* eot2ttf
* evernote2md
* faad2
* Facebook's Origami Studio
* FontForge
* ForestDB
* Gifsicle
* GPUJPEG
* GPAC Multimedia Framework
* Google Draco
* Google Quipper
* GoPro GPR
* GtkRadiant
* IIPImage Server
* John The Ripper
* Kyoto Cabinet
* latex2rtf
* libMeshb
* libembroidery
* libsndfile
* Lion Vector Graphics (lvg)
* L-SMASH
* mp3-decoder
* MindNode
* minimp4
* MiniWeb Server
* MLpack
* Nvidia Data Center GPU Manager
* Numbers (OS X)
* OpenJPEG
* OpenOrienteering Mapper
* OSM Express
* Pages (OS X)
* PBRT-Parser
* Pixar USD
* Remote Apple Events (OS X)
* Samsung rlottie
* Samsung ThorVG
* Shoutcast Server
* Silo
* syslog (OS X)
* Tencent NCNN
* TinyXML2
* UEFITool
* Ulfius Web Framework
* zlib
# FAQ
## このプロジェクトはどのようにして生まれたのですか?
ファジングは楽しいです!また、ファジラーがバグを見つけるという最終目標を達成するために、常に現代的なアプローチや人気のある方法に従う必要はないという逆張りの視点を取るプロジェクトをやるのも良いものです。ベアメタルに近いところで動くか、すべてのパスでコードカバレッジを取得するか、あるいは高速で柔軟な方法に最適化するか、根本的な「前提を無効にする」というやり方など、どのように現れるにせよ、楽しんでください。
## このプロジェクトは積極的にメンテナンスされていますか?
プロジェクトに対する積極的なサポートやメンテナンスは期待しないでください。新しい機能を追加したりバグを修正したりするために、自由にフォークしてください。小さなことについてはプルリクエストを送っても構いませんが、返信やトラブルシューティングの期待はしないでください。このリポジトリでの開発が活発に行われることは意図されていません。
## ファジラーがうまく動作しているかどうか、また他のファジラーと比較して測定しましたか?
Litefuzz の目的は、プラットフォーム間でバグを見つけることです。そして実際にそうしています。正直なところ、ファジラーXやファジラーYと比較する能力は重要視しませんでした。最初から特定のトレードオフが行われ、認識されていました。詳細は [#intro](https://github.com/sec-tools/litefuzz/blob/HEAD/README.md#intro) を参照してください。
## もし今日書き直すとしたら、何を変更しますか?
現在のままでも十分に動作し、さまざまなターゲットやシナリオでテストされています。とはいえ、よりモジュールベースでプラグインシステムに標準化することで、ターゲットやプラットフォームを切り替える際にコードの操作面で追加のチェックをあまり必要としないように改善できるでしょう。もちろん、より正式なテストや、サポートするオペレーティングシステム全体でテストするためのデプロイシステムがあれば、コア機能に変更を加える際により作業しやすい環境が作られるでしょう。このプロジェクトは、小規模ながら野心的なものから、すぐに少し大きなものへと成長しました。
## litefuzz の安定性はどの程度ですか?
コマンドライン、GUI、ネットワークファジング(主にLinuxとMac)、最小化などはかなり徹底的にテストされており、全体的にかなり安定しているはずです。隔離されたネットワークGUIファジング、Mac向けのReportCrashサポート、その他いくつかのニッチな機能など、よりエキゾチックな機能は実験的と見なすべきです。
## litefuzz でサポートされていないシナリオはありますか?
いくつかあります。しかし、そのほとんどはバグのある一般的でないシナリオか、正しく動作させるためにより多くの時間と研究を必要とするもの、あるいはプラットフォームに関連する理由でうまく動作しないものです。その多くは、そのようなオプションで実行しようとすると明示的に「サポートされていません」というメッセージとともに終了し、さまざまな機能を説明する際に上記のセクションでいくつかの注意事項が述べられています。より微妙なものとしては、隔離されたアプリでのリプレイモードはサポートされておらず、また隔離機能を使用したMacアプリでのテストは限られています。PyautoguiはLinuxとWindowsでは問題なく動作するようですが、Macではあまり信頼性が高くなかったため、機能的にサポートされていないと考えてください。Windowsでのクライアントファジングは、他のプラットフォームの他のモードよりも信頼性が低い場合があります。
あちこちにエッジケースがあるかもしれませんが、最も一般的なローカルおよびネットワークファジングのシナリオはテスト済みで動作しています。ああ、これらはクロスプラットフォームツールを作成する喜びです:やりがいはありますが、すべてを常に完璧に動作させるのは難しいです。全体的に、Linux/Macでのファジングはより安定しており、より多くの機能をサポートしているように見えます。特にネットワークファジングのテストがWindowsプラットフォームよりもはるかに多く行われているためですが、少なくとも基本はWin32でも利用できるように努力し、いくつかの追加機能もあります。
このファジラーをフォークして、そのような改善を行ったり、現在サポートされていない機能をサポートしたり、あるいはより小さな便利なものについてプルリクエストを送ることも自由にどうぞ。
## このプロジェクトまたはそのコードに対してどのような保証がありますか?
まったくありません。しかし、ファジングしてバグを手に入れるのを見るのはとても楽しいです。
## 著者 / 参考
- [Jeremy Brown](https://github.com/sec-tools/litefuzz/blob/HEAD/jbrown3264%5BNOSPAM%5Dgmail)
- [macOS Fuzzing のスライドデッキ](https://www.slideshare.net/JeremyBrown37/summer-of-fuzz-macos)