はまやんはまやんはまやん

hamayanhamayan's blog

Flag Jokes [NahamCon CTF 2020]

Want to hear a joke? Want the flag? How about both? Why don't YOU tell me a joke!
Note, it is recommended to clear your cookies for this challenge as some may have the same names used in other challenges.
ジョークが聞きたい?旗が欲しい?どちらもいかがですか?なぜあなたは私にジョークを教えてくれないのですか?
いくつかは、他の課題で使用されている同じ名前を持っている可能性があるので、この課題のためにクッキーをクリアすることをお勧めします。
Connect here:
http://jh2i.com:50010

ユーザー名を入れてログインする。
適当な名前を入れてログインしてみると、adminじゃないとflagは出てこないよと言われる。
cookieを消して、ユーザー名をadminにしてみるが、これはリジェクトされる。
他に変なところもないし、JWTをうまいこと偽装するしか無いのだけれど…うーん

解説を見た

https://www.youtube.com/watch?v=KUyuvnez0ks

なるほど。理屈はわかった。
動画になっているおかげで、どういう道具を使えばいいかも学ぶことができた。ありがたい。

JWKS Spoofing

ログイン時のJWTを見てみると、headerに見慣れないものが入っている。

{
  "alg": "RS256",
  "jku": "http://localhost:5000/static/jwks.json",
  "kid": "sqcE1a9gj9p08zNMR1MWbLLvuaPyUeJEsClBhy7Q4Jc"
}

jkuというのは、署名検証時のpublic key情報が書かれている文書へのURI
このファイルが存在しているっぽいので、/static/jwks.jsonを参照してみる。

{
    "keys": [
        {
            "e": "AQAB",
            "kid": "sqcE1a9gj9p08zNMR1MWbLLvuaPyUeJEsClBhy7Q4Jc",
            "kty": "RSA",
            "n": "1bVdpTILcGSahuOL6IJCbUpDZTGFHc8lzQORNLQBXDiRd1cC1k5cG41iR1TYh74cp8HYmoLXy4U2bp7GUFm0ip_qzCxcabUwWCxF07TGsmiFmCUbcQ6vbJvnSZSZGe-RFPgHxrVzHgQzepNIY2TmjgXyqt8HNuKBJQ6NoTviyxZUqy65KtSBfLYh5XzFn3FPemOla8kGBu7moSbUpgO1t3m3LgxBV5y51E1xSSoC7nAYPFrQ9wOTHEh7kGxGUQqKtGswyi2ncH22VcfQkxMA0HerFMPOr2n9eEZEbeJFco9Gp3drAYDCyj0QbkJKGdbl_50cimZ7eXgeyc3lEEXL7Q"
        }
    ]
}

RSAの公開鍵が記載されている。これを偽装しよう。
jwks.jsonをまずは用意しよう。
解説動画ではmkjwk - JSON Web Key Generatorが紹介されていて、とても便利。

f:id:hamayanhamayan:20200614112449p:plain

これで「Public Key」にjwkができたので、入れ替える。
Beeceptorを使って外部公開しておこう。
https://evilman.free.beeceptor.com/jwks.json

これで受け手は準備完了。
JWTを偽装しよう。

適当な名前でログインしてJWTを作ったら、jwt.ioで開く。
jkuを先ほど公開したものに変更して、usernameをadminに修正する。
署名であるが、mkjwkで得られるのはJWK形式のものなので、ここに入力できるようにPEM形式に変換する。
jwk to pem convertor, pem to jwk convert online, jwk openssl format pem
ここを使うといい。

f:id:hamayanhamayan:20200614112533p:plain

それでJWTが作れるので、これを戻すとフラグが出てくる。