Shikata Ga Nai

Private? There is no such things.

JWT authentication bypass via weak signing keyをやってみた

Hello there, ('ω')ノ

 

弱い署名キーによる JWT 認証バイパスを。

 

JWT ベースのメカニズムを使用してセッションを処理して。
トークンの署名と検証の両方に、非常に弱い秘密鍵を使用して。
これは、一般的な秘密の単語リストを使用して簡単に力ずくで実行できて。
ラボを解決するには、まず Web サイトの秘密鍵を総当たり攻撃して。
これを取得したら、それを使用して、/admin の管理パネルへのアクセスを
許可する変更されたセッション トークンに署名し、carlos を削除して。
次の認証情報を使用して、自分のアカウントにログインできて。
 wiener/peter

 

まずは、ログインして。

 

 

 

リクエストをリピータへ。

 


/adminエンドポイントへのアクセスは権限がなく。

 

 

Cookieで識別しているようなので。

JWT をコピーし、シークレットをブルート フォースして。

ワードリストは、下記からコピーして作成して。


https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list

 

Hashcatを実行して、署名鍵を解読することに。

 

hashcat -a 0 -m 16500 eyJraWQiOiIyYzgxMGZlOS1hN2FiLTQ5ZTQtYjNjZC00NzlhNjJkNGYxMjMiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsInN1YiI6IndpZW5lciIsImV4cCI6MTY4MzQyMzg1MH0.9GvS7CscJVGmIiq4FvwTppPqnAr3vsptgv-Y11jw-lg jwt.secrets.list 

 

 

Burp Decoder を使用して、Base64 でエンコードして。


JWT Editor Keysタブで、New Symmetric Keyをクリックして。

ダイアログで [Generate] をクリックして、JWK 形式で新しいキーを生成して。

キー サイズは後で自動的に更新されるため、選択する必要はなく。

k プロパティの生成された値を Base64 でエンコードされたシークレットに

置き換えて。

 

 

ペイロードで、sub クレームの値をadministratorに変更して。

 

 

タブの下部にある [Sign] をクリックし、生成したキーを選択して。

[Don't modify header] オプションが選択されていることを確認し、[OK] を。  

これで、変更されたトークンは、正しい署名で署名されるようになって。

 

 

Sendすると管理パネルにアクセスできて。

 


carlosを削除するエンドポイントとパラメータを送信すると。

 

 

 

クリアできて。

 

 

Best regards, (^^ゞ