最近、侵入テストのスキルを練習し始め、WebGoatを使い始めました。
「認証バイパス」の章に行き、JWTトークンを解読しました。 WebGoatはこのJWTトークンを提示します。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJ0b21Ad2ViZ29hdC5jb20iLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQuY29tIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.vPe-qQPOt78zK8wrbN1TjNJj3Lex9Qbch6oo23RUJgM
ユーザー名をWebGoat
に変更して、新しいJWTトークンを送信するように求められます。つまり、ハッシュ関数が署名を生成している秘密を見つける必要があります。
それを行うために、WebGoatは次のコマンドでKali Linux 2018.4(vmwareプレーヤー仮想マシンで実行)を通じて実行しようとした、10000語のリストを含むHashCatを使用することをお勧めします。
$ hashcat -a 0 -m 1450 text.hash /root/wordlists/google-10000-english-master/google-10000-english.txt
残念ながら、私はこのエラーを受け取ります:
* Device #1: This device's constant buffer size is too small.
* Device #1: This device's local mem size is too small.
No devices found/left.
私はKali Linuxに4 GB RAMと4つのプロセッサーを搭載しました。
この段階を解決して次に進むだけです。Kaliにプリインストールされている他のプログラムを使用してもかまいません。HashCatよりも優れている場合は、教えてください。
また、ブルートフォーシングのために自分でコードを書いてもかまいませんが、インターネットで提供されているものほど効率的ではないと思います。
JWTトークンの構造
JWT Webサイト( https://jwt.io/introduction/ )で詳しく説明されているように、JWTトークンは、ドット(。)で区切られた3つの部分(ヘッダー、ペイロード、署名)で構成されています。ヘッダーとペイロードはどちらもBase64でエンコードされた文字列です。
したがって、JWTトークンは通常、次のようになります。Base64(Header).Base64(Payload).Signature
署名は、ヘッダーとペイロードの両方を使用して作成され、秘密鍵を使用して、ヘッダーで指定されたアルゴリズムを使用して署名を作成します。
JWT秘密鍵の検索
この課題を解決するために必要なことは、署名の作成に使用された秘密鍵を見つけることです。これは、ブルートフォース攻撃を使用して、ワードリストから、または純粋なブルートフォース攻撃を介して、さまざまな秘密鍵を使用して署名を計算することで実行できます。
ブルートフォース攻撃を実行してHashcatを使用して秘密鍵を見つけるために使用する正しい構文は次のとおりです。
Using a Wordlist:
$ hashcat -a0 -m 16500 text.hash [dict]
Pure Brute force attack:
$ hashcat -a3 -m 16500 text.hash
オプション-m 16500は、Hashcatを使用してJWTトークンをブルートフォースする正しいハッシュモードです。使用したもの(-m 1450)は生のHMAC-SHA256ハッシュ用で、文字列全体に適用されるため、エラーが発生します。
上記の方法は、特定のJWTトークンの秘密鍵を見つけるのにうまく機能しますが、WebGoatチャレンジをまだ解決できません。私はWebgoatチームに連絡して問題を理解し、この課題を解決しようとしています。返信があり次第アップデートを提供し、課題を解決します。