web-dev-qa-db-ja.com

JWT署名のクラッキング

認証にJWTを使用するAPIをテストしています。このJWTには、変更を防ぐためのHS256署名があります。この署名で使用されている秘密鍵を特定すると、独自のJWTを作成できると考えました。 JWT署名の秘密鍵をクラックするにはどうすればよいですか?

Jmbo johnJWTサポート を使用しているようですが、機能しません。

$ ./john jwt.txt 
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

john --list=formatにはJWTオプションはありません。

10
Sjoerd

結局 (Python script を使用して PyJWT を使用してJWTを解析し、署名をチェックする)を書きました。

jwtbrute もあります。まだテストしていませんが、ループの外側でbase64デコードなどの多くの処理を行うため、スクリプトよりも少し効率的です。

John the Ripperを使用してJWTをクラックする場合は、それらの形式を次のように変換する必要があります。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEyMzQ1Njc4OTAsIm5hbWUiOiJKb2huIERvZSIsImFkbWluIjp0cnVlfQ#7a86835464c295175fc5465788fb377fc16624390313f5424055ea2b1a4bb2db

ご覧のとおり、最初の2つの部分は同じですが、署名はbase64ではなく16進数になりました。また、#ではなく.でデータから分離されます。変換を行うために 小さなスクリプト と書きました。

また、最新バージョンのjohnも必要です。 Kaliに付属するバージョンは機能しませんでしたが、 GitHubのバージョン は機能しました。

$ ./john ~/dev/crackjwt/jwt.john
Using default input encoding: UTF-8
Loaded 1 password hash (HMAC-SHA256 [password is key, SHA256 256/256 AVX2 8x])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
secret           (?)
1g 0:00:00:00 DONE 2/3 (2016-08-24 15:58) 6.666g/s 218453p/s 218453c/s 218453C/s 123456..skyline!
Use the "--show" option to display all of the cracked passwords reliably
Session completed
9
Sjoerd

ジョンは、このコミットの時点でJWTをネイティブでサポートしています https://github.com/magnumripper/JohnTheRipper/commit/85aa7b3e3f8204360683ddc5ec9734bf793d07cf (2015)。

したがって、現在変換を行うことなく、変換を行うことなく、pwファイルにJWTハッシュを置くことができます。

$ cat jwt.john 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYXNkZiJ9.GwJ7_ZrnpRLXXSBYzB9VkM4n7j2iSJEkdjhckeaXQ-U
$ john jwt.john
# Wait a few hours, then:
$ john --show jwt.john
1
thakis

あなたが投稿した内容によると、JWT全体を攻撃しているようですが、JTRはbase64をデコードして署名を分離するのに十分なほどスマートではないと思います。

JWTの仕組み:

ヘッダーがあります:

{"alg": "HS256"、 "typ": "JWT"}

彼らは主張している

{"sub": "1234567890"、 "name": "John Doe"、 "admin":true}

それらをbase64Urlでエンコードし、シークレットと組み合わせて次のようなものを取得します。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVAcrjjOcBjHcBjHcRjGrBjHcrHjMrCrHjMrHcRrGrMrEjMcEjBcHcMrEjc

ブルートフォースがこの文字列全体を攻撃しようとしているため、これに対するテストは良くありません。これは秘密ではありません。

より良い賭け:

JWTライブラリをダウンロードし、パーサー関数とRainbowテーブルを使用して、APIを使用している人々が、セキュリティのために辞書のWordを使用できるほど愚かであることを願っています。

たぶん、力ずくで打つこともできますが、力が強いとすごく長い時間座ってしまいます。

1
Shane Andrie