認証に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オプションはありません。
結局 (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
ジョンは、このコミットの時点で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
あなたが投稿した内容によると、JWT全体を攻撃しているようですが、JTRはbase64をデコードして署名を分離するのに十分なほどスマートではないと思います。
JWTの仕組み:
ヘッダーがあります:
{"alg": "HS256"、 "typ": "JWT"}
彼らは主張している
{"sub": "1234567890"、 "name": "John Doe"、 "admin":true}
それらをbase64Urlでエンコードし、シークレットと組み合わせて次のようなものを取得します。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVAcrjjOcBjHcBjHcRjGrBjHcrHjMrCrHjMrHcRrGrMrEjMcEjBcHcMrEjc
ブルートフォースがこの文字列全体を攻撃しようとしているため、これに対するテストは良くありません。これは秘密ではありません。
より良い賭け:
JWTライブラリをダウンロードし、パーサー関数とRainbowテーブルを使用して、APIを使用している人々が、セキュリティのために辞書のWordを使用できるほど愚かであることを願っています。
たぶん、力ずくで打つこともできますが、力が強いとすごく長い時間座ってしまいます。