
PyJFuzz - Python JSON ファザー

PyJFuzzは、モバイルエンドポイントREST API、JSON実装、ブラウザ、CLI実行可能ファイルなど、JSON入力をファジングするための小さく拡張可能ですぐに使えるフレームワークです。
| バージョン | 1.1.0 |
|---|---|
| ホームページ | http://www.mseclab.com/ |
| GitHub | https://github.com/mseclab/PyJFuzz |
| 著者 | Daniele Linguaglossa (@dzonerzy) |
| ライセンス | MIT - (LICENSEファイルを参照) |
依存関係
PyJFuzzが動作するにはいくつかの依存関係が必要です:bottle,netifaces,GitPython,gramfuzz。自動のsetup.pyインストールからインストールできます。
インストール
PyJFuzzは以下のコマンドでインストールできます:
git clone https://github.com/mseclab/PyJFuzz.git && cd PyJFuzz && sudo python setup.py install
CLIツール
インストールすると、PyJFuzzはPythonライブラリとpjfと呼ばれるコマンドラインユーティリティの両方を作成します(下のスクリーンショット)
ライブラリ
PyJFuzzはライブラリとしても機能し、以下のようにプロジェクトにインポートできます:
from pyjfuzz.lib import *
クラス
利用可能なオブジェクト/クラスは以下の通りです:
例
以下はPyJFuzzを利用したプログラムの簡単な実装例です:
simple_fuzzer.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6))
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
custom_techniques.py
from argparse import Namespace
from pyjfuzz.lib import *
# テクニックはグループ、またはテクニック番号で定義できます
# グループはCHTPRSXです。それぞれの意味を理解するには、pyjfuzzを -h スイッチで実行するか、コマンドラインのスクリーンショットを参照してください
# 以下では、P グループ(Path Traversal)の攻撃のみを使用する設定オブジェクトを初期化します
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, techniques="P"))
# 設定オブジェクトが定義されたら、config.techniques にアクセスして選択されたテクニックを確認できます
print("Techniques IDs: {0}".format(str(config.techniques)))
# 必要に応じて変更することもできます!
config.techniques = [2]
# これにより、攻撃番号2(LFI攻撃)のみが実行されます
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
simple_server.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, debug=True, indent=True))
PJFServer(config).run()
時には、標準のカスタマイズ不可能な設定を変更する必要があるかもしれません。これは以下の方法で行えます:
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, indent=True))
print config.ports["servers"]["HTTP_PORT"] # 8080
print config.ports["servers"]["HTTPS_PORT"] # 8443
print config.ports["servers"]["TCASE_PORT"] # 8888
config.ports["servers"]["HTTPS_PORT"] = 443 # HTTPSポートを443に変更
注意: デフォルトポートを変更する場合、必要な権限による例外を常に処理する必要があります!
以下は、PJFConfigurationオブジェクトの利用可能なすべての設定/カスタマイズの包括的なリストです:
設定表
| 名前 | 型 | 説明 |
|---|---|---|
| json | dict | ファジングするJSONオブジェクト |
| json_file | str | JSONファイルへのパス |
| parameters | list<str> | ファジングするパラメータのリスト(JSONオブジェクトから取得) |
| techniques | str<int> | 有効な攻撃の文字列。ファジングされたJSONを生成するために使用されます(例:XSS、LFIなど)。つまり"CHPTRSX"(テクニック表を参照) |
| level | int | ファジングレベル(0~6の範囲) |
| utf8 | bool | trueの場合、Unicodeエンコードから純粋なバイト表現に切り替えます |
| indent | bool | 結果オブジェクトにインデントを付けるかどうかを設定します |
| url_encode | bool | 結果オブジェクトをURLエンコードするかどうかを設定します |
| strong_fuzz | bool | 強いファジングを使用するかどうかを設定します(強いファジングはJSON構造を維持せず、パーサーファジングに便利です) |
| debug | bool | デバッグ出力を有効にするかどうかを設定します |
| exclude | bool | parametersオプションで選択されたパラメータをファジングから除外します |
| notify | bool | クラッシュ発生時にプロセスモニターに通知するかどうかを設定します。PJFServerでのみ使用されます |
| html | str | PJFServer内で提供するHTMLディレクトリへのパス |
| ext_fuzz | bool | "command"のバイナリを外部ファザーとして使用するかどうかを設定します |
| cmd_fuzz | bool | "command"のバイナリをファザーターゲットとして使用するかどうかを設定します |
| content_type | str | PJFServerのコンテンツタイプの結果を設定します(デフォルトはapplication/json) |
| command | list<str> | 実行するコマンド。各パラメータはリスト要素です。pythonのshlex.splitを使用できます |
テクニック表
| インデックス | 説明 |
|---|---|
| 0 | XSSインジェクション (ポリグロット) |
| 1 | SQLインジェクション (ポリグロット) |
| 2 | LFI攻撃 |
| 3 | SQLインジェクションポリグロット (2) |
| 4 | XSSインジェクション (ポリグロット) (2) |
| 5 | RCEインジェクション (ポリグロット) |
| 6 | LFI攻撃 (2) |
| 7 | データURI攻撃 |
| 8 | LFIおよびHREF攻撃 |
| 9 | ヘッダーインジェクション |
| 10 | RCEインジェクション (ポリグロット) (2) |
| 11 | 汎用テンプレートインジェクション |
| 12 | Flaskテンプレートインジェクション |
| 13 | ランダム文字攻撃 |
以下は、PyJFuzzで何が期待できるかを示すスクリーンショットです
PyJFuzzにはPyJFuzz Web Fuzzerと呼ばれる組み込みツールが同梱されています。このツールはHTTPおよびHTTPSサーバーを介して自動ファジングコンソールを提供します。プロセス状態を制御できない場合でも、ほぼすべてのWebブラウザを簡単にファジングするために使用できます。
このツールを起動するための2つのスイッチがあります(--browser-auto と --fuzz-web)。1つ目はクラッシュ発生時にブラウザを自動的に再起動し、2つ目はブラウザがリクエストを送らなくなった場合をキャッチします。どちらも常にテストケースを保存します。以下にスクリーンショットを示します。