
jwt_tool.py は、JWT (JSON Web Tokens) の検証、偽造、スキャン、改ざんを行うためのツールキットです。

主な機能は次のとおりです:
このツールは、使用中のトークンの強度と既知の攻撃に対する脆弱性を確認する必要があるペンテスター向けに作成されています。一部の JWT ライブラリに存在する潜在的な弱点をより詳しく調査するために、さまざまな改ざん・署名・検証オプションが用意されています。
現在、CTF が JWT を重視しているようであるため、CTF チャレンジャーにも効果的です。
また、プロジェクトで JWT を使用しているが、偽造トークンを使用したときの安定性や既知の脆弱性をテストしたい開発者にも役立つでしょう。
このツールは、一般的なライブラリを使用して Python 3 (バージョン 3.6+) でネイティブに作成されていますが、さまざまな暗号化機能 (および全体的な見やすさ・読みやすさ) には、いくつかの一般的な Python ライブラリのインストールが必要です。
(必要とする方のために、このツールの古い Python 2.x バージョンが legacy ブランチで利用可能ですが、これはもはやサポートまたは更新されません)
jwt_tool の推奨される使用方法は、公式 Dockerhub でホストされている jwt_tool Docker イメージ です。
これを実行するための基本コマンドは次のとおりです。
jwt_tool を実行するための基本コマンド:
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
上記のコマンドを使用すると、通常どおり他の引数を追加できます。
現在の作業ディレクトリ内のローカルファイルは Docker コンテナの /tmp ディレクトリにマッピングされるため、引数内ではその絶対パスを使用してファイルを利用できます。
例:
/tmp/localfile.txt
インストールは、jwt_tool.py ファイルをダウンロードするだけです (git clone でリポジトリをクローンしてもかまいません)。
($PATH に追加してどこからでも呼び出したい場合は、ファイルにも chmod を実行してください。)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
初回実行時に、ツールは設定ファイル、いくつかのユーティリティファイル、ログファイル、およびさまざまな形式の公開鍵と秘密鍵のセットを生成します。
jwtconf.ini 内に "jwkloc" 値として保存する必要があります。Windows の cmd/Powershell で色が正しく表示されない問題を修正するには、jwt_tool.py 内の次の2行のコメントを解除します (各行の先頭から "# " を削除します)。
また、colorama のインストールが必要です: python3 -m pip install colorama
# import colorama
# colorama.init()
最初の引数は JWT 自体である必要があります (ヘッダーまたは Cookie 値で提供する場合を除く)。追加の引数なしで実行すると、レビューのためにデコードされたトークン値が表示されます。
$ python3 jwt_tool.py <JWT>
または Docker 基本コマンド:
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
ツールキットはトークンを検証し、ヘッダーとペイロードの値を一覧表示します。
さまざまな追加引数を使用すると、対応する機能に直接移動し、テストですぐに使用できるトークンを返します。
たとえば、既存のトークンを改ざんするには、次のコマンドを実行します:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
多くのオプションでは、オプションを設定するための追加値が必要です。
たとえば、特定のタイプのエクスプロイトを実行するには、eXploit (-X) オプションを選択して脆弱性を選択する必要があります (ここでは alg:none エクスプロイトに "a" を使用しています):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
トークンの検証などの一部のオプションでは、追加のパラメータ/ファイルの指定が必要です (ここでは PEM 形式の公開鍵を指定しています):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
すべてのモードで、トークンをアプリケーションに直接送信できるようになりました。
指定する必要があるもの:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M erリクエストからのさまざまな応答が表示されます:
JWT 実装の基本的な評価を簡単に説明します。これらのオプションでうまくいかない場合は、他のモードやオプションを詳しく調べて、新しい脆弱性 (またはゼロデイ!) を探してください。
アプリケーションで期待されるクレーム/値を把握するためにトークン値を読み取ります:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
提供されたトークンをアプリケーションに直接使用して Playbook Scan を実行し、一般的な誤構成を探します:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
成功する脆弱性が見つかった場合は、関連するクレームを変更して悪用を試みます (ここでは Inject JWKS エクスプロイトを使用し、新しいユーザー名を注入しています):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
予期しない値やクレームをテストして予期しないアプリの動作を特定するか、プログラミングロジックやトークン処理に対する攻撃を実行して、さらに深く調査します:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -I -hc kid -hv custom_sqli_vectors.txt
ログを照会してリクエストと : に関する詳細を読み、成功した悪用をレビューします:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
オプションの一覧を表示するには、usage 関数を呼び出します:
トークンの検証などの一部のオプションでは、追加のパラメータ/ファイルの指定が必要です:
$ python3 jwt_tool.py -h
より詳細なユーザーガイドは wiki ページ にあります。

JWT とは何か、何をするか、そして脆弱性、一般的な弱点、意図しないコーディングエラーを徹底的にテストするための完全なワークフローについて詳しくは、JWT Attack Playbook をご覧ください。
Burp Search で JWT を見つけるための正規表現
('Case sensitive' と 'Regex' オプションがオンになっていることを確認してください)
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - URL セーフな JWT バージョン
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - すべての JWT バージョン (誤検知の可能性が高くなります)
JWT Attack Playbook (https://github.com/ticarpi/jwt_tool/wiki) - 徹底的な JWT テスト方法論について
このツールの最初のインスピレーションの多くは、Tim McLean 氏が発見した脆弱性に由来しています。
彼の JWT の弱点に関するブログはこちら: https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
JWT の脆弱性をテストするための演習は、Pentesterlab (https://www.pentesterlab.com) で多数提供されています。Web アプリのペンテストに興味があるなら、PRO サブスクリプションを強くお勧めします。
注意: このツールキットは、正しく使用すれば Pentesterlab の JWT 演習のほとんどを数秒で解決できますが、構造と弱点を自分で考えながら、これらの演習を自分でやり遂げることを強くお勧めします。結局のところ、学ぶことがすべてです...