JWT Vulnerabilities (Json Web Tokens)
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
ハッキングキャリアに興味があり、ハッキング不可能なものをハッキングしたい方 - 私たちは採用しています! (流暢なポーランド語の読み書きが必要です)。
この記事の一部は素晴らしい投稿に基づいています: https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology JWTをペンテストするための素晴らしいツールの作者 https://github.com/ticarpi/jwt_tool
jwt_toolをAll Tests!
モードで実行し、緑のラインを待ちます。
運が良ければ、ツールはウェブアプリケーションがJWTを不正にチェックしているケースを見つけるでしょう:
その後、プロキシでリクエストを検索するか、jwt_ toolを使用してそのリクエストで使用されたJWTをダンプできます:
You can also use the Burp Extension SignSaboteurを使用して、BurpからJWT攻撃を実行できます。
署名をそのままにしてデータを改ざんし、サーバーが署名を確認しているかどうかをチェックできます。例えば、ユーザー名を「admin」に変更してみてください。
JWTの署名が検証されているかどうかを確認するには:
エラーメッセージが検証中を示唆している場合;詳細なエラーに含まれる機密情報を確認する必要があります。
返されたページの変更も検証を示しています。
変更がない場合は検証が行われていないことを示唆しています;この場合、ペイロードの主張を改ざんする実験を行うべきです。
トークンがサーバー側で生成されたのか、クライアント側で生成されたのかを、プロキシのリクエスト履歴を調べて判断することが重要です。
クライアント側から最初に見られたトークンは、キーがクライアント側のコードに露出している可能性があるため、さらなる調査が必要です。
サーバー側から発生したトークンは、安全なプロセスを示しています。
トークンが24時間以上持続するかどうかを確認してください...もしかしたら決して期限切れにならないかもしれません。「exp」フィールドがある場合、サーバーがそれを正しく処理しているかどうかを確認してください。
使用するアルゴリズムを「None」に設定し、署名部分を削除します。
Burp拡張機能「JSON Web Token」を使用して、この脆弱性を試し、JWT内の異なる値を変更します(リクエストをリピーターに送信し、「JSON Web Token」タブでトークンの値を変更できます。「Alg」フィールドの値を「None」に設定することもできます)。
アルゴリズムHS256は、秘密鍵を使用して各メッセージに署名し、検証します。 アルゴリズムRS256は、プライベートキーを使用してメッセージに署名し、公開鍵を認証に使用します。
アルゴリズムをRS256からHS256に変更すると、バックエンドコードは公開鍵を秘密鍵として使用し、その後HS256アルゴリズムを使用して署名を検証します。
次に、公開鍵を使用し、RS256をHS256に変更することで、有効な署名を作成できます。これを実行して、ウェブサーバーの証明書を取得できます:
攻撃者はトークンのヘッダーに新しい鍵を埋め込み、サーバーはこの新しい鍵を使用して署名を検証します (CVE-2018-0114)。
これは「JSON Web Tokens」Burp拡張機能を使用して行うことができます。 (リクエストをリピーターに送信し、JSON Web Tokenタブ内で「CVE-2018-0114」を選択してリクエストを送信します)。
この手順は、特に「jku」ヘッダー主張を使用するJWTトークンのセキュリティを評価する方法を詳述しています。この主張は、トークンの検証に必要な公開鍵を含むJWKS(JSON Web Key Set)ファイルにリンクする必要があります。
「jku」ヘッダーを持つトークンの評価:
「jku」主張のURLを確認して、適切なJWKSファイルにリンクしていることを確認します。
トークンの「jku」値を変更して、制御されたWebサービスに向け、トラフィックを観察できるようにします。
HTTPインタラクションの監視:
指定したURLへのHTTPリクエストを観察することで、サーバーが提供されたリンクから鍵を取得しようとしていることがわかります。
このプロセスでjwt_tool
を使用する際は、テストを容易にするために、jwtconf.ini
ファイルを個人のJWKSの場所で更新することが重要です。
jwt_tool
のコマンド:
次のコマンドを実行して、jwt_tool
でシナリオをシミュレートします:
オプションのヘッダー主張であるkid
は、特定の鍵を識別するために使用され、トークン署名の検証に複数の鍵が存在する環境では特に重要です。この主張は、トークンの署名を検証するために適切な鍵を選択するのに役立ちます。
ヘッダーにkid
主張が存在する場合、対応するファイルまたはそのバリエーションをウェブディレクトリで検索することが推奨されます。たとえば、"kid":"key/12345"
が指定されている場合、ファイル_/key/12345_および_/key/12345.pem_をウェブルートで検索する必要があります。
kid
主張は、ファイルシステムをナビゲートするために悪用される可能性があり、任意のファイルを選択できる可能性があります。特定のファイルやサービスをターゲットにするためにkid
値を変更することで、接続性をテストしたり、サーバーサイドリクエストフォージェリ(SSRF)攻撃を実行することが可能です。元の署名を保持しながらkid
値を変更するためにJWTを改ざんすることは、以下のように-T
フラグを使用してjwt_tool
で実行できます。
By targeting files with predictable content, it's possible to forge a valid JWT. For instance, the /proc/sys/kernel/randomize_va_space
file in Linux systems, known to contain the value 2, can be used in the kid
parameter with 2 as the symmetric password for JWT generation.
If the kid
claim's content is employed to fetch a password from a database, an SQL injection could be facilitated by modifying the kid
payload. An example payload that uses SQL injection to alter the JWT signing process includes:
non-existent-index' UNION SELECT 'ATTACKER';-- -
この変更により、JWT署名に既知の秘密鍵ATTACKER
が使用されることになります。
A scenario where the kid
parameter specifies a file path used within a command execution context could lead to Remote Code Execution (RCE) vulnerabilities. By injecting commands into the kid
parameter, it's possible to expose private keys. An example payload for achieving RCE and key exposure is:
/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&
jku stands for JWK Set URL. If the token uses a “jku” Header claim then check out the provided URL. This should point to a URL containing the JWKS file that holds the Public Key for verifying the token. Tamper the token to point the jku value to a web service you can monitor traffic for.
First you need to create a new certificate with new private & public keys
次に、例えば jwt.io を使用して、作成した公開鍵と秘密鍵を使用し、パラメータ jku を作成した証明書にポイントします。 有効な jku 証明書を作成するには、元の証明書をダウンロードし、必要なパラメータを変更できます。
公開証明書から "e" と "n" のパラメータを取得するには、次のようにします:
X.509 URL。PEM形式でエンコードされた一連のX.509(証明書フォーマット標準)公開証明書を指すURI。セット内の最初の証明書は、このJWTに署名するために使用されるものでなければなりません。次の証明書はそれぞれ前の証明書に署名し、証明書チェーンを完成させます。X.509はRFC 52807で定義されています。証明書を転送するには、トランスポートセキュリティが必要です。
このヘッダーをあなたの管理下にあるURLに変更して、リクエストが受信されるか確認してください。その場合、JWTを改ざんすることができるかもしれません。
あなたが管理する証明書を使用して新しいトークンを偽造するには、証明書を作成し、公開鍵と秘密鍵を抽出する必要があります:
その後、例えば jwt.io を使用して、作成した公開鍵と秘密鍵を使用し、パラメータ x5u を作成した .crt 証明書にポイントします。
これらの脆弱性の両方をSSRFに悪用することもできます。
このパラメータにはbase64形式の証明書が含まれる場合があります:
攻撃者が自己署名証明書を生成し、対応する秘密鍵を使用して偽造トークンを作成し、「x5c」パラメータの値を新しく生成した証明書に置き換え、他のパラメータ、つまり n、e、x5t を修正すれば、基本的に偽造トークンはサーバーによって受け入れられます。
JWTに次のシナリオのように埋め込まれた公開鍵がある場合:
次のnodejsスクリプトを使用すると、そのデータから公開鍵を生成することができます:
新しいプライベート/パブリックキーを生成し、新しいパブリックキーをトークン内に埋め込み、それを使用して新しい署名を生成することが可能です:
このnodejsスクリプトを使用して「n」と「e」を取得できます:
Finally, using the public and private key and the new "n" and "e" values you can use jwt.io to forge a new valid JWT with any information.
いくつかのアプリケーションがES256を使用し、同じノンスを使用して2つのJWTを生成する場合、プライベートキーを復元できます。
ここに例があります: ECDSA: 同じノンスを使用した場合のプライベートキーの明らかにする (SECP256k1使用)
JTI (JWT ID) クレームは、JWTトークンのユニークな識別子を提供します。これは、トークンのリプレイを防ぐために使用できます。 しかし、IDの最大長が4(0001-9999)である状況を想像してください。リクエスト0001と10001は同じIDを使用します。したがって、バックエンドが各リクエストでIDをインクリメントしている場合、これを悪用してリクエストをリプレイすることができます(各成功したリプレイの間に10000リクエストを送信する必要があります)。
クロスサービスリレー攻撃
いくつかのウェブアプリケーションがトークンの生成と管理のために信頼されたJWTサービスに依存していることが観察されています。JWTサービスによって1つのクライアントのために生成されたトークンが、同じJWTサービスの別のクライアントによって受け入れられた事例が記録されています。サードパーティサービスを介してJWTの発行または更新が観察された場合、同じユーザー名/メールを使用してそのサービスの別のクライアントにアカウントを登録する可能性を調査する必要があります。その後、取得したトークンをターゲットへのリクエストでリプレイして受け入れられるかどうかを確認する試みを行うべきです。
あなたのトークンが受け入れられる場合、重大な問題が示される可能性があり、任意のユーザーアカウントの偽装を許可する可能性があります。ただし、サードパーティアプリケーションにサインアップする場合、より広範なテストの許可が必要になる可能性があるため、これは法的なグレーゾーンに入る可能性があります。
トークンの有効期限チェック
トークンの有効期限は「exp」ペイロードクレームを使用してチェックされます。JWTはセッション情報なしで使用されることが多いため、慎重な取り扱いが必要です。多くの場合、他のユーザーのJWTをキャプチャしてリプレイすることで、そのユーザーのなりすましが可能になります。JWT RFCは、トークンの有効期限を設定するために「exp」クレームを利用してJWTリプレイ攻撃を軽減することを推奨しています。さらに、この値の処理と期限切れトークンの拒否を確実にするために、アプリケーションによる関連チェックの実装が重要です。トークンに「exp」クレームが含まれており、テストの時間制限が許可される場合、有効期限が過ぎた後にトークンを保存してリプレイすることが推奨されます。トークンの内容、タイムスタンプの解析および有効期限のチェック(UTCのタイムスタンプを含む)は、jwt_toolの-Rフラグを使用して読み取ることができます。
アプリケーションがトークンをまだ検証している場合、トークンが決して期限切れにならない可能性があるため、セキュリティリスクが存在する可能性があります。
If you are interested in hacking career and hack the unhackable - we are hiring! (fluent polish written and spoken required).
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)